Functia shutdown

Functia shutdown() dezafecteaza transmisia si / sau receptia printr-un socket.

Sintaxa:

int shutdown (

SOCKET s, 
int how 
);
 

unde:

Functia shutdown() se foloseste pentru toate tipurile de socketuri pentru a dezafecta receptia, transmisia, sau amandoua.

Daca how este SD_RECEIVE, urmatoarele receptii prin socket sunt interzise. Aceasta nu are efect asupra protocoalelor de pe nivelurile inferioare.

Pentru socketuri TCP, daca mai sunt date in coada de asteptare care asteapta sa fie receptionate, sau daca ajung date ulterior, conexiunea este resetata, deoarece datele nu pot fi livrate utilizatorului.

Pentru socketuri UDP, datagramele care vin sunt acceptate si adaugate la coada de asteptare. Nu va fi niciodata generat un pachet ICMP de eroare.

Daca how este SD_SEND, urmatoarele transmisii sunt interzise.

Pentru socketurile TCP, este trimis un FIN.

Setind how la SD_BOTH dezafecteaza atat transmisia cat si receptia conform celor descrise mai jos.

De retinut ca functia shutdown nu inchide socketul, si resurcele atasate socketului nu vor fi eliberate pana cand nu este apelata functia  closesocket().

Pentru a se asigura ca toate datele sunt transmise si receptionate printr-un socket conectat inainte de a fi inchis, o aplicatie trebuie sa foloseasca functia shutdown() pentru a inchide conexiunea inainte de apelul functiei closesocket(). Spre exemplu, pentru a initia o deconectare gratioasa, o aplicatie poate sa:

1. apeleze WSAAsyncSelect() pentru a se inregistra pentru o notificare FD_CLOSE,
2. apeleze shutdown() cu how=SD_SEND,
3. atunci cand este receptionat mesajul FD_CLOSE, sa apeleze functia recv() pana cand returneaza zero, sau SOCKET_ERROR, si sa
4. apeleze closesocket().

Functia shutdown() nu blocheaza indiferent de setarea lui SO_LINGER asupra socketului.

    O aplicatie nu poate refolosi un socket dupa ce a fost apelata functia shutdown(). In particular, unui furnizor de servicii Windows Sockets nu i se cere sa suporte utilizarea functiei connect() folosind un astfel de socket.

Valoare returnata

Daca nici o eroare nu apare, functia shutdown() returneaza zero. In alte situatii, este returnata o valoare SOCKET_ERROR, si un cod de eroare specific poate fi aflat apeland WSAGetLastError().

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