Приемник UDP только получает первое входящее сообщение - как продолжать получать дополнительные сообщения? - PullRequest
0 голосов
/ 22 октября 2019

Я пытаюсь создать простое приложение 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

Обратите внимание, что я проверяю отправку с локального хоста на себя - даже не отправляя по сети.

Спасибо за понимание.

...