Forum: Mikrocontroller und Digitale Elektronik LwIP remote close erkennen


von Gustav G. (gustavgggg)


Lesenswert?

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?

von J. S. (jojos)


Lesenswert?

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
von Gustav G. (gustavgggg)


Lesenswert?

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.

von Andreas M. (amesser)


Lesenswert?

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.

von Harald K. (kirnbichler)


Lesenswert?

Kennt lwIP die Socket-Option SO_KEEPALIVE?

von Wastl (hartundweichware)


Lesenswert?

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.

von Monk (roehrmond)


Lesenswert?

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
von Harald K. (kirnbichler)


Lesenswert?

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?

von Wastl (hartundweichware)


Lesenswert?

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.

von Christian (christiankpunkt)


Lesenswert?

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
Noch kein Account? Hier anmelden.