Kennt sich hier jemand mit der RAW Api von LwIP aus? Ich fange an neue Verbindungen vom PC aufzunehmen und starte im accept handler das lesen mit tcp_recv. Soweit funktioniert das auch alles aber wie kann ich einen handler dafür setzen ob der PC die Verbindung getrennt hat? In der Dokumentation steht, dass der pbuf im receive NULL ist, wenn die Verbindung geschlossen wurde. Heißt das ich muss immer einen Lesevorgang starten um das zu erkennen oder geht das auch ohne Lesevorgang?
Du musst Schreiben um einen Fehler zu bekommen. Lesen hilft nur wenn du weißt das der Gegner zyklisch etwas sendet und dann kann man einen Timeout setzen. Bzw. beim Receive bekommt nur einen 'graceful close' mit, also wenn der Gegner während des receive close aufruft. Auf Ereignisse vom Phy kann man sich nicht verlassen, die Strecke kann ja irgendwo nach dem x-ten Switch unterbrochen sein und das bekommt man nicht mit.
:
Bearbeitet durch User
Alles klar das macht sinn. Die Frage ist naürlich wie bekomme ich das mit. Irgendwie geht aus der Dokumentation nicht hervor ob der Aufruf von tcp_write einen Fehler liefert oder der Handler aber der hat kein Fehler Argument.
Gustav G. schrieb: > ich muss immer einen Lesevorgang starten um das zu erkennen oder geht > das auch ohne Lesevorgang? Was meinst Du damit? Man ruft tcp_recv genau einmal auf um das callback zu hinterlegen. Danach kommt das callback bei jedem Empfang von Daten. Beim close kommt das callback letztmalig mit einem NULL pointer als Argument.
Harald K. schrieb: > Kennt lwIP die Socket-Option SO_KEEPALIVE? Ein Wink mit dem Zaunpfahl oder ist die Frage ernst gemeint? Ein Blick in die Sourcen genügt, ja natürlich ist Keepalive unterstützt. Habe ich bei lwIP auch nicht anders erwartet.
J. S. schrieb: > Auf Ereignisse vom Phy kann man sich nicht verlassen, die Strecke kann > ja irgendwo nach dem x-ten Switch unterbrochen sein und das bekommt man > nicht mit. Zudem kurz Kabel ab- und wieder an stecken normalerweise (unabhängig von lwip meine ich) nicht automatisch eine Trennung des IP Sockets zur Folge hat.
:
Bearbeitet durch User
Wastl schrieb: > Ein Blick in die Sourcen genügt, ja natürlich ist Keepalive > unterstützt. Na, dann sollte "remote close" doch erkannt werden können, oder?
Harald K. schrieb: > Na, dann sollte "remote close" doch erkannt werden können, oder? Hab's nicht ausprobiert und auch nicht tiefer dafür reingeschaut. So aus der hohlen Hand heraus würde ich annehmen dass Keepalive erst explizit aktiviert werden muss.
Eine einseitig geschlossene TCP Verbindung wird von der Gegenseite erst erkannt, wenn diese versucht Daten zu senden und das Acknowledge aus bleibt. Andernfalls wird sie endlos auf Datenempfang warten. Um eine geschlossene Verbindung zu erkennen, kann Keepalive verwendet werden, wenn die TCP/IP Implementierung dies unterstützt, oder es muss auf Anwendungsebene regelmäßig Daten gesendet werden.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.