Я пытаюсь создать простое приложение Windows Forms на VB.net (.net Framework 2.0 для поддержки Windows XP), которое позволяет нескольким клиентским ПК отправлять короткие текстовые строки в виде сообщений UDP на прослушивающий «сервер».
Серверная часть должна прослушивать асинхронно и отображать полученный текст от каждого клиента по мере его поступления.
Мой код не может использовать более новую функцию ReceiveAsync (), поскольку она должна поддерживать XP итаким образом, должен быть построен на .net Framework 2.0, который не поддерживает эти функции Async, поэтому я использую функцию BeginReceive () и передаю обратный вызов.
Он отлично работает для first входящее UDP-сообщение, но проблема в том, что дополнительные сообщения не принимаются. Даже если я отправляю одно и то же сообщение дважды, ничего не выводится после получения первого входящего сообщения. Как будто слушатель игнорирует что-либо после первого сообщения или как будто он завис в неправильном состоянии. Существует ли какая-то процедура «сброса», которую необходимо выполнять на прослушивателе UDP после каждого входящего сообщения, чтобы оно прослушивало дальнейшие входящие данные? (Примечание: исключений не возникает)
Вот мой код слушателя:
Private Sub btnListen_Click(sender As Object, e As EventArgs) Handles btnListen.Click
Dim state As New UdpState
listener = New UdpClient(CInt(txtListenPort.Text)) ' Create UDP client on specified port (all interfaces)
'Async receive data:
Dim ip As System.Net.IPAddress = System.Net.Dns.GetHostEntry("localhost").AddressList(0)
state.udpClient = listener
state.ipEndPoint = New Net.IPEndPoint(ip, CInt(txtListenPort.Text))
Dim callback As AsyncCallback
callback = AddressOf rx
listener.BeginReceive(callback, state)
lblListenStatus.Text = "Listening..."
End Sub
Shared Sub rx(result As IAsyncResult)
Dim r As UdpState = result.AsyncState
Dim endpt As System.Net.IPEndPoint = r.ipEndPoint
Dim client As UdpClient = r.udpClient
Dim bytes() As Byte
bytes = client.EndReceive(result, endpt)
Dim s As String = System.Text.Encoding.ASCII.GetString(bytes)
Debug.Print("Received string = " & s)
End Sub
Private Class UdpState
Public ipEndPoint As System.Net.IPEndPoint
Public udpClient As System.Net.Sockets.UdpClient
End Class
А вот код, который я использую для отправки данных в эту конечную точку сокета:
Private Sub btnSend_Click(sender As Object, e As EventArgs) Handles btnSend.Click
Dim send As New UdpClient
Dim s As String = txtSendMessage.Text
Dim b_len As Integer = System.Text.Encoding.ASCII.GetByteCount(s)
Dim b() As Byte
ReDim b(b_len)
b = System.Text.Encoding.ASCII.GetBytes(s) 'Convert text to bytes.
send.Send(b, b_len, txtSendIP.Text, CInt(txtSendPort.Text)) 'Blocking SEND.
send.Close()
End Sub
Обратите внимание, что я проверяю отправку с локального хоста на себя - даже не отправляя по сети.
Спасибо за понимание.