2015-04-27 13 views
8

Chcę napisać proste, małe opakowanie C++ RAII przez gniazdo C.Gniazda RAII: kiedy wydać (zamknąć)

Pytanie brzmi, w jakim stanie jest gniazdo, które zostanie zainicjowane (z punktu widzenia RAII) i które kwalifikuje się do wydania.

Na przykład dla gniazda klienta TCP: jeśli wywołanie socket zakończyło się pomyślnie, ale wywołanie connect nie powiodło się, czy należy wywołać close?

Jest to tylko przykład, jestem zainteresowany ogólną odpowiedź, coś jak:

  • Każde gniazdo pomyślnie utworzony przez socket muszą być zamknięte.
    lub
  • Muszą być zamknięte dla każdego connect, listen lub accept.

Strony man dla socket & przyjaciół i close nie są bardzo jasne (przynajmniej dla mnie).

+0

Jeśli posiadasz prawidłowy/aktywny uchwyt gniazda, to został zainicjowany. –

+0

@CaptainObvlious Kiedy uchwyt gniazda jest uważany za aktywny/aktywny? – bolov

+0

Uchwyt gniazda jest prawidłowy, gdy 'socket' lub' accept' zwraca wartość inną niż 'INVALID_SOCKET' i aż' zamkniesz 'uchwyt. –

Odpowiedz

3

Dwie pary do sparowania dla gniazd to socket() z close() i connect() z shutdown(). Jak widać, nie jest to tak łatwe jak w przypadku malloc() i free(). To dodatkowo komplikuje fakt, że nie każde gniazdo jest używane do connect(), niektóre używają też zamiast tego bind() i accept(). Jednakże, jeśli wywołasz close() bez shutdown(), jest to tylko silne zamknięcie, które jest doświadczane jako błąd przez stronę zdalną, ale poprawnie zwolnij przydzielone zasoby.

Chciałbym rozważyć zawijanie go dwukrotnie, raz, aby wywołać close() i innym razem, aby wywołać shutdown(). Nie martwiłbym się zbytnio o drugą część, ponieważ niepowodzenie shutdown() jest nadal w większości nieszkodliwe.

+0

dla 'bind' i' accept' powinno się wywoływać shutdown? – bolov

+0

@bolov: Jak mówi Ulrich, nie musisz się martwić zbytnio o wywołanie 'shutdown', ponieważ nie zrobi tego, nie wycieknie zasobów. Więc nie zawracałbym sobie głowy pakowaniem go w RAII. Reguła na Unixie jest całkiem prosta: jeśli jakikolwiek call zwraca deskryptor pliku> = 0 ('open',' socket', 'accept',' dup' ...), musisz 'zamknąć' aby uniknąć wycieku zasobów . – Nemo

Powiązane problemy