BSD Sockets: CLOSE_WAIT - Was läuft falsch?

Hallo

Auf einer Linuxkiste (2.6.9) läuft eine Applikation, die aus einer Datenbank, drei Services und einem GUI besteht. Die drei Services und das GUI kommunizieren per Sockets (sys/socket.h) und sind mit C/C++ (gcc 3.4.4) programmiert.

Mit netstat -npat habe ich herausgefunden, dass das GUI, welches mit jedem Service verbunden ist, teilweise unvollendete Verbindungen offen hat (CLOSE_WAIT). Ich gehe davon aus, dass es sich hier um einen Programmierfehler handelt und die Verbindung nicht richtig beendet wurde.

Station(1): Station(2):
---------- ----------- 
LISTEN ----FIN---\> FIN\_WAIT\_1

TIME\_WAIT
\> TIME\_WAIT
\> 2xMSL (Maximum Segment Lifetime)
\> Waitstate to discard late tcp segments

Gibt es eine Möglichkeit (mit socket.h) zu detektieren ob ein CLOSE_WAITE Status existiert und wenn ja, kann diese Verbindung dann richtig geschlossen werden? Oder kennt jemand von euch eventuell eine Linux-Konsole-Befehl der so was kann?

Dank und Gruss
Olli

Hallo Olli.

Mit netstat -npat habe ich herausgefunden, dass
das GUI, welches mit jedem Service verbunden ist, teilweise
unvollendete Verbindungen offen hat (CLOSE_WAIT). Ich gehe
davon aus, dass es sich hier um einen Programmierfehler
handelt und die Verbindung nicht richtig beendet wurde.

Gibt es eine Möglichkeit (mit socket.h) zu detektieren ob ein CLOSE_WAIT
Status existiert und wenn ja, kann diese Verbindung dann
richtig geschlossen werden?

CLOSE_WAIT bedeutet, dass die Gegenseite die TCP-Verbindung
geschlossen hat und es nun an der lokalen Anwendung ist - bei
Dir das GUI - die TCP-Verbindung ebenfalls per close() zu
schliessen.

Da nur der Ersteller des Sockets ein Handle auf diese TCP-Verbindung
hat, ist es an ihm, close() auzurufen. Eine Möglichkeit, dass ein
externer Prozess von aussen einen bestehenden Socket eines anderen
Prozesses einfach schliesst, gibt es - meines Wissens - nicht.

Oder kennt jemand von euch eventuell eine Linux-Konsole-Befehl
der so was kann?

Die einzige Möglichkeit eine fehlerhafte Anwendung, die ihre
Sockets nicht mehr schliesst, von aussen zum Schliessen zu überreden,
ist sie abzuschiessen.

Wenn der fehlerhafte Prozess geschlossen wird, werden auch all seine
offenen Dateideskriptoren und Sockets beendet.

Such Dir also per _ netstat -npat _ die Prozess-ID heraus und
ruf _ kill _ mit dieser auf. Nachteil: das GUI ist dann weg :wink:

Siehe auch
http://groups.google.de/group/comp.unix.questions/br…

Gruß,
-Andreas.

Hallo Andreas

CLOSE_WAIT bedeutet, dass die Gegenseite die TCP-Verbindung
geschlossen hat und es nun an der lokalen Anwendung ist - bei
Dir das GUI - die TCP-Verbindung ebenfalls per close() zu
schliessen.

Das könnte der entscheidende Hinweis sein. Ich bin davon ausgegangen, dass ACK nicht gesendet wird.

Die einzige Möglichkeit eine fehlerhafte Anwendung …

Eben doch eine „fehlerhafte Anwendung“. Ich war mir nicht sicher, ob es ein Kernel-Problem sein könnte, da viele ander Programme (wie Kate, Firefox etc.) auch oft im CLOSE_WAIT Status verweilen.

ruf _ kill _ mit dieser auf. Nachteil: das GUI ist
dann weg :wink:

… huuuuuhhh, wie bringe ich das dem Benutzer bei … :wink: …?
Bei Sun Solaris soll das mit dem Befehl _ ndd _ gehen, ohne das GUI zu killen. Linux scheint nichts vergleichbares zu haben.

Vielen Dank für die Inputs.

Grüsse
Olli

Hallo Olli.

ruf _ kill _ mit dieser auf. Nachteil: das GUI ist
dann weg :wink:

Bei Sun Solaris soll das mit dem Befehl _ ndd _
gehen, ohne das GUI zu killen. Linux scheint nichts
vergleichbares zu haben.

Wie funktioniert das mit ndd? Habe leider kein
Solaris-System zum testen, aber die man-Page unter
http://bama.ua.edu/cgi-bin/man-cgi?ndd+1M
sieht mir mehr danach aus, dass Du mit dem Tool lediglich
die IP-Verbindungsparameter konfigurieren kannst, nicht
aber einzelne Verbindungen abschiessen …

Weisst Du da mehr?

Gruß,
-Andreas.

Hallo Andreas

Wie funktioniert das mit ndd? …
Weisst Du da mehr?

Ein Sun Solaris System habe ich leider auch keines. Ich habe lange im Internet nach einer Lösung für das CLOSE_WAIT Problem gesucht und bin immer wieder auf _ ndd _ von Sun Solaris gestossen. So soll es funktionieren:

Bsp. Konfiguration:

Local IP = 10.10.4.8 Hex = 0x0a0a0408
Local Port = 8002 Hex = 0x1f42

Remote IP = 10.10.140.47 Hex = 0x0a0a8c2f
Remote Port = 1319 Hex = 0x0527

Befehl:

ndd –set /dev/tcp tcp\_discon\_by\_addr “0a0a04081f42 0a0a8c2f0527”

Ohne Gewähr … :wink:
Im Zweifelsfall:
http://www.google.de/search?hl=de&q=CLOSE_WAIT+Sun+S…

Grüsse
Olli