Не получает все пакеты - Сокеты Visual Basic - Async - PullRequest
1 голос
/ 27 октября 2009

Вот код на стороне отправки моих сокетов:

    Private Sub Send(ByRef Buffer() As Byte)
        Dim obj_StateObject As New StateObject
        obj_StateObject.WorkSocket = m_tmpSocket
        m_tmpSocket.BeginSend(Buffer, 0, Buffer.Length, SocketFlags.None, New AsyncCallback(AddressOf OnClientSendComplete), obj_StateObject)
    End Sub

    Private Sub OnClientSendComplete(ByVal ar As IAsyncResult)
        Dim obj_SocketState As StateObject = CType(ar.AsyncState, StateObject)
        Dim obj_Socket As Socket = obj_SocketState.WorkSocket
    End Sub

Вот код получения:

    Private Sub OnServerDataArrival(ByVal ar As IAsyncResult)
        Dim obj_SocketState As StateObject = CType(ar.AsyncState, StateObject)
        Dim obj_Socket As Socket = obj_SocketState.WorkSocket
        Dim BytesRead As Integer = obj_Socket.EndReceive(ar)

        If (BytesRead > 0) Then
            Dim TempLength As Integer = BitConverter.ToInt32(obj_SocketState.Buffer, 0) - 4
            Dim TempBuffer(TempLength - 1) As Byte
            Array.Copy(obj_SocketState.Buffer, 4, TempBuffer, 0, TempLength)
            RaiseEvent ServerDataArrival(TMP_ID, TempBuffer)
        End If

        obj_Socket.BeginReceive(obj_SocketState.Buffer, 0, obj_SocketState.BufferSize, 0, New AsyncCallback(AddressOf OnServerDataArrival), obj_SocketState)
    End Sub

Я могу нормально отправлять и получать данные. Например, я могу послать 10-байтовый буфер одним нажатием кнопки, и проблем нет.

Однако, если я установлю эту кнопку для вызова функции, которая будет циклически отправлять 10-байтовый буфер 10 раз, я не получу в среднем около 8 буферов.

Что вызывает это? Код отправки выполняется 10 раз, но функция OnServerDataArrival выполняется только 2 раза.

1 Ответ

3 голосов
/ 27 октября 2009

Из предоставленного вами кода неясно, но я предполагаю, что вы передаете данные с использованием TCP (в отличие от UDP). Если это правда, не следует ожидать, что количество отправленных сообщений совпадет с количеством полученных. Если вам нужно такое поведение, используйте UDP вместо TCP.

При использовании TCP данные обычно буферизуются на стороне отправки до тех пор, пока «достаточный» объем данных не будет готов к отправке. Это обычно помогает повысить общую эффективность передачи, особенно при отправке сообщений размером до 10 байт за раз. На приемной стороне каждое чтение TCP-сокета считывает all данных из приемного буфера сокета до размера буфера, который вы предоставляете. Поэтому, если 8 из ваших 10-байтовых «сообщений» были получены, следующее чтение из сокета перетянет все эти данные в ваш буфер (при условии, что он достаточно большой). Вам нужно будет проанализировать ваш буфер, чтобы извлечь каждое сообщение из потока байтов. Отправка сообщения размером, как вам кажется, поможет вам сделать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...