86 lines
2.2 KiB
VB.net
86 lines
2.2 KiB
VB.net
Imports System.IO
|
|
Imports System.Net
|
|
Imports System.Net.NetworkInformation
|
|
Imports System.Net.Sockets
|
|
Imports System.Threading
|
|
Imports Newtonsoft.Json.Linq
|
|
|
|
Public Class UDPManager
|
|
Inherits ConnectionManagerBase
|
|
|
|
Private ReadOnly client As UdpClient
|
|
Private listenTask As Task = Nothing
|
|
Private ReadOnly cancelTokenSource As New CancellationTokenSource
|
|
Private ReadOnly cancelToken As CancellationToken = cancelTokenSource.Token
|
|
Public ReadOnly Property MaxBufferSize As Integer = 8192
|
|
|
|
Public Sub New(port As Integer)
|
|
MyBase.New(port)
|
|
client = New UdpClient(port)
|
|
End Sub
|
|
|
|
Protected Overrides Sub Finalize()
|
|
MyBase.Finalize()
|
|
client.Client.Shutdown(SocketShutdown.Both)
|
|
client.Close()
|
|
End Sub
|
|
|
|
Public Overrides Sub Start()
|
|
If Not IsListening Then
|
|
StartInternal()
|
|
End If
|
|
End Sub
|
|
|
|
Private Sub StartInternal()
|
|
IsListening = True
|
|
listenTask = Task.Run(
|
|
Sub()
|
|
Try
|
|
RetriveAnyData(cancelToken)
|
|
Catch ex As Exception
|
|
IsListening = False
|
|
End Try
|
|
End Sub)
|
|
End Sub
|
|
|
|
Public Overrides Sub [Stop]()
|
|
If IsListening Then
|
|
IsListening = False
|
|
cancelTokenSource.Cancel()
|
|
listenTask.Wait()
|
|
End If
|
|
End Sub
|
|
|
|
Protected Overrides Function GetBufferSize() As Integer
|
|
Return MaxBufferSize
|
|
End Function
|
|
|
|
Private Sub RetriveAnyData(ct As CancellationToken)
|
|
Dim doExit = Sub() ct.ThrowIfCancellationRequested()
|
|
Dim receiveTask As Task(Of UdpReceiveResult) = client.ReceiveAsync()
|
|
|
|
'Wait for the data and cancel if requested
|
|
receiveTask.Wait(ct)
|
|
|
|
Dim buf As Byte() = receiveTask.Result.Buffer
|
|
Dim ip As String = receiveTask.Result.RemoteEndPoint.Address.ToString
|
|
|
|
doExit()
|
|
|
|
ProcessRetrivedData(ip, buf)
|
|
|
|
doExit()
|
|
|
|
StartInternal()
|
|
End Sub
|
|
|
|
Protected Overrides Sub SendData(ep As IPEndPoint, buf As Byte())
|
|
Dim udp As New UdpClient
|
|
udp.Connect(ep)
|
|
udp.Send(buf, buf.Length)
|
|
udp.Client.Shutdown(SocketShutdown.Both)
|
|
udp.Close()
|
|
End Sub
|
|
|
|
End Class
|