ชุมชนคนรักภาษาเบสิค - Visual Basic Community

 ลืมรหัสผ่าน
 ลงทะเบียน
ค้นหา
ดู: 3889|ตอบกลับ: 0

[VB.NET] โค้ดการเชื่อมต่อ VPN (Virtual Private Network) และรักษาสถานะการเชื่อมต่อตามเวลาที่เรากำหนด

[คัดลอกลิงก์]

308

กระทู้

498

โพสต์

5973

เครดิต

ผู้ดูแลระบบ

ทองก้อน ทับทิมกรอบ

Rank: 9Rank: 9Rank: 9

เครดิต
5973



ว่าด้วยเรื่อง VPN หรือ (Virtual Private Network) แอดมินจะอธิบายแบบภาษาบ้านๆ คือ การเชื่อมโยงเครือข่ายภายใน (LAN - Local Area Network) ของเรา ลอดอุโมงค์หรือท่อที่ถูกสร้างขึ้นใหม่ ผ่านทางอินเทอร์เน็ต เพื่อเข้าไปเกาะกลุ่ม LAN อีกวงที่อยู่ระยะห่างไกลได้นั่นเอง ... วิธีการสร้าง VPN Server มีคนเขาอธิบายให้เยอะแยะแล้ว แอดมินจะให้ลิ้งค์เข้าไปอ่านดูก็แล้วกัน เช่น
การตั้งค่า VPN (PPTP) แบบ Client to Server บน Windows (มีวิธีการทำ Forward Port ของเน็ต 3BB) และ How to set up a VPN server on Windows 10 (ภาคภาษาอังกฤษ) ... แต่ปัญหาสำหรับ Windows 10 ก็คือ เครื่อง Client จะสามารถเชื่อมต่อเข้ามาได้เพียงทีละ 1 ท่อเท่านั้น หากเราต้องการจะให้มีหลาย Client เข้ามาพร้อมกันได้ ก็ต้องเปลี่ยนไปใช้ Windows Server หรือใช้ Mikrotik แทน อ่านวิธีทำ VPN แบบ PPTP โดยใช้ Mikrotik ...

วิธีการเชื่อมต่อด้วยโค้ด VB.NET ตามที่แอดมินได้เขียนโค้ดไว้ล่วงหน้า ก็จะใช้ 3 วิธีหลักๆ ดังนี้คือ
1. ใช้ Command Line ด้วย Rasdial.exe
2. ใช้ RasPhone
3. ใช้ DotRas (DLL File ของฟรี)

แต่วันนี้แอดมินจะขอนำเสนอวิธีการแรกก่อน เพราะมันง่ายดี และเราไม่จำเป็นต้องไปสร้าง VPN Client ใน Windows ขึ้นมาก่อน ... หลักการของโค้ด ก็คือ สร้าง Phonebook ในการจัดเก็บข้อมูลของการเชื่อมต่อ VPN เอาไว้ จากนั้นก็ทำการสร้าง Batch File เพื่อทำการรันคำสั่ง Rasdial.exe ด้วยการอ่านข้อมูลใน Phonebook อีกที ... ง่ายมั้ยล่ะข่ะรับ แต่ภายใต้ความง่ายนั้น เราจะมองไม่เห็น Error ที่เกิดขึ้นในการเชื่อมต่อ ซึ่งจะไปว่ากันต่อในตอนหน้า

ตัวอย่างของข้อมูลที่อยู่ใน Phonebook ... เราสามารถใช้ Notepad เปิดดูได้เลย  
  1. [VPN]
  2. MEDIA=rastapi
  3. Port=VPN2-0
  4. Device=WAN Miniport (IKEv2)
  5. DEVICE=vpn
  6. PhoneNumber=vpndemo
  7. PreviewUserPw=0
คัดลอกไปที่คลิปบอร์ด

เมื่อทำการติดต่อ VPN (กดปุ่ม Connect) ก็จะเกิดการรันคำสั่ง Rasdial.exe ...


โค้ดในการนับเวลาถอยหลังแบบชั่วโมง-นาที-วินาที ... การเขียนโค้ดเข้าช่วยโดยไม่ใช้คำสั่งสำเร็จรูป หรือคำสั่งภายใน จะช่วยให้เราเร่งเวลาการทำงานให้เร็วขึ้นได้ ด้วยการปรับช่วงเวลา หรือ Interval ของ Timer นั่นเอง เพราะเวลาทำการทดสอบ จะได้ไม่ต้องมานั่งนับเวลาลงตาม Timer แบบเป๊ะๆ เช่น ตั้งการนับถอยหลังลงทุกๆ 10 นาที กว่าจะทดสอบแต่ละครั้งได้นี่ แหม กินเวลานานเกินไปครับ ...
  1.     ' / --------------------------------------------------------------------
  2.     '// การนับถอยหลังโดยคำนวณค่าเวลาแบบชั่วโมง นาที และ วินาที
  3.     Private Function CountDownTime() As String
  4.         'Dim HH As String    '<< ชั่วโมง
  5.         Dim MM As String    '<< นาที
  6.         Dim SS As String    '<< วินาที
  7.         '// 1 ชั่วโมง = 3600 วินาที
  8.         'HH = TimeCount \ 3600

  9.         '// การ Mod ด้วย 3600 ก็คือ 60 นาทีมีค่าเท่ากับ 3600 วินาที (การนับรวมชั่วโมง)
  10.         '// การหารตัดเศษ \ ด้วย 60 คือต้องการแสดงผลในรูปแบบนาที
  11.         MM = (TimeCounter Mod 3600) \ 60

  12.         '// การ Mod ด้วย 60 (ค่าวินาที) จะทำให้ค่าสูงสุดอยู่ที่ 59 วินาที
  13.         SS = (TimeCounter Mod 60)
  14.         '// แสดงผล
  15.         'HH = Microsoft.VisualBasic.Right("00" & HH, 2)
  16.         MM = Microsoft.VisualBasic.Right("00" & MM, 2)
  17.         SS = Microsoft.VisualBasic.Right("00" & SS, 2)
  18.         'Return HH & ":" & MM & ":" & SS
  19.         '// เอาเฉพาะนาที-วินาที
  20.         Return MM & ":" & SS
  21.     End Function
คัดลอกไปที่คลิปบอร์ด

มาดูโค้ดฉบับเต็มกันเถอะ ...
  1. ' / --------------------------------------------------------------------
  2. ' / Developer : Mr.Surapon Yodsanga (Thongkorn Tubtimkrob)
  3. ' / eMail : thongkorn@hotmail.com
  4. ' / URL: http://www.g2gnet.com (Khon Kaen - Thailand)
  5. ' / Facebook: https://www.facebook.com/g2gnet (For Thailand)
  6. ' / Facebook: https://www.facebook.com/commonindy (Worldwide)
  7. ' / More: http://www.g2gnet.com/webboard
  8. ' /
  9. ' / Purpose: Connect VPN (Virtual Private Network) and Re-Connect it.
  10. ' / Microsoft Visual Basic .NET (2010)
  11. ' /
  12. ' / This is open source code under @CopyRight by Thongkorn Tubtimkrob.
  13. ' / You can not distribute this code for free. Without the consent of the developer.
  14. ' / --------------------------------------------------------------------

  15. Imports System.Net

  16. Public Class frmVPNClient
  17.     '// การนับเวลา
  18.     Private TimeCounter As Integer

  19.     '// กำหนดให้แสดงหรือซ่อน DOS Screen
  20.     Dim blnStart As Boolean = True

  21.     '// กำหนด Path ของ Batch File
  22.     Dim strVpn As String = MyPath(Application.StartupPath)
  23.     '// ค่าคงที่ของชื่อโฟลเดอร์
  24.     Const strFolder As String = "MyVPN"

  25.     ' / --------------------------------------------------------------------
  26.     ' / Start Connect
  27.     Private Sub btnConnect_Click(sender As Object, e As EventArgs) Handles btnConnect.Click
  28.         '// หากไม่พบไดเรคตอรี่ ให้สร้าง Directory (Folder นั่นแหละ) ขึ้นมาใหม่
  29.         If Not IO.Directory.Exists(strVpn & strFolder) Then
  30.             IO.Directory.CreateDirectory(strVpn & strFolder)
  31.         End If
  32.         '// RASDIAL
  33.         'https://docs.microsoft.com/en-us/previous-versions/orphan-topics/ws.10/dd450369(v=ws.10)
  34.         '// Create PhoneBook (pbk extension)
  35.         IO.File.WriteAllText( _
  36.                 ( _
  37.                 strVpn & strFolder & "\connection.pbk"), _
  38.                 "[VPN]" & vbNewLine & _
  39.                 "MEDIA=rastapi" & vbNewLine & _
  40.                 "Port=VPN2-0" & vbNewLine & _
  41.                 "Device=WAN Miniport (IKEv2)" & vbNewLine & _
  42.                 "DEVICE=vpn" & vbNewLine & _
  43.                 "PhoneNumber=" & txtHost.Text _
  44.                 )

  45.         '// Create BAT File เพื่อให้รันคำสั่ง Rasdial และใช้ข้อมูลใน Phonebook
  46.         IO.File.WriteAllText( _
  47.                 ( _
  48.                 strVpn & strFolder & "\connection.bat"), _
  49.                 "rasdial ""VPN"" " & _
  50.                 txtUserName.Text & " " & _
  51.                 txtPassword.Text & " /phonebook:" & """" & _
  52.                 strVpn & strFolder & "\connection.pbk" & """" _
  53.                 )

  54.         Try
  55.             Dim connect As System.Diagnostics.Process
  56.             connect = New System.Diagnostics.Process()
  57.             connect.StartInfo.FileName = strVpn & strFolder & "\connection.bat"
  58.             '// หาก Start Program กำหนดให้ blnStart = True
  59.             If blnStart Then
  60.                 connect.StartInfo.WindowStyle = ProcessWindowStyle.Normal
  61.             Else
  62.                 '// หากทำการ Re-Connect ให้ซ่อนหน้าจอ DOS
  63.                 connect.StartInfo.WindowStyle = ProcessWindowStyle.Hidden
  64.             End If
  65.             '//
  66.             connect.Start()
  67.             connect.WaitForExit()
  68.             btnConnect.Enabled = False
  69.             btnDisconnect.Enabled = True
  70.             'MessageBox.Show("Connect VPN already.")
  71.             lblCounterTimer.Text = "00:00"

  72.             '// TEST
  73.             'Timer1.Interval = 50    '<-- ไว้ทดสอบเพราะจะนับเร็วมาก
  74.             'TimeCounter = 60 '<-- 60 วินาทีไว้ทดสอบ
  75.             '// 1000 ms = 1 Sec. (ตอนทดสอบตั้งค่าไว้สัก 50 จะทำให้เร็วขึ้น)
  76.             Timer1.Interval = 1000
  77.             '// นำค่า 2 หลักแรกใน ComboBox มาคูณ 60
  78.             TimeCounter = Val(Microsoft.VisualBasic.Left(cmbTimer.Text, 2)) * 60
  79.             Timer1.Start()
  80.             cmbTimer.Enabled = False
  81.             connect.Dispose()

  82.         Catch ex As Exception
  83.             MessageBox.Show(ex.Message)
  84.         End Try
  85.     End Sub

  86.     ' / --------------------------------------------------------------------
  87.     '// นับเวลาถอยหลัง
  88.     Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
  89.         If TimeCounter > 0 Then
  90.             TimeCounter -= 1
  91.             lblCounterTimer.Text = CountDownTime()
  92.         Else
  93.             Timer1.Enabled = False
  94.             '// TEST
  95.             'TimeCounter = 60 '<-- 60 วินาทีไว้ทดสอบ
  96.             TimeCounter = Val(Microsoft.VisualBasic.Left(cmbTimer.Text, 2)) * 60
  97.             Timer1.Start()
  98.             '//MsgBox("Time Out.", vbOKOnly + vbInformation, "Report Status")
  99.             lblCounterTimer.Text = "00:00"
  100.             '// เวลา Re-Connect ทุกๆครั้งจะได้ไม่ต้องแสดงผลหน้าจอ DOS
  101.             blnStart = False
  102.             '// กลับไปสั่งให้ Re-Connect อีกรอบ
  103.             Call btnConnect_Click(sender, e)
  104.         End If
  105.     End Sub

  106.     ' / --------------------------------------------------------------------
  107.     '// การนับถอยหลังโดยคำนวณค่าเวลาแบบชั่วโมง นาที และ วินาที
  108.     Private Function CountDownTime() As String
  109.         'Dim HH As String    '<< ชั่วโมง
  110.         Dim MM As String    '<< นาที
  111.         Dim SS As String    '<< วินาที
  112.         '// 1 ชั่วโมง = 3600 วินาที
  113.         'HH = TimeCount \ 3600

  114.         '// การ Mod ด้วย 3600 ก็คือ 60 นาทีมีค่าเท่ากับ 3600 วินาที (การนับรวมชั่วโมง)
  115.         '// การหารตัดเศษ \ ด้วย 60 คือต้องการแสดงผลในรูปแบบนาที
  116.         MM = (TimeCounter Mod 3600) \ 60

  117.         '// การ Mod ด้วย 60 (ค่าวินาที) จะทำให้ค่าสูงสุดอยู่ที่ 59 วินาที
  118.         SS = (TimeCounter Mod 60)
  119.         '// แสดงผล
  120.         'HH = Microsoft.VisualBasic.Right("00" & HH, 2)
  121.         MM = Microsoft.VisualBasic.Right("00" & MM, 2)
  122.         SS = Microsoft.VisualBasic.Right("00" & SS, 2)
  123.         'Return HH & ":" & MM & ":" & SS
  124.         '// เอาเฉพาะนาที-วินาที
  125.         Return MM & ":" & SS
  126.     End Function

  127.     ' / --------------------------------------------------------------------
  128.     ' / ตัดการเชื่อมต่อ
  129.     Private Sub btnDisConnect_Click(sender As Object, e As EventArgs) Handles btnDisconnect.Click
  130.         IO.File.WriteAllText((strVpn & strFolder & "\disconnect.bat"), "rasdial/d")
  131.         Dim connect As System.Diagnostics.Process
  132.         connect = New System.Diagnostics.Process()
  133.         connect.StartInfo.FileName = strVpn & strFolder & "\disconnect.bat"
  134.         connect.StartInfo.WindowStyle = ProcessWindowStyle.Normal
  135.         '//
  136.         connect.Start()
  137.         connect.WaitForExit()
  138.         btnConnect.Enabled = True
  139.         btnDisconnect.Enabled = False
  140.         '//
  141.         Timer1.Enabled = False
  142.         lblCounterTimer.Text = "00:00"
  143.         cmbTimer.Enabled = True
  144.         blnStart = True
  145.     End Sub

  146.     Private Sub frmVPNClient_FormClosed(sender As Object, e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
  147.         '// จะปิดหรือค้าง Connection เอาไว้ก็เลือกเอาครับ
  148.         'Call btnDisConnect_Click(sender, e)
  149.         '//
  150.         Me.Dispose()
  151.         Application.Exit()
  152.     End Sub

  153.     Private Sub frmVPNConnector_Load(sender As Object, e As System.EventArgs) Handles Me.Load
  154.         txtHost.Text = "YOUR HOST"
  155.         txtUserName.Text = "USERNAME"
  156.         txtPassword.Text = "PASSWORD"
  157.         '//
  158.         lblCounterTimer.Text = ""
  159.         With cmbTimer
  160.             .Items.Add("10 นาที")
  161.             .Items.Add("20 นาที")
  162.             .Items.Add("30 นาที")
  163.             .Items.Add("40 นาที")
  164.             .Items.Add("50 นาที")
  165.             .Items.Add("60 นาที")
  166.         End With
  167.         cmbTimer.SelectedIndex = 0
  168.         lblCounterTimer.Text = "00:00"
  169.     End Sub

  170.     Private Sub cmbTimer_KeyDown(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles cmbTimer.KeyDown
  171.         If e.KeyCode = 13 Then
  172.             e.Handled = True
  173.             SendKeys.Send("{TAB}")
  174.         End If
  175.     End Sub

  176.     Private Sub txtHost_KeyPress(sender As Object, e As System.Windows.Forms.KeyPressEventArgs) Handles txtHost.KeyPress
  177.         If e.KeyChar = Chr(13) Then
  178.             e.Handled = True
  179.             SendKeys.Send("{TAB}")
  180.         End If
  181.     End Sub

  182.     Private Sub txtPassword_KeyPress(sender As Object, e As System.Windows.Forms.KeyPressEventArgs) Handles txtPassword.KeyPress
  183.         If e.KeyChar = Chr(13) Then
  184.             e.Handled = True
  185.             SendKeys.Send("{TAB}")
  186.         End If
  187.     End Sub

  188.     Private Sub txtUserName_KeyPress(sender As Object, e As System.Windows.Forms.KeyPressEventArgs) Handles txtUserName.KeyPress
  189.         If e.KeyChar = Chr(13) Then
  190.             e.Handled = True
  191.             SendKeys.Send("{TAB}")
  192.         End If
  193.     End Sub

  194.     ' / --------------------------------------------------------------------------------
  195.     ' / Get my project path
  196.     ' / AppPath = C:\My Project\bin\debug
  197.     ' / Replace "\bin\debug" with ""
  198.     ' / Return : C:\My Project\
  199.     Function MyPath(ByVal AppPath As String) As String
  200.         '/ MessageBox.Show(AppPath);
  201.         AppPath = AppPath.ToLower()
  202.         '/ Return Value
  203.         MyPath = AppPath.Replace("\bin\debug", "").Replace("\bin\release", "").Replace("\bin\x86\debug", "").Replace("\bin\x86\release", "")
  204.         '// If not found folder then put the \ (BackSlash) at the end.
  205.         If Microsoft.VisualBasic.Right(MyPath, 1) <> "" Then MyPath = MyPath & ""
  206.     End Function

  207. End Class
คัดลอกไปที่คลิปบอร์ด

ดาวน์โหลดโค้ดต้นฉบับแบบเต็ม VB.NET (2010) ได้ที่นี่ ...

ขออภัย! โพสต์นี้มีไฟล์แนบหรือรูปภาพที่ไม่ได้รับอนุญาตให้คุณเข้าถึง

คุณจำเป็นต้อง ลงชื่อเข้าใช้ เพื่อดาวน์โหลดหรือดูไฟล์แนบนี้ คุณยังไม่มีบัญชีใช่ไหม? ลงทะเบียน

x
สิ่งที่ดีกว่าการให้ คือการให้แบบไม่มีที่สิ้นสุด
ขออภัย! คุณไม่ได้รับสิทธิ์ในการดำเนินการในส่วนนี้ กรุณาเลือกอย่างใดอย่างหนึ่ง ลงชื่อเข้าใช้ | ลงทะเบียน

รายละเอียดเครดิต

ข้อความล้วน|อุปกรณ์พกพา|ประวัติการแบน|G2GNet.com  

GMT+7, 2024-3-29 12:44 , Processed in 0.189979 second(s), 4 queries , File On.

Powered by Discuz! X3.4, Rev.62

Copyright © 2001-2020 Tencent Cloud.

ตอบกระทู้ ขึ้นไปด้านบน ไปที่หน้ารายการกระทู้