RAII sockets: wann soll man freigeben (schließen)

8

Ich möchte einen einfachen, kleinen C ++ RAII-Wrapper über einen C-Sockel schreiben.

Die Frage ist, in welchem ​​Zustand ein Socket als initialisiert betrachtet wird (aus der Sicht von RAII) und so für eine Freigabe infrage kommt.

Zum Beispiel für einen TCP-Client-Socket: Wenn der Aufruf socket erfolgreich ist, aber der Aufruf connect fehlgeschlagen ist, sollte close aufgerufen werden?

Dies ist nur ein Beispiel, ich interessiere mich für eine allgemeine Antwort, etwas wie:

  • Jedes von socket erfolgreich erstellte Socket muss geschlossen sein.
    oder
  • Es muss eine Schließung für jedes connect , listen oder accept .
  • geben

Die man-Seiten für socket & amp; Freunde und close sind nicht sehr klar (oder zumindest für mich).

    
bolov 27.04.2015, 17:38
quelle

1 Antwort

3

Die beiden Teile, die für Sockets verknüpft werden sollen, sind socket() mit close() und connect() mit shutdown() . Wie Sie sehen, wird es nicht so einfach wie mit malloc() und free() . Dies wird zusätzlich dadurch erschwert, dass nicht jedes Socket an connect() , sondern auch bind() und accept() verwendet wird. Wenn Sie jedoch close() ohne shutdown() aufrufen, handelt es sich nur um ein energisches Herunterfahren, das von der Remoteseite als Fehler empfunden wird, Sie geben jedoch Ressourcen frei, die zugewiesen wurden.

Ich würde erwägen, es zweimal zu umbrechen, einmal um close() aufzurufen und ein weiteres Mal, um shutdown() aufzurufen. Ich würde mir über den zweiten Teil allerdings keine Sorgen machen, da das Scheitern von shutdown() immer noch größtenteils harmlos ist.

    
Ulrich Eckhardt 27.04.2015 17:47
quelle

Tags und Links