Gerhard Knabe: Linux , C++ , TCP-Socket

Beitrag lesen

Mach einen Netzwerktrace und prüfe, ob der TCP-Kanal überhaupt geschlossen wird. Falls nicht ist doch ganz klar, warum das nicht funktionieren kann. Wie ich an anderer Stelle schon schrieb, ist TCP ein stream-orientiertes Protokoll. Solange ein TCP-Kanal offen ist, können von beiden Seiten jederzeit noch Daten übertragen werden. Es ist Sache des oberhalb von TCP liegenden Protokolls, festzulegen wann eine Nachricht endet. Die Regeln dafür können sehr unterschiedlich sein, sieht man ja bei HTTP.

Sockets können im blocking mode oder im non-blocking mode betrieben werden, wobei der Umgang mit non-blocking sockets meines Wissens plattformabhängig ist, wenn auch die Unterschiede nur gering sein mögen. Ich kenne mich da nur unter Windows aus. Unter Unix gibt's wohl die Funktion fcntl, mit der man da die Umschaltung vornehmen kann.

Wenn Du allerdings mit blockierenden sockets das Ende einer Übertragung nicht erkennen kannst, werden dir asynchrone Operationen auch nicht helfen. Du kannst bestenfalls eine Verbindung wegen Timeout abbrechen. Die einfachste Lösung wäre festzulegen, dass der Sender nach der Übertragung den TCP-Kanal zu schließen hat. Dann ist auch garantiert, dass recv irgendwann mit 0 zurückkehrt.

MfG
GK