Je rencontre des problèmes avec une application cliente socket écrite en vb.net à l'aide de Visual Studio 2005. Le client se connecte à un serveur de socket en langage C qui s'exécute sur OpenVMS. Le problème que j'ai est que lorsque le serveur envoie un paquet, le client ne reçoit pas le dernier octet (de chaque paquet!). Je peux vider les paquets sur le réseau et les données sont toutes là. Ma solution actuelle est de garder mes messages de socket courts (247 octets) et d'envoyer un octet supplémentaire après la fin de mes données.Socket.Receive supprime le dernier octet de chaque paquet
Je voudrais inclure plus d'informations dans mes messages et je n'arrive pas à trouver un moyen de le faire fonctionner. Si je savais à 100% combien de temps les paquets seront sur le réseau, je pourrais contourner ce problème en ajoutant un octet supplémentaire aux bons endroits. Cependant, je ne veux pas faire d'hypothèses sur la longueur des paquets.
Quelqu'un at-il des suggestions sur la meilleure solution à ce problème?
Voici un échantillon de mon client code de réception:
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
Je ne vois rien de mal. Ce qui est assez mystérieux, c'est comment * vous * pouvez résoudre ce problème en envoyant un octet supplémentaire. Vous avez dit que le message * server * manque un octet. –