Завершение соединения
Для завершения сеанса сначала необходимо проинформировать партнера, с которым происходило соединение, об окончании передачи данных. Для этого используется функция shutdown , которая выглядит следующим образом:
int shutdown ( SOCKET s, int how );
Первый параметр — это сокет, соединение которого необходимо закрыть. Второй параметр может принимать одно из следующих значений:
SD_RECEIVE — запретить любые функции приема данных. На протоколы нижнего уровня этот параметр не действует. Если используется потоковый протокол (например, TCP) и в очереди есть данные, ожидающие чтение функцией recv, или они пришли позже, то соединение сбрасывается. Если используется UDP-протокол, то сообщения продолжают поступать;
SD_SEND — запретить все функции отправки данных;
SD_BOTH — запретить прием и отправку данных.
После того как партнер проинформирован о завершении работы, можно закрывать сокет. Для этого используется функция closesocket, которая выглядит так:
int closesocket ( SOCKET s );
После этого указанный в качестве единственного параметра сокет будет закрыт. Если вы попытаетесь использовать его в какой-нибудь функции, то получите ошибку WSAENOTSOCK — дескриптор не является сокетом. Любые пакеты, ожидающие отправку, прерываются или отменяются.