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


Функция обратного вызова LPWSPCANCELBLOCKINGCALL (ws2spi.h)

Функция LPWSPCancelBlockingCall отменяет текущий вызов блокировки.

Синтаксис

LPWSPCANCELBLOCKINGCALL Lpwspcancelblockingcall;

int Lpwspcancelblockingcall(
  [out] LPINT lpErrno
)
{...}

Параметры

[out] lpErrno

Указатель на код ошибки.

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

Значение, возвращаемое LPWSPCancelBlockingCall, равно нулю , если операция была успешно отменена. В противном случае возвращается значение, SOCKET_ERROR, и в lpErrno доступен определенный код ошибки.

Код ошибки Значение
WSAENETDOWN
Произошел сбой сетевой подсистемы.
WSAEINVAL
Указывает, что не выполняется блокирующий вызов.

Комментарии

Эта функция отменяет все невыполненные операции блокировки для этого потока. Обычно он используется в двух ситуациях:

  • Клиент WINDOWS Sockets SPI обрабатывает сообщение, полученное в то время как поставщик услуг реализует псевдоблокировку. В этом случае WSAIsBlocking будет иметь значение true.
  • Выполняется блокирующий вызов, и поставщик службы Winsock вызвал функцию перехватчика блокировки клиента Winsock SPI (через функцию обратного вызова, полученную из WPUQueryBlockingCallback), которая, в свою очередь, вызывает эту функцию. Такая ситуация может возникнуть, например, при реализации параметра Отмена для операции, которая требует длительного времени для завершения.

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

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

Отмена вызова LPWSPAccept или LPWSPSelect не оказывает негативного влияния на сокеты, передаваемые в эти вызовы. Сбой только конкретного вызова; любая операция, которая была законной до отмены, является законной после отмены, и состояние сокета никак не влияет.

Отмена любых операций, отличных от LPWSPAccept и LPWSPSelect , может оставить сокет в неопределенном состоянии. Если клиент Winsock SPI отменяет операцию блокировки в сокете, единственная операция, которую клиент Winsock SPI сможет выполнить с сокетом, — это вызов LPWSPCloseSocket, хотя другие операции могут работать с некоторыми поставщиками служб Winsock. Если клиенту Winsock SPI требуется максимальная переносимость, следует соблюдать осторожность, чтобы не зависеть от выполнения операций после операции отмены. Клиент Winsock SPI может сбросить подключение, установив для SO_LINGER время ожидания равным нулю и вызвав LPWSPCloseSocket.

Если операция отмены каким-либо образом скомпрометирует целостность потока данных SOCK_STREAM, поставщик Winsock сбросит подключение и завершит сбой всех последующих операций, кроме LPWSPCloseSocket с WSAECONNABORTED.

LPWSPCancelBlockingCall может успешно возвращать данные, если операция блокировки сети завершается до отмены. В этом случае операция блокировки будет успешно возвращена, как если бы LPWSPCancelBlockingCall никогда не вызывался. Единственный способ убедиться, что операция была отменена клиентом Winsock SPI, — проверка для кода возврата WSAEINTR из блокирующего вызова.

Требования

Требование Значение
Минимальная версия клиента Windows 2000 Professional [только классические приложения]
Минимальная версия сервера Windows 2000 Server [только классические приложения]
Верхняя часть ws2spi.h

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

WPUQueryBlockingCallback

WSAIsBlocking

LPWSPAccept

LPWSPCloseSocket

LPWSPSelect

LPWSPSocket