Files
Pilz/Pilz.Networking/UDPManager.vb
2024-06-05 19:15:32 +02:00

92 lines
2.4 KiB
VB.net

Imports System.Net
Imports System.Net.Sockets
' Nicht gemergte Änderung aus Projekt "Pilz.Networking (net8.0-windows)"
' Vor:
' Imports System.Threading
' Imports Newtonsoft.Json.Linq
' Nach:
' Imports System.Threading
'
' Imports Newtonsoft.Json.Linq
Imports System.Threading
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