Question

Je développe une application en C #, en utilisant le modèle client-serveur, où le serveur envoie un tableau d'octets avec un bitmap au client, les charges du client dans l'écran, envoie un « OK » au serveur, et le serveur envoie une autre image, et ainsi de suite.

La longueur du tampon d'image deppends, il est généralement entre 60KB et 90KB, mais je l'ai vu que cela n'a pas d'importance. Si je mets le client et le serveur dans le même ordinateur, en utilisant localhost, tout fonctionne bien. Le serveur ne BeginSend, et le client ne EndReceive et le tampon entier est transmis.

Cependant, je suis en train de tester cela dans un réseau sans fil et ce qui se passe est:

  • Le serveur envoie l'image.
  • La fonction de rappel data_received sur le client est appelé, mais il n'y a que 1460 octets à lire (MTU - pourquoi ne devrait pas être seulement dans UDP)
  • La fonction de rappel data_received sur le client est appelé à nouveau, maintenant avec le reste du tampon (soit qu'il soit 1000 octets ou 100 kilo-octets) ...

Il est toujours comme ça, un premier paquet avec 1460 octets est reçu, puis le second paquet contient le reste.

Je peux travailler autour en se joignant à la fois des réseaux octets reçus, mais cela ne semble pas juste. Je ne suis même pas sûr pourquoi cela se passe. Est-ce une restriction sur le réseau? Pourquoi alors ne pas C # attendre l'ensemble des données à transmettre? Je veux dire, il est TCP, je ne devrais pas avoir à se soucier, non?

Quoi qu'il en soit, toute aide serait génial!
Vive

Était-ce utile?

La solution

Il est TCP - vous devez traiter les données comme un flux . Vous ne devriez pas prendre soin comment le flux est divisé en paquets, ou faire des hypothèses à ce sujet.

Si vous avez besoin de recevoir un « bloc » des données, la façon la plus simple de le faire est fiable à ce préfixe avec la longueur (par exemple en tant que valeur 32 bits). Vous avez lu la longueur (en notant que même les octets peut être divisé sur plusieurs paquets), puis lire à plusieurs reprises (que ce soit de façon synchrone ou asynchrone) en prenant note de combien vous avez lu chaque fois, jusqu'à ce que vous avez lu tous les données.

Autres conseils

Avoir une lecture de 9.2.4

  

Lors de la dissection d'un protocole de couche d'application, vous ne pouvez pas supposer que chaque paquet TCP contient exactement un message de couche d'application. Un message de couche d'application peut être divisé en plusieurs paquets TCP.

ajouter à la réponse de John:

int offset = 0;
int imagesize = 512;
byte[] buffer = new byte[512];

tcpChannel.Read(buffer, offset, imagesize);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top