2009-06-18 12 views
4

Ich habe Socket-Programmierung seit vielen Jahren gemacht, aber ich hatte nie eine verpasste Nachricht mit TCP - bis jetzt. Ich habe einen Java-Server und einen Client in C - beide auf dem lokalen Host. Sie senden eine kurze Nachricht als Zeichenfolgen hin und her, mit einigen Verzögerungen dazwischen. Ich habe einen besonderen Fall, bei dem eine Nachricht niemals auf der Client-Seite ankommt. Es ist reproduzierbar, aber seltsam abhängig von der Maschine.Verpasste Socket Nachricht

Um einige weitere Details zu geben, kann ich die Server-Seite debuggen und sehen Sie die Sendung gefolgt von der Flush. Ich kann an den Client anschließen und durch die Select-Anrufe gehen (in einer Schleife), aber es erscheint einfach nie. Hat jemand das erlebt und gibt es eine andere Erklärung als einen Codierungsfehler?

Mit anderen Worten, wenn Sie einen verbundenen Sockel haben und einen Schreibvorgang auf der einen Seite und einen Lesevorgang auf der anderen Seite ausführen, was kann in der Mitte passieren, um so etwas zu verursachen?

Ein weiteres Detail - Ich habe tcpdump auf der Loopback-Schnittstelle verwendet und kann die verpasste Nachricht sehen.

+0

Ist Ihr Client Multithread? Ist es möglich, dass ein separater Thread auch auf diese Nachricht selektiert wird? Welches OS verwenden Sie? –

+0

Ich glaube nicht, dass es möglich ist, dass ein anderer Thread darauf auswählt. Dies ist unter Linux. Gute Idee - Ich habe das mit einem Zähler verifiziert. – AdamC

Antwort

1

Endlich - nachdem ich einige mehr geschnüffelt habe, habe ich das Problem gefunden. Zwei Nachrichten wurden vor dem Lesen gesendet (manchmal, aber selten ...), so dass sie beide gelesen wurden, aber nur der erste wurde behandelt. Deshalb schien es, als ob die zweite Nachricht nie angekommen wäre. Es wurde im Empfangspuffer vergraben.

+1

qrdl macht einen ausgezeichneten Punkt. UDP garantiert 1 write == 1 read, aber TCP explizit nicht (um einen besseren Durchsatz zu ermöglichen). –

+0

Guter Punkt über die Flusskontrolle - das ist ein guter Weg, um diese Art von Fehler zu verhindern, aber bs auf meiner Erfahrung anzurufen ist unhöflich. Fast hätte ich die Antwort nicht gepostet, weil es aus genau diesem Grund so ein blöder Fehler war, aber ich wollte jedem, der das sah, eine Idee geben, wo ich hinschauen sollte. – AdamC

4

Ich habe gesehen, dass dies in SMTP-Transaktionen passieren. Haben Sie einen Virenscanner auf diesem Rechner? Wenn ja, schalte es aus und schau, ob das einen Unterschied macht.

Andernfalls würde ich vorschlagen, Wireshark zu installieren, so dass Sie einen Blick darauf werfen können, was tatsächlich passiert.

+0

Er benutzte tcpdump und sah die fehlende Nachricht. Wireshark gibt mehr Details, macht aber keinen großen Unterschied. – bortzmeyer

Verwandte Themen