функция обратного вызова LPFN_DISCONNECTEX (mswsock.h)
Функция DisconnectEx закрывает подключение к сокету и позволяет повторно использовать дескриптор сокета.
Примечание
Эта функция является расширением для спецификации сокетов Windows, относящаяся к корпорации Майкрософт.
Синтаксис
LPFN_DISCONNECTEX LpfnDisconnectex;
BOOL LpfnDisconnectex(
SOCKET s,
LPOVERLAPPED lpOverlapped,
DWORD dwFlags,
DWORD dwReserved
)
{...}
Параметры
s
Дескриптор подключенного сокета, ориентированного на подключение.
lpOverlapped
Указатель на структуру OVERLAPPED . Если дескриптор сокета был открыт как перекрывающийся, указание этого параметра приводит к перекрывающейся (асинхронной) операции ввода-вывода.
dwFlags
Набор флагов, который настраивает обработку вызова функции. Если для этого параметра задано нулевое значение, флаги не устанавливаются. Параметр dwFlags может иметь следующее значение.
Flag | Значение |
---|---|
TF_REUSE_SOCKET | Подготавливает дескриптор сокета для повторного использовать. После завершения запроса DisconnectEx дескриптор сокета можно передать в функцию AcceptEx или ConnectEx . Примечание: Отключение на уровне сокета зависит от поведения базового транспорта. Например, сокет TCP может находиться в состоянии tcp-TIME_WAIT, что приводит к задержке вызова DisconnectEx . |
dwReserved
Зарезервировано. Должен равняться нулю. Если значение не равно нулю, возвращается WSAEINVAL .
Возвращаемое значение
При успешном выполнении функция DisconnectEx возвращает значение TRUE. При сбое функция возвращает значение FALSE. Используйте функцию WSAGetLastError для получения расширенных сведений об ошибке. Если вызов функции WSAGetLastError возвращает ERROR_IO_PENDING, операция успешно запущена и выполняется. В таких случаях вызов по-прежнему может завершиться ошибкой после завершения операции.
Код ошибки | Описание |
---|---|
WSAEFAULT | Система обнаружила недопустимый адрес указателя при попытке использовать аргумент указателя. Эта ошибка возвращается, если в параметре lpOverlapped было передано недопустимое значение указателя. |
WSAEINVAL | Передан недопустимый параметр. Эта ошибка возвращается, если параметр dwFlags был указан с нулевым значением, отличным от TF_REUSE_SOCKET. |
WSAENOTCONN | Сокет не подключен. Эта ошибка возвращается, если параметр сокета не был подключен. Эта ошибка также может быть возвращена, если сокет находился в состоянии закрытия передачи из предыдущего запроса и параметру dwFlags не было задано значение TF_REUSE_SOCKET для запроса повторного использования сокета. |
Комментарии
Функция DisconnectEx не поддерживает сокеты датаграмм. Поэтому сокет, указанный в hSocket , должен быть ориентирован на подключение, например SOCK_STREAM, SOCK_SEQPACKET или SOCK_RDM.
Примечание
Указатель на функцию DisconnectEx должен быть получен во время выполнения путем вызова функции WSAIoctl с указанным SIO_GET_EXTENSION_FUNCTION_POINTER кодом операции. Входной буфер, передаваемый в функцию WSAIoctl , должен содержать WSAID_DISCONNECTEX, глобальный уникальный идентификатор (GUID), значение которого определяет функцию расширения DisconnectEx . При успешном выполнении выходные данные, возвращаемые функцией WSAIoctl , содержат указатель на функцию DisconnectEx . GUID WSAID_DISCONNECTEX определяется в файле заголовка Mswsock.h .
Если значение lpOverlapped не равно NULL, перекрытие операций ввода-вывода может не завершиться до возврата DisconnectEx , в результате чего функция DisconnectEx возвращает значение FALSE и вызов функции WSAGetLastError , возвращающей ERROR_IO_PENDING. Эта конструкция позволяет вызывающей объекту продолжать обработку до завершения операции отключения. После завершения запроса Windows устанавливает событие, заданное элементом hEvent структуры OVERLAPPED , или сокет, указанный в hSocket, в состояние сигнала.
Примечание
Все операции ввода-вывода, инициированные данным потоком, отменяются при выходе из этого потока. Для перекрывающихся сокетов ожидающие асинхронные операции могут завершиться ошибкой, если поток будет закрыт до завершения операций. Дополнительные сведения см. в разделе ExitThread .
Состояние TIME_WAIT определяет время, которое должно пройти, прежде чем TCP сможет освободить закрытое подключение и повторно использовать его ресурсы. Этот интервал между закрытием и выпуском называется состоянием TIME_WAIT или состоянием 2MSL. В течение этого времени подключение может быть повторно открыто по гораздо меньшим затратам для клиента и сервера, чем установка нового подключения. Поведение TIME_WAIT указано в RFC 793 , который требует, чтобы TCP поддерживал закрытое подключение в течение по крайней мере в два раза максимального времени существования сегмента (MSL) сети. При освобождении подключения его пара сокетов и внутренние ресурсы, используемые для сокета, можно использовать для поддержки другого подключения.
Windows TCP возвращается в состояние TIME_WAIT после закрытия подключения. Находясь в состоянии TIME_WAIT, повторно использовать пару сокетов нельзя. Период TIME_WAIT можно настроить, изменив следующий параметр реестра DWORD, представляющий TIME_WAIT период в секундах.
HKEY_LOCAL_MACHINE\Системы\CurrentControlSet\Услуги\TCPIP\Параметры\TcpTimedWaitDelay
По умолчанию msl имеет значение 120 секунд. Параметр реестра TcpTimedWaitDelay по умолчанию имеет значение 240 секунд, что в 2 раза больше максимального времени существования сегмента, равного 120 секундам или 4 минутам. Однако эту запись можно использовать для настройки интервала. Уменьшение значения этой записи позволяет TCP быстрее освобождать закрытые подключения, предоставляя больше ресурсов для новых подключений. Однако если значение слишком мало, TCP может освободить ресурсы подключения до завершения подключения, что потребует от сервера использования дополнительных ресурсов для восстановления подключения. Этот параметр реестра можно задать в диапазоне от 0 до 300 секунд.
Windows Phone 8. Эта функция поддерживается для приложений Магазина Windows Phone на Windows Phone 8 и более поздних версиях.
Windows 8.1 и Windows Server 2012 R2. Эта функция поддерживается для приложений Магазина Windows на Windows 8.1, Windows Server 2012 R2 и более поздних версиях.
Требования
Требование | Значение |
---|---|
Заголовок | mswsock.h |