Functia closesocket

Functia closesocket() inchide un socket.

int closesocket (

SOCKET s 
); 

unde:

Aceasta functia inchide un socket. Mai exact, ea elibereaza descriptorul socketului astfel incat orice referire ulterioara la s va conduce la o eroare (WSAENOTSOCK in Windows). Daca aceasta este ultima referire la socketul corespunzator, informatiile referitoare la nume si datele din stiva de asteptare sunt inlaturate. 

Semantica functiei closesocket() este afectata de optiunile de socket SO_LINGER si SO_DONTLINGER dupa cum urmeaza (Nota: atunci cand nu este specificat explicit un socket are atribuita optiunea SO_DONTLINGER. Adica,  opusul optiunii SO_LINGER - care s-ar traduce ca socket "cu intarziere"):

Optiune Interval de timp (sec) Tipul de inchidere Sa astepte pentru inchidere?
SO_DONTLINGER Nu conteaza Gratios Nu
SO_LINGER Zero Hard Nu
SO_LINGER Nonzero Gratios Da

Daca SO_LINGER este setat cu un timp de asteptare zero (l_linger este zero in structura linger), functia closesocket nu este blocata chiar daca stiva de date ne trimise nu au fost trimise sau confirmate. Acest tip de inchidere este numit inchidere  "hard" sau avortiva, din cauza ca circuitul virtual al socketului este resetat imediatsi orice date netrimise sunt pierdute. Orice apel de functie recv la partea indepartata a conexiunii va genera o eroare (WSAECONNRESET in Windows).

Daca SO_LINGER este setat cu un timp de asteptare diferit de zero pe un socket cu blocare, apelul functiei closesocket call va bloca aplicatia pana cand restul de date au fost trimise sau pana cand timpul de asteptare expira. Acest gen de inchidere se numeste deconectare "gratioasa". Daca timpul de asteptare expira inainte ca toate datele sa fie trimise implementarea Windows Sockets termina conexiunea inainte ca functia closesocket sa revina.

Alegand optiunea SO_LINGER cu un timp de asteptare diferit de zero pe un socket fara blocare nu este recomandata. In acest caz, apelul functiei closesocket() va conduce la o eroare (WSAEWOULDBLOCK in Windows) daca operatia de inchidere nu poate fi completata imediat.

Daca inchiderea socketului esueaza cu eroarea WSAEWOULDBLOCK descriptorul socketului este inca valid si deconectarea nu este initiata. Aplicatia trebuie sa apeleze din nou closesocket pentru a inchide socketul. Aceste apeluri pot continua in bucla pana cand aplicatia seteaza optiunea SO_LINGER cu un timp de asteptare zero sau apeleaza shutdown pentru a initia o inchidere.

Daca SO_DONTLINGER este setata pe un socket stream socket apelul closesocket() se va intoarce imediat. Totusi, orice date din coada de asteptare vor fi trimise daca este posibil inainte ca socketul sa fie efectiv inchis. Si acest tip de inchidere este numit "deconectare gratioasa". De retinut ca in acest caz, furnizorul de socketuri Windows nu poate elibera socketul si alte resurse pentru un timp oarecare, ceea ce poate afecta aplicatia care asteapta sa utilizeze toate socketurile disponibile. Aceasta este comportarea default.

Nota. Pentru a se asigura ca toate datele sunt trimise si receptionate pe o conexiune, o aplicatie trebuie sa apeleze  functia shutdown() inaintea apelarii functiei closesocket.()

Valoare returnata

Daca nici o eroare nu apare, Functia closesocket intoarce zero. In caz de eroare, ea intoarce SOCKET_ERROR (in cazul Windows, un cod de eroare specific poate fi aflat apeland functia WSAGetLastError()).

Cornel Mironel Niculae, 2004-2005
13-Nov-2004