WinSock2 + blockierendes recv + CreateThread + (C++ / WinAPI)

23/04/2013 - 00:12 von Robert Hartmann | Report spam
Hallo zusammen,

Ich bastel immernoch an meiner "AdapterSoftware"
(vgl. Posting "NamedPipe + Zugriffsrechte + CreateProcessAsUser"
mit Message-ID: <kj2iv4$tjd$1@speranza.aioe.org> ).


Prinzipiell bin ich schon fast zufrieden.

An einer Stelle ruft meine Software in blockierender Weise recv auf
einem Socket auf.

Falls der Client noch verbunden ist, aber einfach nichts schickt ist das
blockierende empfangen genau das was ich möchte.

Fàllt der Client aber nun weg, oder kommt es zu sonstiger Störung der
Verbindung, dann wartet der recv eben weiterhin.

Ich würde gerne vor dem recv einen neuen Thread starten,
in dem überprüft wird, ob überhaupt noch ein Client mit dem Socket
verbunden ist. und falls keine Verbindung mehr da ist, muss
das recv abgebrochen werden.

Oder sollte ich es anders herum machen:

Das blockierende recv in einen extra Thread auslagern und
im normalen Programmfluss eine Schleife schreiben, in der eine gewisse
Zeitspanne gewartet wird bevor ein Zustandstest gemacht wird.
sollte die schleife verlassen werden, weil der Test schief ging, dann
könnte der Thread gezwungen werden sich zu beenden und somit das recv
abzubrechen. sollte der Thread beendet werden nach erfolgreichem recv,
dann könnte die schleife ebenfalls beendet werden...

Was hört sich gescheiter an?

Gruß Robert
 

Lesen sie die antworten

#1 Ulrich Eckhardt
23/04/2013 - 09:29 | Warnen spam
Am 23.04.2013 00:12, schrieb Robert Hartmann:
An einer Stelle ruft meine Software in blockierender Weise recv auf
einem Socket auf.

Falls der Client noch verbunden ist, aber einfach nichts schickt ist das
blockierende empfangen genau das was ich möchte.

Fàllt der Client aber nun weg, oder kommt es zu sonstiger Störung der
Verbindung, dann wartet der recv eben weiterhin.



Naja, der Timeout beim Ziehen des Steckers ist bei TCP recht lang. Wenn
die TCP-Verbindung aber offiziell abgebaut ist, dann sollte recv()
SOCKET_ERROR zurueckgeben. Hast Du mal versucht den "TCP keepalive
timeout" herunterzusetzen um einen gezogenen Stecker schneller zu
detektieren? Ich hab' es selber noch nicht ausprobiert, aber der Doku
nach sollte das genau das Mittel der Wahl sein.


Ich würde gerne vor dem recv einen neuen Thread starten,
in dem überprüft wird, ob überhaupt noch ein Client mit dem Socket
verbunden ist. und falls keine Verbindung mehr da ist, muss
das recv abgebrochen werden.



Wie willst Du pruefen ob der Client noch da ist? Wenn Du nicht einen
zweiten Kanal zum Client hast, dann sehe ich nur die Methode dem
TCP-Stack zu vertrauen, also recv() einfach aufzurufen und zu warten. Du
kannst uebrigens auch ein Event mit dem Socket verbinden, dann kannst Du
mit WaitForMultipleObjects() arbeiten. Das erlaubt es Dir einen Timeout
zu definieren oder ein zweites Event zum manuellen Abbruch zu setzen.
Ich glaube der Ansatz mit dem zweiten Thread und den damit verbundenen
Problemen kannst Du vermeiden.

Viel Erfolg!

Uli

Ähnliche fragen