Cruz: TCP Socket close() in C

Hallo Proggers,

ich tippe gerade an einem Netzwerk Programmchen in C rum und frage mich ob....aber lass uns doch von Vorne anfangen.

Ich öffne einen TCP Socket und accept()-e darüber mehrere TCP Verbindungen. Für den Fall der Fälle habe ich eine error Routine, in der ich noch versuche alle offenen Verbindungen zu schliessen, bevor das Proggie die Grätsche macht.

Ich frage mich bzw. euch, ob es reicht close() auf den Socket Descriptor anzuwenden, oder ob ich jeden einzelnen Connection Descriptor in einen close() stopfen sollte, den mir accept() geliefert hat.

Viele Grüße,
Cruz

  1. Hallo Cruz,

    Ich frage mich bzw. euch, ob es reicht close() auf den Socket Descriptor anzuwenden, oder ob ich jeden einzelnen Connection Descriptor in einen close() stopfen sollte, den mir accept() geliefert hat.

    Zuerst: Sowohl das, was Du in accept() reinstopfst, als auch das, was Du rausbekommst, nennt sich Socket.

    Wenn Du alle Verbindungen schließen willst, musst Du close() auf jede Verbindung andwenden, denn ein close() verhindert nur, dass neue Verbindungen akzeptiert werden.

    Allerdings: Wenn das Programm beendet wird, werden sowieso alle Sockets (und Dateien, etc.) vom Kernel geschlossen, insofern wäre es nicht unbedingt notwendig, alle Sockets zu schließen, wenn Du das Programm hinterher sowieso beendest. Wenn Du's allerdings nicht beendest, solltest Du alle Client-Verbindungen kappen, wenn Du nichts mehr mit denen anstellen willst.

    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
    1. Hallo Christian,

      noch zwei Löcher...

      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?

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

      Vielen Dank,
      Cruz

      1. 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