Ich bin ziemlich sicher, dass die Socket-Bereinigung mehr eine Nebenwirkung der Freigabe aller Dateideskriptoren nach dem Prozess stirbt, und nicht direkt durch die Prozessbereinigung.
Ich gehe jedoch auf ein Bein und gehe davon aus, dass Sie eine gemeinsame Fallstricke mit Netzwerkprogrammierung treffen. Wenn ich richtig rate, dass Ihr Problem ist, dass Sie eine "Adresse in Verwendung" -Fehler (EADDRINUSE) erhalten, wenn Sie versuchen, an eine Adresse zu binden, nachdem ein Prozess getötet wurde, dann laufen Sie in die TIME_WAIT des Sockets.
Wenn dies der Fall ist, können Sie entweder auf das Timeout warten, in der Regel 60 Sekunden, oder Sie können den Socket so ändern, dass er sofort wieder verwendet werden kann.
int sock, ret, on;
struct sockaddr_in servaddr;
sock = socket(AF_INET, SOCK_STREAM, 0):
/* Enable address reuse */
on = 1;
ret = setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));
[EDIT]
Aus Ihren Kommentaren, Es klingt wie Sie Probleme mit halboffene Verbindungen haben, und nicht vollständig verstehen, wie TCP funktioniert. TCP hat keine Möglichkeit zu wissen, ob ein Client tot ist oder gerade leer ist. Wenn Sie einen Clientprozess kill -9
ausführen, wird der vier-wege schließende Handshake nie abgeschlossen. Dies sollte jedoch keine offenen Verbindungen auf Ihrem Server hinterlassen, so dass Sie immer noch einen Netzwerk-Dump benötigen, um sicher zu sein, was vor sich geht.
Ich kann nicht sicher sagen, wie Sie damit umgehen sollten, ohne genau zu wissen, was Sie tun, aber Sie können über TCP Keepalive here lesen. Einige andere Optionen senden in regelmäßigen Abständen leere oder leere Nachrichten an den Client (möglicherweise müssen Sie Ihr Protokoll ändern) oder feste Zeitgeber für inaktive Verbindungen festlegen (dies kann zu ungültigen Verbindungen führen).
Ich bin neugierig, wenn Sie eine Antwort mögen, und wenn es ein Kernel-Problem oder ein Netzwerkproblem war. Auch das Aktualisieren Ihrer Frage würde anderen helfen, die später darüber stolpern. – JimB
@ JimB, Wenn Sie an unserem Netzwerkproblem interessiert sind, dann nein, ich weiß nicht, was das Problem ist/war. Wir haben diese inaktiven Verbindungen hinzugefügt, überprüfen und verwenden so_keepalive jetzt, aber es gibt so viel Verkehr, dass es sehr schwer ist, Traffic Dump zu machen und zu überprüfen, ob bestimmte Pakete verloren gehen oder nicht. Über dieses Schließen habe ich Quellen überprüft, die caf in seiner Antwort erwähnt hat, und ich glaube, dass der Linux-Kernel * versucht * die Sockets zu schließen, wenn der Prozess beendet wird. Wenn es gelingt oder nicht, ist eine andere Frage. –