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.()
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