Socket.Receive сбрасывает последний байт каждого пакета - PullRequest
0 голосов
/ 11 ноября 2010

У меня проблемы с клиентским приложением сокета, написанным на vb.net с использованием Visual Studio 2005. Клиент подключается к серверу сокета языка C, работающему в OpenVMS.У меня проблема в том, что когда сервер отправляет пакет, клиент не получает последний байт (каждого пакета!).Я могу сбросить пакеты в сети, и данные все там.Мое текущее решение состоит в том, чтобы мои сокетные сообщения были короткими (247 байт) и отправляли один дополнительный байт после конца моих данных.

Я хотел бы включить больше информации в свои сообщения и не могу найти способ сделатьэта работа.Если бы я знал на 100%, как долго пакеты будут находиться в сети, я мог бы обойти это, включив дополнительный байт только в нужных местах.Однако я не хочу делать какие-либо предположения о длине пакетов.

У кого-нибудь есть какие-либо предложения относительно того, как лучше всего решить эту проблему?

Вот примермой клиент получает код:

Private Sub ReceiveMsg()
    Dim nTotalBytes As Integer
    Dim nNumBytes As Integer
    Dim nMsgType As Short
    Dim nMsgLen As Short
    Dim ind As Integer

    Try
        nNumBytes = -1
        While (nNumBytes <> 0)

            nTotalBytes = 0
            RecvBuffer.Initialize()

            nNumBytes = ClientSocket.Receive(RecvBuffer, nTotalBytes, 4, SocketFlags.None)
            If nNumBytes > 3 Then
                SyncLock ClientSocket
                    AppendText("")
                    AppendText("Message Received " & Str(nNumBytes) & " Bytes")
                    nTotalBytes = nTotalBytes + nNumBytes
                    nMsgType = BitConverter.ToInt16(RecvBuffer, 0)
                    nMsgLen = BitConverter.ToInt16(RecvBuffer, 2)
                    If nMsgLen > 8191 Then
                        AppendText(" Error - Message length invalid: " & Str(nMsgLen))
                        nMsgLen = 250
                    End If

                    While (nTotalBytes < nMsgLen And nNumBytes > 0)
                        nNumBytes = ClientSocket.Receive(RecvBuffer, nTotalBytes, (nMsgLen - nTotalBytes), _
                                                        SocketFlags.None)
                        AppendText("Message Received " & Str(nNumBytes) & " Bytes")
                        nTotalBytes = nTotalBytes + nNumBytes
                    End While
                End SyncLock

                AppendText("Total Bytes Received = " & Str(nTotalBytes))
                AppendText("MsgLen from Message = " & Str(nMsgLen))
                Select Case nMsgType
                    Case 1
                        AppendText(" Liftpos = " & System.Text.Encoding.ASCII.GetString(RecvBuffer, 4, 1))

                        For ind = 0 To NUM_LOCATIONS - 1
                            Number(ind) = System.Text.Encoding.ASCII.GetString(RecvBuffer, 5 + (ind * 12), 12)
                        Next

                        RefreshScreen()

                    Case Else
                        AppendText(" Unrecognized message type: " & Str(nMsgType))

                End Select

            End If
        End While


    Catch ex As Exception
        ' Tell the main thread to invoke DisconnectedUI
        Dim cb As New SimpleCallback(AddressOf DisconnectedUI)
        Me.Invoke(cb)
        Return
    End Try

Ответы [ 2 ]

1 голос
/ 23 апреля 2012

Эта проблема была исправлена.Сервер TCP / IP использовал модификатор функции WRITE, который в итоге установил бит URG в пакетах TCP / IP.Я полагаю, что сервер повредил это, и у разных клиентов Windows были различные проблемы с обработкой этих пакетов.

0 голосов
/ 17 ноября 2010

На самом деле, отправка дополнительного байта НЕ решает проблему. До тех пор, пока я сохраняю свое сообщение сокета менее 247 байт, все это отправляется в одном пакете. Поэтому отправка дополнительного байта просто гарантирует, что все данные получены клиентом.

Если я отправлю более длинное сообщение, то в зависимости от длины сообщения один байт теряется в конце каждого пакета. Это означает, что если я отправлю более длинное сообщение, мне придется подстроиться под это, либо сделав предположение, что оно всегда будет одинаковым, либо добавив какой-либо тег, чтобы помочь мне найти смещение данных в сообщении.

Я думал, что должно быть какое-то лучшее решение.

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