Christian Seiler: TCP Socket close() in C

Beitrag lesen

Hallo Cruz,

Allerdings: Wenn das Programm beendet wird, werden sowieso alle Sockets (und Dateien, etc.) vom Kernel geschlossen,

Soweit ich weiss kann das aber eine Weile dauern, dafür gibt es doch das setsockopt() und SO_REUSEADDR. Oder bezieht sich das alleine auf den Port und die Sockets werden sofort geschlossen?

Es bezieht sich nur auf die Adress/Port-Angabe bei bind(), nicht jedoch auf die Sockets selbst.

Und wenn der Kernel die Sockets schliesst, kriegen das die Clients auf der anderen Seite ordnungsgemäß mit, dass die Verbindung geschlossen wurde?

Das Schließen erfolgt genauso, wie über close(), allerdings kannst Du auch das Verhalten von close() beeinflussen, mittels SO_LINGER. Wenn Du nicht weißt, was das macht und es nicht einsetzt, dann ignoriere es einfach komplett, Du wirst es dann nicht brauchen. Wenn SO_LINGER jedenfalls deaktiviert ist, dann führt der Kernel beim Beenden eines Prozesses genauso wie bei close() einen "Graceful Shutdown" des Sockets durch (meines Wissens sogar bei SIGKILL, das man ja nichtmal abfangen kann).

Viele Grüße,
Christian

--
"I have always wished for my computer to be as easy to use as my telephone; my wish has come true because I can no longer figure out how to use my telephone." - Bjarne Stroustrup