Frage

Ich bin eine Anwendung in C # entwickeln, das Server-Client-Modell, in dem der Server einen Byte-Array mit einer Bitmap an den Client sendet, sendet der Client lädt es in den Bildschirm, einen „OK“ auf den Server, und sendet der Server ein anderes Bild, und so weiter.

Die Länge des Bildpuffer deppends, in der Regel ist es zwischen 60kb und 90kb, aber ich habe gesehen, dass es keine Rolle spielt. Wenn ich den Client und den Server auf dem gleichen Computer setzen, mit localhost, funktioniert alles einwandfrei. Der Server schaltet sich Begin, und der Kunde hat EndReceive und der gesamte Puffer übertragen wird.

Allerdings teste ich jetzt diese in einem drahtlosen Netzwerk und was passiert ist:

  • Der Server sendet das Bild.
  • Die Callback-Funktion auf dem Client data_received genannt wird, aber es gibt nur 1460 Bytes zu lesen (MTU? - warum soll nicht nur in UDP sein)
  • Die Callback-Funktion auf dem Client data_received erneut aufgerufen, jetzt mit dem Rest des Puffers (entweder 1000 Byte oder 100 kByte sein) ...

Es ist immer so, ein erstes Paket mit 1460 Byte empfangen wird, und dann das zweite Paket enthält den Rest.

Ich kann durch Verbinden der beiden Byte-Arrays erhalten dieses Problem umgehen, aber das scheint nicht richtig. Ich bin nicht einmal sicher, warum dies geschieht. Ist es eine Beschränkung auf das Netzwerk? Warum dann nicht C # warten, bis die gesamten Daten übertragen werden? Ich meine, es ist TCP, ich sollte nicht darüber Sorgen zu machen, nicht wahr?

Wie auch immer, jede mögliche Hilfe wäre toll!
Prost

War es hilfreich?

Lösung

Es ist TCP - Sie sollten die Daten als Strom behandeln. Sie sollen nicht, wie der Strom in Pakete aufgeteilt wird, oder Annahmen darüber machen.

Wenn Sie einen einzelnen „Block“ von Daten empfangen müssen, die einfachste Art und Weise, zuverlässig zu tun, ist es mit der Länge Präfix (beispielsweise als 32-Bit-Wert). Sie lesen die Länge (unter Hinweis darauf, dass auch das Bytes könnte über mehrere Pakete aufgeteilt werden) und dann wiederholt gelesen (ob synchron oder asynchron) zur Kenntnis nehmend, wie viel Sie jedes Mal lesen, bis Sie alle gelesen habe die Daten.

Andere Tipps

Haben Sie einen Lese von 9.2.4

  

Wenn Sie ein Protokoll der Anwendungsschicht sezieren kann man nicht davon ausgehen, dass jedes TCP-Paket enthält genau eine Anwendungsschicht-Nachricht. Eine Anwendungsschicht Nachricht kann in mehrere TCP-Pakete aufgeteilt werden.

Hinzufügen zu Johns Antwort:

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

tcpChannel.Read(buffer, offset, imagesize);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top