J'ai une simple question concernant l'ordre des messages envoyés et reçus via les classes TCP, je ne trouve pas de réponse à 100% et mon anglais ne va pas assez bien.TCPClient et TCPListener - NetworkStream - ordre des messages
Si j'ai l'exemple suivant:
Serveur:
IPAddress IP = IPAddress.Parse("127.0.0.1");
int Port = 13000;
TcpListener Server = new TcpListener(IP, Port);
TcpClient Client = Server.AcceptTcpClient();
NetworkStream Stream = Client.GetStream();
Stream.Write(Buffer1, 0, 4);
//random time
Stream.Write(Buffer2, 0, 4);
//random time
Stream.Write(Buffer3, 0, 4);
et Client: J'ai
TCPClient Client = new TcpClient("127.0.0.1", 13000);
NetworkStream Stream = Client.GetStream();
Stream.Read(A, 0, 4);
//random time
Stream.Read(B, 0, 4);
//random time
Stream.Read(C, 0, 4);
Est-il sûr à 100% que A = buffer1, B = buffer2, C = Buffer3?
Non! Vous devez vérifier la valeur de retour de 'Stream.Read' pour voir combien d'octets vous avez réellement. TCP est * ordonné * (ce qui signifie que vous avez la garantie de recevoir des octets dans l'ordre où vous les avez envoyés) mais aussi * basé sur les flux * (ce qui signifie que le paquet d'octets n'est pas garanti). Pour le rendre plus explicite: TCP n'a pas de messages. Si vous voulez des messages, vous devrez les construire vous-même (le préfixer avec une longueur est l'approche la plus courante). Consultez n'importe quel tutoriel sur le code réseau pour voir comment écrire une boucle de réception appropriée. –
J'ai déjà mis en œuvre ce préfixe le premier 4B de mon message est la longueur du message, donc de l'autre côté, j'ai lu le premier 4B, puis définissez NumberOfBytesToRead à ce nombre pour une autre lecture. Je voulais juste confirmer l'ordre des messages auxquels vous avez probablement répondu dans la première partie de votre commentaire :) –
Attention: vous n'avez même pas la garantie d'obtenir 4 octets si vous demandez 4 octets (ils peuvent être répartis entre les paquets), donc même en lisant la longueur doit être fait dans une boucle jusqu'à ce que vous ayez ces 4 octets. Et puis vous aurez besoin de boucle à nouveau pour obtenir le message complet. Il est probablement l'erreur la plus courante dans la programmation réseau, et particulièrement sournoise car ce type de code peut très bien fonctionner par accident ou dans un environnement de test, puis échouer en production. –