Hallo,
es kann jederzeit passieren, dass ein TCP Paket gesplittet wird!
Beispiel:
Server App->Sendet 30KByte an SocketApi ;
SocketApi sendet nicht ein paket mit 30KByte sondern 2 Pakete mit jeweils 15KByte
Ein Router/Repeater zwischen den beiden Rechnern splittet die 15K pakete in jeweils 2 7,5K packete auf.
Empfänger bekommt erstes packet, notifiziert Client APP über lesevorgang. Client liest 7,5KByte;
Deine Applikation liest dieses packet und geht davon aus, dass das alles war.
3 weitere packete mit je 7,5kb treffen ein, und verbleiben ungehört in der SocketApi.
Was ich damit zum Ausdruck bringen möchte, ist die tatsache dass du
A) immer wissen solltest, wie gross die Gesamtinformation ist, die du erwartest
B) solange lesen musst, bis alle Bytes gelesen wurden.
Zu beachten: eine schleife Socket.Read bringt dir nichts, du musst vor dem lesen ein "Application.prozessMessages" aufrufen, damit die Notifizierung der socketApi deine Socketkomponente erreicht und diese dann die daten von der socketApi abrufen kann.
Klug ist es daher vorab 4 byte mit der grösse zu senden. Der Empfänger liest dann so lange bis er GENAU 4 byte gelesen hat! Nun weis der Empfänger wieviel Byte jetzt noch folgen müssen.
Der Witz an der Geschichte ist, das ein empfangenes Packet auch den Anfang eines weiteren Packetes beinhalten kann.
Nochmal Beispiel:
Sender sendet:
Paket1: 10,20,10,20,10
Paket2: 5,3,5,4
Empfänger bekommt:
Paket1: 10,20,10
Paket2: 20,10,5
Paket3: 3,5,4
Alles klar?
Ich weis leider nicht welche art socketkomponente du verwendest, aber scheinbar liegt dein Problem an dieser Stelle. Du musst eigene Methoden zum lesen/schreiben entwickeln, die dieses Prinziep beherzigen.
Mfg,
General North