функция shutdown (winsock.h)
Функция завершения работы отключает отправку или получение в сокете.
Синтаксис
int shutdown(
[in] SOCKET s,
[in] int how
);
Параметры
[in] s
Дескриптор, определяющий сокет.
[in] how
Флаг, который описывает, какие типы операций больше не будут разрешены. Возможные значения для этого флага перечислены в файле заголовка Winsock2.h .
Значение | Значение |
---|---|
|
Завершение работы операций получения. |
|
Завершение операций отправки. |
|
Завершите операции отправки и получения. |
Возвращаемое значение
Если ошибка не возникает, при завершении работы возвращается ноль. В противном случае возвращается значение SOCKET_ERROR, а определенный код ошибки можно получить, вызвав WSAGetLastError.
Код ошибки | Значение |
---|---|
Виртуальное подключение разорвано из-за тайм-аута или иного сбоя. Приложение должно закрыть сокет, поскольку он больше не может использоваться.
Эта ошибка применяется только к сокету, ориентированному на подключение. |
|
Виртуальное подключение было сброшено удаленной стороной путем прерывания. Приложение должно закрыть сокет, поскольку он больше не может использоваться.
Эта ошибка применяется только к сокету, ориентированному на подключение. |
|
Выполняется блокирующий вызов Windows Sockets 1.1 или поставщик услуг по-прежнему обрабатывает функцию обратного вызова. | |
Параметр how недопустим или не согласуется с типом сокета. Например, SD_SEND используется с типом сокета UNI_RECV. | |
Произошел сбой сетевой подсистемы. | |
Сокет не подключен. Эта ошибка применяется только к сокету, ориентированному на подключение. | |
Примечание Дескриптор не является сокетом.
|
|
Перед использованием этой функции должен произойти успешный вызов WSAStartup . |
Комментарии
Функция завершения работы используется на всех типах сокетов для отключения приема, передачи данных или и того, и другого.
Если параметр how SD_RECEIVE, последующие вызовы функции recv в сокете будут запрещены. Это не влияет на нижние уровни протокола. Для сокетов TCP, если в сокете по-прежнему есть данные в очереди, ожидающие получения, или данные поступают впоследствии, подключение сбрасывается, так как данные не могут быть доставлены пользователю. Для сокетов UDP входящие датаграммы принимаются и помещаются в очередь. Ни в каких случаях не создается пакет ошибки ICMP.
Если параметр how SD_SEND, последующие вызовы функции отправки запрещены. Для сокетов TCP fins будет отправляться после отправки всех данных и подтверждения получателем.
Настройка SD_BOTH отключает отправку и получение, как описано выше.
Функция завершения работы не закрывает сокет. Все ресурсы, подключенные к сокету, не будут освобождены до вызова closesocket .
Чтобы обеспечить отправку и получение всех данных в подключенном сокете перед закрытием, приложение должно использовать завершение работы , чтобы закрыть подключение перед вызовом closesocket. Один из методов ожидания уведомления о том, что удаленный конец отправил все свои данные и инициировал корректное отключение, использует функцию WSAEventSelect следующим образом:
- Вызовите WSAEventSelect , чтобы зарегистрироваться для получения уведомления FD_CLOSE.
- Вызовите завершение работы с помощью how=SD_SEND.
- При получении FD_CLOSE вызовите recv или WSARecv , пока функция не завершится успешно и не укажет, что получено ноль байтов. Если возвращается SOCKET_ERROR, корректное отключение невозможно.
- Вызовите closesocket.
- Вызовите завершение работы с помощью how=SD_SEND.
- Вызовите recv или WSARecv , пока функция не завершится успешно и не укажет, что получено ноль байтов. Если возвращается SOCKET_ERROR, корректное отключение невозможно.
- Вызовите closesocket.
Дополнительные сведения см. в разделе Корректное завершение работы, параметры задержки и закрытие сокета.
После вызова функции завершения работы для отключения отправки, получения или обоих способов повторного включения отправки или получения для существующего подключения сокета не существует.
Приложение не должно полагаться на возможность повторного использования сокета после завершения работы. В частности, поставщик сокетов Windows не требуется для поддержки использования подключения к сокету, который был выключен.
Если приложение хочет повторно использовать сокет, необходимо вызвать функцию DisconnectEx с параметром dwFlags , для параметра TF_REUSE_SOCKET , чтобы закрыть подключение к сокету и подготовить дескриптор сокета для повторного использования. После завершения запроса DisconnectEx дескриптор сокета можно передать в функцию AcceptEx или ConnectEx .
Если приложению требуется повторно использовать сокет, функции TransmitFile или TransmitPackets можно вызвать с параметром dwFlags , заданным с TF_DISCONNECT и TF_REUSE_SOCKET отключиться после того, как все данные будут поставлены в очередь для передачи, и подготовить дескриптор сокета для повторного использования. После завершения запроса TransmitFile дескриптор сокета можно передать в вызов функции, ранее использовавшийся для установления соединения, например AcceptEx или ConnectEx. После завершения функции TransmitPackets дескриптор сокета можно передать в функцию AcceptEx .
Примечания для банкомата
Существуют важные проблемы, связанные с разрывом подключения при использовании режима асинхронной передачи (ATM) и сокетов Windows 2. Дополнительные сведения об этих важных рекомендациях см. в разделе Заметки для ATM в разделе Примечания справочника по функции closesocket .Windows Phone 8. Эта функция поддерживается для приложений Магазина Windows Phone на Windows Phone 8 и более поздних версиях.
Windows 8.1 и Windows Server 2012 R2. Эта функция поддерживается для приложений Магазина Windows на Windows 8.1, Windows Server 2012 R2 и более поздних версиях.
Требования
Требование | Значение |
---|---|
Минимальная версия клиента | Windows 8.1, Windows Vista [классические приложения | Приложения UWP] |
Минимальная версия сервера | Windows Server 2003 [классические приложения | Приложения UWP] |
Целевая платформа | Windows |
Header | winsock.h (включая Winsock2.h, Webhost.h) |
Библиотека | Ws2_32.lib |
DLL | Ws2_32.dll |