EndReceive Никогда не заканчивает прием vb Net

Я использую пример Microsoft (Visual Basic Net 4.5) для отправки и получения данных, но этот блок всегда верен:

    Private Sub OnRecieve(ByVal ar As IAsyncResult)
    Try
        Dim state As StateObject = CType(ar.AsyncState, StateObject)
        Dim client As Socket = state.workSocket

        ' Read data from the remote device.
        Dim bytesRead As Integer = client.EndReceive(ar)

        If bytesRead > 0 Then
            ' There might be more data, so store the data received so far.
            state.sb.Append(Encoding.ASCII.GetString(state.buffer, 0, bytesRead))

            '  Se supone que vuelve por los datos que faltan, pero no lo hace (Creo)
            client.BeginReceive(state.buffer, 0, state.BufferSize, 0, AddressOf OnRecieve, state)

        Else
            ' All the data has arrived; put it in response.
            If state.sb.Length > 1 Then
                VariablesGlobales.response = state.sb.ToString()
            End If
            ' Signal that all bytes have been received.
            receiveDone.Set()
        End If


    Catch ex As Exception
        'clientSocket.Close()
        RaiseEvent FallaAlRecibirDatos(ex.Message, "Falla en endReive.")
    End Try

End Sub

Но я отправляю и отправляю, и отправляю сообщение, короткое или большое, и оно никогда не входит в другое предложение. Вот мой начальный код:

Public Sub Conectar()

    clientSocket = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)

    Dim ipEndPoint As IPEndPoint = New IPEndPoint(Me.ipAddress, VariablesGlobales.Puerto)
    clientSocket.BeginConnect(ipEndPoint, New AsyncCallback(AddressOf OnConnect), clientSocket)

    ' Wait for connect.
    connectDone.WaitOne()

    EnviarDatosPersonales()

    ' Wait for send datas.
    sendDone.WaitOne()

    While True
        AvtivarEscuchador()
        receiveDone.WaitOne()

        DescifrarMsg(VariablesGlobales.response)
    End While
End Sub

Я получаю сообщения, которые отправляет сервер, и вижу их в пошаговых шагах Visual Studio, но я не знаю, почему он никогда не переходит в другие, то есть никогда не заканчивает получение данных.

Я прочитал ответ Марка Гравелла, но я предпочитаю пример кода, как решить эту проблему, я не знал, что делать.

Более того, я удалил "else", и он заполнил мой textBox многими белыми линиями, как бесконечный цикл из многих приемов. Пожалуйста, помогите мне. Благодарю.

О, извините, вот функция Escuchador:

Private Sub AvtivarEscuchador()

    ' Borramos los datos de respuesta anterior
    VariablesGlobales.response = ""

    ' Activamos el escuchador
    Try
        ' Create the state object.
        Dim state As New StateObject()
        state.workSocket = Me.clientSocket

        ' Begin receiving the data from the remote device.
        Me.clientSocket.BeginReceive(state.buffer, 0, state.BufferSize, 0, AddressOf OnRecieve, state)
    Catch e As Exception
        RaiseEvent FallaAlRecibirDatos("No se pudo activar el escuchador.", "Falla al intentar escuchar.")
    End Try

End Sub

1 ответ

Решение

Как вы уже ссылаетесь на ответ Марка Гравелла, его первое предложение в важном:

"EndReceive вполне может получить 0, если поток закрыт и все данные были использованы".

Пока поток открыт, вы никогда не получите 0 от EndReceive. Вы должны обработать полученные данные в соответствии с вашим протоколом, чтобы найти конец вашего сообщения и отправить ответ.

И, как вы просили некоторый код, вот ваш код с комментариями, где разместить дополнительные части:

If bytesRead > 0 Then
    ' There might be more data, so store the data received so far.
    state.sb.Append(Encoding.ASCII.GetString(state.buffer, 0, bytesRead))

    ' Put here code to check for protocol end (for example \0) in your buffer state.sb
    ' and handle protocol if found. The rest of the buffer should remain in the buffer
    ' as it could be part of the next protocol.

    ' if you only except one message, set receiveDone.Set() here if message received
    ' completely

    '  Se supone que vuelve por los datos que faltan, pero no lo hace (Creo)
    client.BeginReceive(state.buffer, 0, state.BufferSize, 0, AddressOf OnRecieve, state)

Else
    'connection was closed
    ' handle existing information if appropreate
    receiveDone.Set()
End If
Другие вопросы по тегам