Private WithEvents MyUDPServer As UDPServer
Private MySender As Socket
Private Sub btnStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStart.Click
Dim IPHostInfo As IPHostEntry
Dim i As Integer
MyUDPServer = New UDPServer(IPAddress.Any)
MyUDPServer.OnStart()
btnStart.Enabled = False
btnStop.Enabled = True
btnSend.Enabled = True
End Sub
Private Sub btnSend_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSend.Click
Dim lep As New IPEndPoint(IPAddress.Parse(Mid(cboSourceIP.Text, 1, InStr(cboSourceIP.Text, ":") - 1)), Mid(cboSourceIP.Text, InStr(cboSourceIP.Text, ":") + 1))
Dim msg As Byte() = Encoding.Unicode.GetBytes(txtSend.Text)
If MyUDPServer Is Nothing Then Exit Sub
'MySender.SendTo(msg, 0, msg.Length, SocketFlags.None, lep)
MyUDPServer.Send(msg, lep)
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
MySender = New Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)
MySender.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, 1)
End Sub
Private Sub btnStop_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStop.Click
Dim i As Integer
Private Sub MyUDPServer_ReceivedInfo(ByVal Info As String, ByVal SourceIP As String, ByVal SourcePort As Integer) Handles MyUDPServer.ReceivedInfo
Dim Index As Integer
Index = cboSourceIP.FindString(SourceIP)
If Index = -1 Then
cboSourceIP.SelectedIndex = cboSourceIP.Items.Add(SourceIP + ":" + Trim(Str(SourcePort)))
Else
cboSourceIP.SelectedIndex = Index
End If
txtReceiveInfo.AppendText(TimeString + ": " + Info)
txtReceiveInfo.AppendText(vbCrLf)
End Sub
End Class
Public Class UDPServer
Public Event ReceivedInfo(ByVal Info As String, ByVal SourceIP As String, ByVal SourcePort As Integer)
'运行侦听的线程
Private MyListenThread As System.Threading.Thread
'标识线程是否在运行
Private ListenThreadUsed As Boolean
'用于线程同步的通信
Private AllDone As New System.Threading.ManualResetEvent(False)
'侦听Socket
Private MyListen As Socket
'在定义侦听Socket时使用的相关对象
Private IPHostInfo As IPHostEntry
Private MyIPAddress As IPAddress
Private LocalEndPoint As IPEndPoint
'Socket端口号
Private UserPort As Integer = 2061 '用以发送和接收的UDP端口
Private RecBuffer(MAXMSGLEN) As Byte
Private SendBuffer(MAXMSGLEN) As Byte
Public Sub OnStart()
Dim i As Integer
MyListenThread.Start()
End Sub
Public Sub OnStop()
Dim i As Integer
Try
AllDone.Set()
'终止侦听线程
MyListenThread.Abort()
Do While ListenThreadUsed
If (MyListenThread.ThreadState And Threading.ThreadState.Stopped) = Threading.ThreadState.Stopped Then
ListenThreadUsed = False
End If
Loop
MyListenThread = Nothing
'关闭侦听Socket
MyListen.Close()
'终止所有的连接
'For i = 0 To MySockets.Length - 1
' If Not (MySockets(i).WorkSocket Is Nothing) Then
' If MySockets(i).WorkSocket.Connected Then MySockets(i).WorkSocket.Close()
' MySockets(i).Used = False
' End If
'Next
Catch ex As SocketException
MyListen = Nothing
ListenThreadUsed = False
For i = 0 To MySockets.Length - 1
MySockets(i).WorkSocket = Nothing
MySockets(i).Used = False
Next
MyListenThread = Nothing
End Try
End Sub
'侦听Socket的线程过程
Private Sub Listen()
Dim Sender As New IPEndPoint(IPAddress.Any, 36801)
Dim TempRemoteEP As EndPoint = CType(Sender, EndPoint)
ListenThreadUsed = True
Try
MyListen.Bind(LocalEndPoint)
While True
If (MyListen Is Nothing) Then
Exit While
End If
AllDone.Reset()
'开始响应异步连接
MyListen.BeginReceiveFrom(RecBuffer, 0, RecBuffer.Length, SocketFlags.None, TempRemoteEP, New AsyncCallback(AddressOf ReadCallback), MyListen)
'阻塞并等待信号
AllDone.WaitOne()
End While
Catch e As SocketException
Debug.WriteLine(e.ToString)
'MyListen = Nothing
'ListenThreadUsed = False
Catch e As ObjectDisposedException
Debug.WriteLine(e.ToString)
'MyListen = Nothing
'ListenThreadUsed = False
End Try
ListenThreadUsed = False
End Sub
'接收到客户端数据时的回调函数
Private Sub ReadCallback(ByVal ar As IAsyncResult)
Dim WorkSocket As Socket = CType(ar.AsyncState, Socket)
Dim i As Integer
Dim TempPassword(10) As Byte
Dim Sender As New IPEndPoint(IPAddress.Any, 0)
Dim TempRemoteEP As EndPoint = CType(Sender, EndPoint)
Dim RecString As String
Try
AllDone.Set()
Dim Handler As Socket = WorkSocket
Dim BytesRead As Integer = Handler.EndReceiveFrom(ar, TempRemoteEP)
Sender = TempRemoteEP
Dim BytesLen As Integer
'发送Socket数据时的回调函数
Private Sub SendCallback(ByVal ar As IAsyncResult)
Dim Handler As Socket = CType(ar.AsyncState, Socket)
Dim BytesSent As Integer = Handler.EndSendTo(ar)
AllDone.Set()
End Sub
Public Sub New(ByVal IPAdd As IPAddress)
'创建Socket侦听线程
MyListen = New Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)
MyListen.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, 1)
MyListenThread = New System.Threading.Thread(AddressOf Me.Listen)
MyListenThread.Name = "MyListenThread"
'创建侦听Socket
LocalEndPoint = New IPEndPoint(IPAdd, UserPort)
End Sub
End Class
Public Class Form1
Inherits System.Windows.Forms.Form
#Region " Windows 窗体设计器生成的代码 "
Public Sub New()
MyBase.New()
'该调用是 Windows 窗体设计器所必需的。
InitializeComponent()
'在 InitializeComponent() 调用之后添加任何初始化
End Sub
'窗体重写 dispose 以清理组件列表。
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub
'Windows 窗体设计器所必需的
Private components As System.ComponentModel.IContainer
'注意: 以下过程是 Windows 窗体设计器所必需的
'可以使用 Windows 窗体设计器修改此过程。
'不要使用代码编辑器修改它。
Friend WithEvents txtReceiveInfo As System.Windows.Forms.TextBox
Friend WithEvents btnStart As System.Windows.Forms.Button
Friend WithEvents btnStop As System.Windows.Forms.Button
Friend WithEvents Label1 As System.Windows.Forms.Label
Friend WithEvents btnSend As System.Windows.Forms.Button
Friend WithEvents txtSend As System.Windows.Forms.TextBox
Friend WithEvents cboSourceIP As System.Windows.Forms.ComboBox
Friend WithEvents Label2 As System.Windows.Forms.Label
<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
Me.txtReceiveInfo = New System.Windows.Forms.TextBox
Me.btnStart = New System.Windows.Forms.Button
Me.btnStop = New System.Windows.Forms.Button
Me.Label1 = New System.Windows.Forms.Label
Me.btnSend = New System.Windows.Forms.Button
Me.txtSend = New System.Windows.Forms.TextBox
Me.cboSourceIP = New System.Windows.Forms.ComboBox
Me.Label2 = New System.Windows.Forms.Label
Me.SuspendLayout()
'
'txtReceiveInfo
'
Me.txtReceiveInfo.Location = New System.Drawing.Point(16, 32)
Me.txtReceiveInfo.Multiline = True
Me.txtReceiveInfo.Name = "txtReceiveInfo"
Me.txtReceiveInfo.ReadOnly = True
Me.txtReceiveInfo.ScrollBars = System.Windows.Forms.ScrollBars.Vertical
Me.txtReceiveInfo.Size = New System.Drawing.Size(264, 184)
Me.txtReceiveInfo.TabIndex = 5
Me.txtReceiveInfo.Text = ""
Me.txtReceiveInfo.WordWrap = False
'
'btnStart
'
Me.btnStart.Location = New System.Drawing.Point(17, 240)
Me.btnStart.Name = "btnStart"
Me.btnStart.TabIndex = 2
Me.btnStart.Text = "启动接收"
'
'btnStop
'
Me.btnStop.Enabled = False
Me.btnStop.Location = New System.Drawing.Point(104, 240)
Me.btnStop.Name = "btnStop"
Me.btnStop.TabIndex = 3
Me.btnStop.Text = "停止接收"
'
'Label1
'
Me.Label1.Location = New System.Drawing.Point(16, 8)
Me.Label1.Name = "Label1"
Me.Label1.Size = New System.Drawing.Size(100, 16)
Me.Label1.TabIndex = 6
Me.Label1.Text = "接收到的消息:"
'
'btnSend
'
Me.btnSend.Enabled = False
Me.btnSend.Location = New System.Drawing.Point(290, 241)
Me.btnSend.Name = "btnSend"
Me.btnSend.TabIndex = 1
Me.btnSend.Text = "发送"
'
'txtSend
'
Me.txtSend.Location = New System.Drawing.Point(289, 195)
Me.txtSend.Name = "txtSend"
Me.txtSend.Size = New System.Drawing.Size(156, 21)
Me.txtSend.TabIndex = 0
Me.txtSend.Text = ""
'
'cboSourceIP
'
Me.cboSourceIP.Location = New System.Drawing.Point(288, 32)
Me.cboSourceIP.Name = "cboSourceIP"
Me.cboSourceIP.Size = New System.Drawing.Size(160, 20)
Me.cboSourceIP.TabIndex = 4
'
'Label2
'
Me.Label2.Location = New System.Drawing.Point(288, 8)
Me.Label2.Name = "Label2"
Me.Label2.Size = New System.Drawing.Size(104, 16)
Me.Label2.TabIndex = 7
Me.Label2.Text = "消息来源计算机:"
'
'Form1
'
Me.AcceptButton = Me.btnSend
Me.AutoScaleBaseSize = New System.Drawing.Size(6, 14)
Me.ClientSize = New System.Drawing.Size(451, 273)
Me.Controls.Add(Me.Label2)
Me.Controls.Add(Me.cboSourceIP)
Me.Controls.Add(Me.txtSend)
Me.Controls.Add(Me.btnSend)
Me.Controls.Add(Me.Label1)
Me.Controls.Add(Me.btnStop)
Me.Controls.Add(Me.btnStart)
Me.Controls.Add(Me.txtReceiveInfo)
Me.Name = "Form1"
Me.Text = "测试UDP-SSL"
Me.ResumeLayout(False)