Поделиться через


Функция WSARecvDisconnect (winsock2.h)

Функция WSARecvDisconnect завершает прием в сокете и извлекает данные об отключении, если сокет ориентирован на подключение.

Синтаксис

int WSAAPI WSARecvDisconnect(
  [in]  SOCKET   s,
  [out] LPWSABUF lpInboundDisconnectData
);

Параметры

[in] s

Дескриптор, определяющий сокет.

[out] lpInboundDisconnectData

Указатель на входящие данные отключения.

Возвращаемое значение

Если ошибки не происходит, WSARecvDisconnect возвращает ноль. В противном случае возвращается значение SOCKET_ERROR, а определенный код ошибки можно получить, вызвав WSAGetLastError.

Код ошибки Значение
WSANOTINITIALISED
Перед использованием этой функции должен быть выполнен успешный вызов WSAStartup .
WSAENETDOWN
Произошел сбой сетевой подсистемы.
WSAEFAULT
Буфер, на который ссылается параметр lpInboundDisconnectData , слишком мал.
WSAENOPROTOOPT
Данные об отключении не поддерживаются указанным семейством протоколов. Обратите внимание, что реализации TCP/IP, которые не поддерживают данные об отключении, не требуются для возврата кода ошибки WSAENOPROTOOPT. Сведения о реализации TCP/IP майкрософт см. в разделе примечаний.
WSAEINPROGRESS
Выполняется блокирующий вызов Windows Sockets 1.1 или поставщик услуг по-прежнему обрабатывает функцию обратного вызова.
WSAENOTCONN
Сокет не подключен (только сокеты, ориентированные на подключение).
WSAENOTSOCK
Дескриптор не является сокетом.

Комментарии

Функция WSARecvDisconnect используется в сокетах, ориентированных на подключение, чтобы отключить прием и получить все входящие данные об отключении от удаленной стороны. Это эквивалентно завершению работы (SD_RECEIVE), за исключением того, что WSARecvDisconnect также позволяет получить данные об отключении (в протоколах, которые его поддерживают).

После успешного выполнения этой функции последующие приемы в сокете будут запрещены. Вызов WSARecvDisconnect не влияет на нижние уровни протокола. Для сокетов TCP, если в сокете по-прежнему находится в очереди данные, ожидающие получения, или данные поступают впоследствии, подключение сбрасывается, так как данные не могут быть доставлены пользователю. Для UDP входящие датаграммы принимаются и помещаются в очередь. Ни в каких случаях не будет создан пакет ошибки ICMP.

Примечание Собственная реализация TCP/IP в Windows не поддерживает данные отключения. Отключение данных поддерживается только поставщиками сокетов Windows, которые имеют флаг XP1_DISCONNECT_DATA в своей структуре WSAPROTOCOL_INFO . Используйте функцию WSAEnumProtocols для получения WSAPROTOCOL_INFO структур для всех установленных поставщиков.
 
Чтобы успешно получить входящие данные об отключении, приложение должно использовать другие механизмы, чтобы определить, что канал закрыт. Например, приложение должно получить уведомление FD_CLOSE, чтобы получить нулевое возвращаемое значение или получить код ошибки WSAEDISCON или WSAECONNRESET из recv/WSARecv.

Функция WSARecvDisconnect не закрывает сокет, и ресурсы, подключенные к сокету, не будут освобождены до вызова closesocket .

Функция WSARecvDisconnect не блокируется независимо от параметра SO_LINGER в сокете.

Приложение не должно полагаться на возможность повторного использования сокета после отключения с помощью WSARecvDisconnect. В частности, поставщик сокетов Windows не требуется для поддержки использования connect или WSAConnect в таком сокете.

Примечание При выполнении блокирующего вызова Winsock, например WSARecvDisconnect, Winsock может потребоваться дождаться сетевого события, прежде чем вызов сможет завершиться. В этой ситуации Winsock выполняет оповещенное ожидание, которое может быть прервано асинхронным вызовом процедуры (APC), запланированным в том же потоке. Выполнение другого блокирующего вызова Winsock внутри APC, который прервал текущий блокирующий вызов Winsock в том же потоке, приведет к неопределенному поведению и никогда не должен выполняться клиентами Winsock.
 

Требования

Требование Значение
Минимальная версия клиента Windows 2000 Professional [только классические приложения]
Минимальная версия сервера Windows 2000 Server [только классические приложения]
Целевая платформа Windows
Header winsock2.h
Библиотека Ws2_32.lib
DLL Ws2_32.dll

См. также раздел

WSAConnect

WSAEnumProtocols

WSAGetLastError

WSAPROTOCOL_INFO

WSARecv

Функции Winsock

Справочник по Winsock

closesocket

connect;

Сокета