Je travaille actuellement sur une application multithread où je reçois des données en utilisant le code suivant (simplifié):Le flux reçu d'un socket est-il limité à une seule commande d'envoi?
private void BeginReceiveCallback(IAsyncResult ar)
{
bytesReceived = this.Socket.EndReceive(ar);
byte[] receivedData = new byte[bytesReceived];
Array.Copy(buffer, receivedData, bytesReceived);
long protocolLength = BitConverter.ToInt64(receivedData, 0);
string protocol = Encoding.ASCII.GetString(receivedData, 8, (int)protocolLength);
IList<object> sentObjects =
ParseObjectsFromNetworkStream(receivedData, 8 + protocolLength);
InvokeDataReceived(protocol, sentObjects);
}
Je rencontre que receivedData
contient non seulement les données attendues, mais aussi beaucoup plus. Je soupçonne que ce sont des données envoyées par la suite qui ont été mélangées avec les précédentes dans le flux.
Ma question est, quelles données puis-je espérer être stockées dans ce tampon. Peut-il contenir des données provenant de deux opérations d'envoi différentes du côté client? Dans ce cas, je suppose que je devrai élaborer un protocole capable de différencier les «messages» de données envoyés du côté client. Une approche simple consisterait à démarrer et terminer respectivement chaque flux avec un octet spécifique (unique). Existe-t-il une approche commune pour séparer les messages? En outre, je suppose que cela signifie qu'un seul appel de réception peut ne pas être suffisant pour obtenir toutes les données du client, ce qui signifie que je vais devoir faire une boucle jusqu'à ce que l'octet de fin a été trouvé?
Merci pour la réponse concise. Ma solution actuelle utilise le préfixe de longueur, mais n'est pas capable de distinguer entre les messages - pour l'instant. Quelles approches peuvent être prises pour manipuler avec élégance les parties des messages qui n'arrivent pas? Une approche basée sur le timeout est-elle la meilleure voie à suivre? –
En outre, ce qui est la moitié des messages - disons le milieu - se perd. Tout à coup, je vais analyser la moitié du message suivant au lieu de provoquer un crash garanti. Puis-je faire aveuglément confiance à TCP pour m'assurer que cela ne se produise pas? –
TCP vous présente un flux fiable. Il gère la retransmission des pièces perdues pour vous, tous les octets que vous envoyez d'un homologue arriveront TOUJOURS (dans le bon ordre) chez l'autre homologue sauf si la connexion est réinitialisée (ce que vous saurez). –