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

Функция LPWSPIoctl управляет режимом сокета.

Синтаксис

LPWSPIOCTL Lpwspioctl;

int Lpwspioctl(
  [in]  SOCKET s,
  [in]  DWORD dwIoControlCode,
  [in]  LPVOID lpvInBuffer,
  [in]  DWORD cbInBuffer,
  [out] LPVOID lpvOutBuffer,
  [in]  DWORD cbOutBuffer,
  [out] LPDWORD lpcbBytesReturned,
  [in]  LPWSAOVERLAPPED lpOverlapped,
  [in]  LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine,
  [in]  LPWSATHREADID lpThreadId,
  [in]  LPINT lpErrno
)
{...}

Параметры

[in] s

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

[in] dwIoControlCode

Управляющий код выполняемой операции.

[in] lpvInBuffer

Указатель на входной буфер.

[in] cbInBuffer

Размер входного буфера в байтах.

[out] lpvOutBuffer

Указатель на выходной буфер.

[in] cbOutBuffer

Размер выходного буфера в байтах.

[out] lpcbBytesReturned

Указатель на фактическое количество байтов выходных данных.

[in] lpOverlapped

Указатель на структуру WSAOverlapped (игнорируется для неперекрывающихся сокетов).

[in] lpCompletionRoutine

Тип: _In_opt_ LPWSAOVERLAPPED_COMPLETION_ROUTINE

Указатель на подпрограмму завершения, вызываемую при завершении операции (игнорируется для неперекрывающихся сокетов). См. заметки.

[in] lpThreadId

Указатель на структуру WSATHREADID , которая будет использоваться поставщиком в последующем вызове WPUQueueApc. Поставщик должен хранить указанную структуру WSATHREADID (не указатель), пока не будет возвращена функция WPUQueueApc .

[in] lpErrno

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

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

Если ошибка не возникает и операция завершена немедленно, функция LPWSPIoctl возвращает ноль. Обратите внимание, что в этом случае подпрограмма завершения, если она указана, уже будет помещена в очередь. В противном случае возвращается значение SOCKET_ERROR, а в lpErrno доступен определенный код ошибки. Код ошибки WSA_IO_PENDING указывает, что перекрывающаяся операция была успешно инициирована и что завершение будет указано позже. Любой другой код ошибки указывает, что не была инициирована перекрывающаяся операция и не будет никаких указаний завершения.

Код ошибки Значение
WSA_IO_PENDING
Перекрываемая операция была успешно инициирована, и ее завершение будет указано позже.
WSAEFAULT
Параметр lpvInBuffer, lpvOutBuffer или lpcbBytesReturned не полностью содержится в допустимой части адресного пространства пользователя или параметр cbInBuffer или cbOutBuffer слишком мал.
WSAEINVAL
DwIoControlCode не является допустимой командой, или предоставленный входной параметр недопустим, либо команда не применима к указанному типу сокета.
WSAEINPROGRESS
Функция вызывается при выполнении обратного вызова.
WSAENETDOWN
Произошел сбой сетевой подсистемы.
WSAENOTSOCK
Дескриптор не является сокетом.
WSAEOPNOTSUPP
Указанная команда IOCTL не может быть реализована. Например, спецификации потока, указанные в SIO_SET_QOS , не могут быть удовлетворены.
WSAEWOULDBLOCK
Сокет помечается как неблокировочный, и запрошенная операция будет блокироваться.

Комментарии

Эта подпрограмма используется для задания или получения операционных параметров, связанных с сокетом, транспортным протоколом или подсистемой связи. Если lpOverlapped и lpCompletionRoutine имеют значение NULL, сокет в этой функции будет рассматриваться как неперекрытый сокет.

Для неперекрывающихся сокетов параметры lpOverlapped и lpCompletionRoutine игнорируются, и эта функция может блокироваться, если сокеты находятся в режиме блокировки. Обратите внимание, что если socket s находится в режиме без блокировки, эта функция может возвращать WSAEWOULDBLOCK , если указанная операция не может быть завершена немедленно. В этом случае клиент SPI сокетов Windows может изменить сокет в режим блокировки и повторно отправить запрос или дождаться соответствующего сетевого события (например, FD_ROUTING_INTERFACE_CHANGE или FD_ADDRESS_LIST_CHANGE в случае SIO_ROUTING_INTERFACE_CHANGE или SIO_ADDRESS_LIST_CHANGE) с помощью сообщения Windows (через LPWSPAsyncSelect или событие (с помощью LPWSPEventSelect) на основе механизма уведомления.

Для перекрывающихся сокетов будут инициированы операции, которые не могут быть завершены немедленно, а завершение будет указано позже. Значение DWORD , на которое указывает возвращаемый параметр lpcbBytesReturned , можно игнорировать. Окончательное состояние завершения и возвращаемые байты можно получить, если соответствующий метод завершения будет получен после завершения операции.

Любой IOCTL может блокироваться на неопределенный срок в зависимости от реализации поставщика услуг. Если клиент SPI сокетов Windows не допускает блокировки в вызове LPWSPIoctl , для ioCTL рекомендуется использовать перекрывающиеся операции ввода-вывода, которые, скорее всего, будут блокироваться, в том числе:

  • SIO_ADDRESS_LIST_CHANGE
  • SIO_FINDROUTE
  • SIO_FLUSH
  • SIO_GET_QOS
  • SIO_GET_GROUP_QOS
  • SIO_ROUTING_INTERFACE_CHANGE
  • SIO_SET_QOS
  • SIO_SET_GROUP_QOS

Некоторые ioCTL для конкретных протоколов также могут быть особенно подвержены блокировке. Просмотрите соответствующее приложение для конкретного протокола, чтобы получить доступную информацию.

Ниже приведен прототип процедуры завершения, на которую указывает параметр lpCompletionRoutine .

void CALLBACK 
CompletionRoutine(  
  IN DWORD           dwError, 
  IN DWORD           cbTransferred, 
  IN LPWSAOVERLAPPED lpOverlapped, 
  IN DWORD           dwFlags 
);

CompletionRoutine — это заполнитель для имени функции, предоставленной приложением. Параметр dwError указывает состояние завершения перекрываемой операции, как указано в параметре lpOverlapped . Параметр cbTransferred указывает количество полученных байтов. Параметр dwFlags не используется для этого IOCTL. Подпрограмма завершения не возвращает значение.

В той мере, в какой параметр dwIoControlCode теперь является 32-разрядной сущностью, можно внедрить схему кодирования, которая предоставляет удобный способ секционирования пространства идентификаторов кода операции. Параметр dwIoControlCode создан таким образом, чтобы обеспечить независимость протокола и поставщика при добавлении новых кодов элементов управления, сохраняя при этом обратную совместимость с сокетами Windows 1.1 и кодами элементов управления UNIX. Параметр dwIoControlCode имеет следующую форму.

бит 31 бит 30 бит 29 биты 28 и 27 биты 26 по 16 биты 15 от 0
I O V T Семейство поставщиков и адресов Код

Я задается, если входной буфер действителен для кода, как и в случае с IOC_IN.

O задается, если выходной буфер действителен для кода, как и в случае с IOC_OUT. Обратите внимание, что для кодов с входными и выходными параметрами будут заданы операции ввода-вывода и операции ввода-вывода .

V устанавливается, если для кода нет параметров, как в случае с IOC_VOID.

T — это двухбитовое количество, определяющее тип IOCTL. Определены следующие значения.

  • Значение 0 указывает, что IOCTL является стандартным кодом UNIX IOCTL, как в случае с FIONREAD, FIONBIO и т. д.
  • Значение 1 указывает, что IOCTL является универсальным кодом IOCTL windows Sockets 2. Новые коды IOCTL, определенные для windows Sockets 2, будут иметь T == 1.
  • Значение 2 указывает, что IOCTL применяется только к определенному семейству адресов.
  • 3 IOCTL применяется только к поставщику определенного поставщика. Этот тип позволяет назначить компаниям номер поставщика, который отображается в члене семьи "Поставщик/адрес ". Затем поставщик может определить новые ioCTL, относящиеся к этому поставщику, не регистрируя IOCTL в клиринговой системе, обеспечивая тем самым гибкость и конфиденциальность поставщика.

Семейство поставщиков или адресов — это 11-битное количество, определяющее поставщика, которому принадлежит код (если T == 3), или содержит семейство адресов, к которому применяется код (если T == 2). Если это код IOCTL UNIX (T == 0), то этот элемент имеет то же значение, что и код в UNIX. Если это универсальный IOCTL (T == 1) windows Sockets 2, то этот элемент можно использовать в качестве расширения элемента кода для предоставления дополнительных значений кода.

Код — это конкретный код IOCTL для операции.

Поддерживаются следующие команды UNIX:

FIONBIO

Включает или отключает режим неблокировки для сокетов. Параметр lpvInBuffer указывает на значение long без знака, которое не равно нулю, если режим неблокировки должен быть включен, и нуль, если он должен быть отключен. При создании сокета он работает в режиме блокировки (то есть режим неблокировки отключен). Это согласуется с сокетами Berkeley Software Distribution (BSD).

Подпрограмма LPWSPAsyncSelect или LPWSPEventSelect автоматически устанавливает для сокета режим без блокировки. Если LPWSPAsyncSelect или LPWSPEventSelect был выдан для сокета, любая попытка использовать LPWSPIoctl для возврата сокета в режим блокировки завершится ошибкой при использовании WSAEINVAL. Чтобы вернуть сокет в режим блокировки, клиент SPI windows Sockets должен сначала отключить LPWSPAsyncSelect , вызвав LPWSPAsyncSelect с параметром lEvent , равным нулю, или отключить LPWSPEventSelect , вызвав LPWSPEventSelect с параметром lNetworkEvents , равным нулю.

FIONREAD

Определите объем данных, которые можно считывать атомарно из сокетов. Параметр lpvOutBuffer указывает на беззнаковое значение long , в котором WSAIoctl хранит результат.

Если сокет, переданный в параметре s , ориентирован на поток (например, тип SOCK_STREAM), функция FIONREAD возвращает общий объем данных, которые могут быть прочитаны за одну операцию получения; Обычно это то же самое, что и общий объем данных, помещенных в очередь в сокете (так как поток данных ориентирован на байты, это не гарантируется).

Если сокет, переданный в параметре s , ориентирован на сообщения (например, тип SOCK_DGRAM), функция FIONREAD возвращает общее количество доступных для чтения байтов, а не размер первой датаграммы (сообщения), помещенной в очередь в сокете.

SIOCATMARK

Определяет, были ли считаны все данные OOB. Это относится только к сокету стиля потока (например, типу SOCK_STREAM), который настроен для встроенного приема любых данных OOB (SO_OOBINLINE). Если данные OOB не ожидают чтения, операция возвращает значение TRUE. В противном случае возвращается значение FALSE, и следующая операция получения, выполненная в сокете, извлекает некоторые или все данные, предшествующие метке. Клиент WINDOWS Sockets SPI должен использовать операцию SIOCATMARK , чтобы определить, остается ли какая-либо. Если есть какие-либо обычные данные, предшествующие срочным (OOB), они будут получены в порядке. (Обратите внимание, что операции получения никогда не будут смешивать данные OOB и обычные данные в одном вызове.) lpvOutBuffer указывает на BOOL , в котором LPWSPIoctl сохраняет результат.

Поддерживаются следующие команды Windows Sockets 2:

SIO_ACQUIRE_PORT_RESERVATION (параметр opcode: I, T==3)

Запросите резервирование среды выполнения для блока портов TCP или UDP. Для резервирования портов среды выполнения пул портов требует, чтобы резервирования были использованы из процесса, в сокете которого было предоставлено резервирование. Резервирование портов среды выполнения длится только до времени существования сокета, в котором был вызван SIO_ACQUIRE_PORT_RESERVATION IOCTL. Напротив, постоянные резервирования портов, созданные с помощью функции CreatePersistentTcpPortReservation или CreatePersistentUdpPortReservation , могут использоваться любым процессом с возможностью получения постоянных резервирований.

Дополнительные сведения см. в справочнике по SIO_ACQUIRE_PORT_RESERVATION .

SIO_ACQUIRE_PORT_RESERVATION поддерживается в Windows Vista и более поздних версиях операционной системы.

SIO_ADDRESS_LIST_CHANGE (параметр кода операции: T==1)

Получение уведомления об изменениях в списке локальных транспортных адресов семейства протоколов сокета, к которым может привязаться клиент SPI сокетов Windows. Никакие выходные данные не будут предоставлены по завершении этого МОКТЛ; завершение просто указывает, что список доступных локальных адресов изменился, и его следует запросить повторно через SIO_ADDRESS_LIST_QUERY.

Предполагается (хотя и не обязательно), что клиент SPI сокетов Windows использует перекрывающиеся операции ввода-вывода для уведомления об изменении путем выполнения запроса SIO_ADDRESS_LIST_CHANGE . Кроме того, если SIO_ADDRESS_LIST_CHANGE IOCTL выдается в неблокизуемом сокете и без перекрывающихся параметров (для lpOverlapped и lpCompletionRoutine задано значение NULL), он немедленно завершится с ошибкой WSAEWOULDBLOCK. Затем клиент SPI windows Sockets может ждать событий изменения списка адресов с помощью вызова LPWSPEventSelect или LPWSPAsyncSelect с FD_ADDRESS_LIST_CHANGE битом, заданным в битовой маске сетевых событий.

SIO_ADDRESS_LIST_QUERY (параметр кода операции: O, T==1)

Получает список локальных транспортных адресов семейства протоколов сокета, к которым может привязаться приложение. Список адресов зависит от семейства адресов, а некоторые адреса исключаются из списка.

Примечание

В средах Windows Plug-n-Play адреса можно добавлять и удалять динамически. Поэтому приложения не могут полагаться на сведения, возвращаемые SIO_ADDRESS_LIST_QUERY , быть постоянными. Приложения могут регистрироваться для получения уведомлений об изменении адреса через SIO_ADDRESS_LIST_CHANGE IOCTL, который предоставляет уведомления через перекрывающиеся операции ввода-вывода или события FD_ADDRESS_LIST_CHANGE. Следующую последовательность действий можно использовать, чтобы гарантировать, что приложение всегда имеет текущие сведения о списке адресов:

 

  • Проблема SIO_ADDRESS_LIST_CHANGE IOCTL
  • IOCTL проблемы SIO_ADDRESS_LIST_QUERY
  • Всякий раз , когда SIO_ADDRESS_LIST_CHANGE IOCTL уведомляет об изменении списка адресов (путем перекрытия операций ввода-вывода или сигнала FD_ADDRESS_LIST_CHANGE события), следует повторять всю последовательность действий.

Дополнительные сведения см. в справочнике по SIO_ADDRESS_LIST_QUERY . SIO_ADDRESS_LIST_QUERY поддерживается в Windows 2000 и более поздних версиях.

SIO_ASSOCIATE_HANDLE (параметр кода операции: I, T==1)

Связывает этот сокет с указанным дескриптором интерфейса-компаньона. Входной буфер содержит целочисленное значение, соответствующее константе манифеста для интерфейса-компаньона (например, TH_NETDEV и TH_TAPI), за которым следует значение, являющееся дескриптором указанного интерфейса-компаньона, а также любые другие необходимые сведения. Дополнительные сведения см. в соответствующем разделе приложения windows Sockets 2 Protocol-Specific и /или документации по соответствующему интерфейсу. (Эти ресурсы могут быть доступны только на английском языке.) Общий размер отражается в длине входного буфера. Выходной буфер не требуется. Код ошибки WSAENOPROTOOPT указан для поставщиков услуг, которые не поддерживают этот IOCTL. Дескриптор, связанный с этим IOCTL, можно получить с помощью SIO_TRANSLATE_HANDLE.

Интерфейс-компаньон может использоваться, например, если определенный поставщик предоставляет:

  • Большой дополнительный контроль над поведением сокета.
  • Элементы управления для конкретных поставщиков, которые не сопоставляют с существующими функциями сокета Windows (или с теми, которые могут быть в будущем).

Рекомендуется использовать модель COM вместо этой функции IOCTL для обнаружения и отслеживания других интерфейсов, которые могут поддерживаться сокетом. Этот IOCTL используется для обеспечения обратной совместимости с системами, в которых COM недоступен или не может использоваться по какой-либо другой причине.

SIO_ASSOCIATE_PORT_RESERVATION (параметр кода операции: I, T==3)

Свяжите сокет с постоянным резервированием или резервированием среды выполнения для блока портов TCP или UDP, определенного маркером резервирования портов. Перед привязкой сокета необходимо выдать SIO_ASSOCIATE_PORT_RESERVATION IOCTL. Если и когда сокет привязан, назначенный ему порт будет выбран из резервирования портов, определенного заданным токеном. Если из указанного резервирования нет доступных портов, вызов функции Bind завершится ошибкой.

Дополнительные сведения см. в справочнике по SIO_ASSOCIATE_PORT_RESERVATION .

SIO_ASSOCIATE_PORT_RESERVATION поддерживается в Windows Vista и более поздних версиях операционной системы.

SIO_BASE_HANDLE (параметр opcode: O, T==1)

Извлекает базовый дескриптор поставщика услуг для заданного сокета. Возвращаемое значение — SOCKET.

Многоуровневый поставщик услуг никогда не должен перехватывать этот IOCTL, так как возвращаемое значение должно быть дескриптором сокета от базового поставщика службы.

Если выходной буфер недостаточно велик для дескриптора сокета ( cbOutBuffer меньше размера SOCKET) или параметр lpvOutBuffer является указателем NULL , SOCKET_ERROR возвращается в результате этого IOCTL, а WSAGetLastError возвращает WSAEFAULT.

SIO_BASE_HANDLE определяется в файле заголовка Mswsock.h и поддерживается в Windows Vista и более поздних версиях.

SIO_BSP_HANDLE (параметр кода операции: O, T==1)

Извлекает базовый дескриптор поставщика услуг для сокета, используемого функцией WSASendMsg . Возвращаемое значение — SOCKET.

Этот Ioctl используется многоуровневым поставщиком услуг, чтобы убедиться, что поставщик перехватывает функцию WSASendMsg .

Если выходной буфер недостаточно велик для дескриптора сокета ( cbOutBuffer меньше размера SOCKET) или параметр lpvOutBuffer является указателем NULL , SOCKET_ERROR возвращается в результате этого IOCTL, а WSAGetLastError возвращает WSAEFAULT.

SIO_BSP_HANDLE определяется в файле заголовка Mswsock.h и поддерживается в Windows Vista и более поздних версиях.

SIO_BSP_HANDLE_SELECT (параметр кода операции: O, T==1)

Извлекает базовый дескриптор поставщика услуг для сокета, используемого функцией select . Возвращаемое значение — SOCKET.

Этот Ioctl используется многоуровневой службой, чтобы убедиться, что поставщик перехватывает функцию select .

Если выходной буфер недостаточно велик для дескриптора сокета ( cbOutBuffer меньше размера SOCKET) или параметр lpvOutBuffer является указателем NULL , SOCKET_ERROR возвращается в результате этого IOCTL, а WSAGetLastError возвращает WSAEFAULT.

SIO_BSP_HANDLE_SELECT определяется в файле заголовка Mswsock.h и поддерживается в Windows Vista и более поздних версиях.

SIO_BSP_HANDLE_POLL (параметр кода операции: O, T==1)

Извлекает базовый дескриптор поставщика услуг для сокета, используемого функцией WSAPoll . Параметр lpOverlapped должен быть указателем NULL . Возвращаемое значение — SOCKET.

Этот Ioctl используется многоуровневым поставщиком услуг, чтобы убедиться, что поставщик перехватывает функцию WSAPoll .

Если выходной буфер недостаточно велик для дескриптора сокета ( cbOutBuffer меньше размера SOCKET), параметр lpvOutBuffer является указателем NULL или параметр lpOverlapped не является указателем NULL , SOCKET_ERROR возвращается в результате выполнения этого IOCTL, а WSAGetLastError возвращает WSAEFAULT.

SIO_BSP_HANDLE_POLL определяется в файле заголовка Mswsock.h и поддерживается в Windows Vista и более поздних версиях.

SIO_CHK_QOS (параметр opcode: I, O, T==3)

Извлекает сведения о характеристиках трафика QoS. На переходном этапе в системе отправки между настройкой потока и получением сообщения RESV (дополнительные сведения о переходном этапе см. в разделе Как служба RSVP вызывает TC) трафик, связанный с потоком RSVP, формируется в зависимости от типа службы (BEST EFFORT, CONTROLLED LOAD или GUARANTEED). Дополнительные сведения см. в разделе Использование SIO_CHK_QOS в разделе Качество обслуживания пакета средств разработки программного обеспечения платформы (SDK).

SIO_ENABLE_CIRCULAR_QUEUEING (параметр кода операции: V, T==1)

Указывает поставщику служб, ориентированных на сообщения, что только что отправленное сообщение никогда не должно быть удалено из-за переполнения очереди буфера. Вместо этого следует исключить самое старое сообщение в очереди, чтобы вместить только что отправленное сообщение. Входные и выходные буферы не требуются. Обратите внимание, что этот IOCTL действителен только для сокетов, связанных с ненадежными протоколами, ориентированными на сообщения. Код ошибки WSAENOPROTOOPT указан для поставщиков служб, которые не поддерживают этот IOCTL.

SIO_FIND_ROUTE (параметры кода операции: O, T==1)

При выдаче этот IOCTL запрашивает обнаружение маршрута на удаленный адрес, указанный в качестве sockaddr во входном буфере. Если адрес уже существует в локальном кэше, его запись становится недействительной. В случае с IPX Novell этот вызов инициирует IPX GetLocalTarget (GLT), который запрашивает у сети заданный удаленный адрес.

SIO_FLUSH (параметр opcode: V, T==1)

Удаляет текущее содержимое очереди отправки, связанной с этим сокетом. Входные и выходные буферы не требуются. Код ошибки WSAENOPROTOOPT указан для поставщиков служб, которые не поддерживают этот IOCTL.

SIO_GET_BROADCAST_ADDRESS (параметр opcode: O, T==1)

Этот IOCTL заполняет выходной буфер структурой sockaddr, содержащей подходящий широковещательный адрес для использования с LPWSPSendTo.

SIO_GET_EXTENSION_FUNCTION_POINTER (параметры opcode: O, I, T==1)

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

Значения GUID для функций расширения, поддерживаемых поставщиком служб WINDOWS TCP/IP, определяются в файле заголовка Mswsock.h . Возможные значения для этих идентификаторов GUID:

Термин Описание
WSAID_ACCEPTEX
Функция расширения AcceptEx .
WSAID_CONNECTEX
Функция расширения ConnectEx .
WSAID_DISCONNECTEX
Функция расширения DisconnectEx .
WSAID_GETACCEPTEXSOCKADDRS
Функция расширения GetAcceptExSockaddrs .
WSAID_TRANSMITFILE
Функция расширения TransmitFile .
WSAID_TRANSMITPACKETS
Функция расширения TransmitPackets .
WSAID_WSARECVMSG
Функция расширения LPFN_WSARECVMSG (WSARecvMsg).
WSAID_WSASENDMSG
Функция расширения WSASendMsg .

 

SIO_GET_GROUP_QOS (параметр opcode: O, T==1)

Зарезервировано.

SIO_GET_INTERFACE_LIST (параметр opcode: O, T==0)

Возвращает список настроенных IP-интерфейсов и их параметров в виде массива INTERFACE_INFO структур.

Примечание

Поддержка этой команды является обязательной для поставщиков служб TCP/IP, совместимых с Windows Sockets 2.

 

Параметр lpvOutBuffer указывает на буфер, в котором хранятся сведения об интерфейсах в виде массива структур INTERFACE_INFO для одноадресных IP-адресов в интерфейсах. Параметр cbOutBuffer указывает длину выходного буфера. Количество возвращенных интерфейсов (количество структур, возвращаемых в буфере, на который указывает параметр lpvOutBuffer ) можно определить на основе фактической длины выходного буфера, возвращаемого в параметре lpcbBytesReturned .

Если функция WSAIoctl вызывается с SIO_GET_INTERFACE_LIST и член уровня параметра socket s не определен как IPPROTO_IP, возвращается WSAEINVAL . Вызов функции WSAIoctl с SIO_GET_INTERFACE_LIST возвращает WSAEFAULT , если параметр cbOutBuffer , указывающий длину выходного буфера, слишком мал, получает список настроенных интерфейсов.

SIO_GET_INTERFACE_LIST_EX (параметры кода операции: O, T==0)

Зарезервировано для использования в будущем с сокетами.

Возвращает список настроенных IP-интерфейсов и их параметров в виде массива INTERFACE_INFO_EX структур.

Параметр lpvOutBuffer указывает на буфер, в котором хранятся сведения об интерфейсах в виде массива INTERFACE_INFO_EX структур для одноадресных IP-адресов в интерфейсе. Параметр cbOutBuffer указывает длину выходного буфера. Количество возвращенных интерфейсов (количество структур, возвращаемых в lpvOutBuffer) можно определить на основе фактической длины выходного буфера, возвращаемого в параметре lpcbBytesReturned .

SIO_GET_INTERFACE_LIST_EX в настоящее время не поддерживается в Windows.

SIO_GET_QOS (параметры кода операции: O, T==1)

Извлекает структуру QOS, связанную с сокетом. Входной буфер является необязательным. Некоторые протоколы (например, RSVP) позволяют использовать входной буфер для определения запроса QOS . Структура QOS будет скопирована в выходной буфер. Размер выходного буфера должен быть достаточно большим, чтобы он мог содержать полную структуру QOS . Код ошибки WSAENOPROTOOPT указан для поставщиков услуг, которые не поддерживают качество обслуживания.

SIO_IDEAL_SEND_BACKLOG_CHANGE (параметр opcode: V, T==0)

Уведомляет приложение при изменении значения идеального значения невыполненной работы по отправке (ISB) для базового подключения.

При отправке данных через TCP-подключение с помощью сокетов Windows важно сохранить в TCP достаточный объем незавершенных данных (отправленных, но еще не подтвержденных) для достижения максимальной пропускной способности. Идеальное значение для объема невыполненных данных для достижения наилучшей пропускной способности для TCP-подключения называется идеальным размером невыполненной работы по отправке (ISB). Значение ISB является функцией продукта задержки пропускной способности TCP-соединения и объявленного окна получения получателя (и отчасти объема перегрузки в сети).

Значение ISB для каждого подключения доступно в реализации протокола TCP в Windows Server 2008, Windows Vista с пакетом обновления 1 (SP1) и более поздних версиях операционной системы. SIO_IDEAL_SEND_BACKLOG_CHANGE IOCTL может использоваться приложением для получения уведомлений о динамическом изменении значения ISB для подключения.

Дополнительные сведения см. в справочнике по SIO_IDEAL_SEND_BACKLOG_CHANGE .

SIO_IDEAL_SEND_BACKLOG_CHANGE поддерживается в Windows Server 2008, Windows Vista с пакетом обновления 1 (SP1) и более поздних версиях операционной системы.

SIO_IDEAL_SEND_BACKLOG_QUERY (параметр opcode: O, T==0)

Извлекает идеальное значение невыполненной работы по отправке (ISB) для базового подключения.

При отправке данных через TCP-подключение с помощью сокетов Windows важно сохранить в TCP достаточный объем незавершенных данных (отправленных, но еще не подтвержденных) для достижения максимальной пропускной способности. Идеальное значение для объема невыполненных данных для достижения наилучшей пропускной способности для TCP-подключения называется идеальным размером невыполненной работы по отправке (ISB). Значение ISB является функцией продукта задержки пропускной способности TCP-соединения и объявленного окна получения получателя (и отчасти объема перегрузки в сети).

Значение ISB для каждого подключения доступно в реализации протокола TCP в Windows Server 2008 и более поздних версиях. SIO_IDEAL_SEND_BACKLOG_QUERY IOCTL может использоваться приложением для запроса значения ISB для подключения.

Дополнительные сведения см. в справочнике по SIO_IDEAL_SEND_BACKLOG_QUERY .

SIO_IDEAL_SEND_BACKLOG_QUERY поддерживается в Windows Server 2008, Windows Vista с пакетом обновления 1 (SP1) и более поздних версиях операционной системы.

SIO_KEEPALIVE_VALS (параметр кода операции: I, T==3)

Включает или отключает параметр для каждого подключения параметра tcp keep-alive , который задает время ожидания и интервал tcp-поддержания активности. Дополнительные сведения о параметре поддержания активности см. в разделе 4.2.3.6 в разделе Требования к узлам Интернета — уровни связи , указанные в RFC 1122, доступные на веб-сайте IETF.

SIO_KEEPALIVE_VALS можно использовать для включения или отключения проб поддержания активности, а также для задания времени ожидания и интервала поддержания активности. Время ожидания активности указывает время ожидания (в миллисекундах) без активности, пока не будет отправлен первый пакет поддержания активности. Интервал поддержания активности указывает интервал в миллисекундах между отправкой последовательных пакетов поддержания активности, если подтверждение не получено.

Параметр SO_KEEPALIVE , который является одним из SOL_SOCKET параметров сокета, также можно использовать для включения или отключения поддержки TCP при подключении, а также для запроса текущего состояния этого параметра. Чтобы запросить, включена ли поддержка TCP в сокете, можно вызвать функцию getsockopt с параметром SO_KEEPALIVE . Чтобы включить или отключить функцию поддержания активности TCP, можно вызвать функцию setsockopt с параметром SO_KEEPALIVE . Если поддержка активности TCP включена с SO_KEEPALIVE, параметры TCP по умолчанию используются для времени ожидания и интервала поддержания активности, если эти значения не были изменены с помощью SIO_KEEPALIVE_VALS.

Дополнительные сведения см. в справочнике по SIO_KEEPALIVE_VALS . SIO_KEEPALIVE_VALS поддерживается в Windows 2000 и более поздних версиях.

SIO_MULTIPOINT_LOOPBACK (параметр opcode: I, T==1)

Определяет, будут ли данные, отправленные приложением на локальном компьютере (не обязательно с помощью одного и того же сокета) в сеансе многоадресной рассылки, получаться сокетом, присоединенным к целевой группе многоадресной рассылки в интерфейсе замыкания на себя. Значение TRUE приводит к тому, что данные многоадресной рассылки, отправляемые приложением на локальном компьютере, доставляются в прослушивающий сокет в интерфейсе замыкания на себя. Значение FALSE предотвращает доставку многоадресных данных, отправленных приложением на локальном компьютере, в прослушивающий сокет в интерфейсе замыкания на себя. По умолчанию SIO_MULTIPOINT_LOOPBACK включен.

SIO_MULTICAST_SCOPE (параметр кода операции: I, T==1)

Указывает область, по которым будет осуществляться многоадресная рассылка. Область определяется как количество сегментов перенаправленной сети, которые должны быть охвачены. Область, равное нулю, указывает, что многоадресная передача не будет размещаться по проводу, но может быть распространена по сокетам в локальном узле. Значение область 1 (по умолчанию) указывает, что передача будет помещена по проводу, но не будет пересекать маршрутизаторы. Более высокие значения область определяют количество маршрутизаторов, которые можно пересечь. Обратите внимание, что это соответствует параметру срока жизни (TTL) в многоадресной рассылке IP.

SIO_QUERY_RSS_SCALABILITY_INFO (параметр opcode: O, T==3)

Запросы разгружают интерфейсы для возможности масштабирования на стороне приема (RSS). Структура аргументов, возвращаемая для SIO_QUERY_RSS_SCALABILITY_INFO , указывается в структуре RSS_SCALABILITY_INFO , определенной в файле заголовка Mstcpip.h . Эта структура определяется следующим образом.

void CALLBACK 
CompletionRoutine(  
  IN DWORD           dwError, 
  IN DWORD           cbTransferred, 
  IN LPWSAOVERLAPPED lpOverlapped, 
  IN DWORD           dwFlags 
);

Значение, возвращаемое в элементе RssEnabled , указывает, включен ли RSS хотя бы в одном интерфейсе.

Если выходной буфер недостаточно велик для структуры RSS_SCALABILITY_INFO ( cbOutBuffer меньше размера RSS_SCALABILITY_INFO) или параметр lpvOutBuffer является указателем NULL , SOCKET_ERROR возвращается в результате этого IOCTL, а WSAGetLastError возвращает WSAEINVAL.

В высокоскоростных сетях, где несколько ЦП находятся в одной системе, возможность стека сетевых протоколов хорошо масштабироваться в системе с несколькими ЦП блокируется, так как архитектура NDIS 5.1 и более ранних версий ограничивает обработку протокола одним ЦП. Масштабирование на стороне приема (RSS) устраняет эту проблему, позволяя распределять сетевую нагрузку сетевого адаптера между несколькими ЦП.

SIO_QUERY_RSS_SCALABILITY_INFO поддерживается в Windows Vista и более поздних версиях.

SIO_QUERY_WFP_ALE_ENDPOINT_HANDLE (параметр opcode: O, T==3)

Запрашивает дескриптор конечной точки принудительного применения прикладного уровня (ALE).

Платформа фильтрации Windows (ВПП) поддерживает проверку и изменение сетевого трафика. В Windows Vista ВПП фокусируется на сценариях, в которых главный компьютер является конечной точкой связи. Однако в Windows Server 2008 существуют реализации пограничного брандмауэра, которые хотели бы использовать платформу ВПП для проверки и сквозного трафика прокси-сервера. Сервер Internet Security and Acceleration (ISA) является примером такого пограничного устройства.

В некоторых сценариях брандмауэра может потребоваться возможность внедрения входящего пакета в путь отправки, связанный с существующей конечной точкой. Необходим механизм обнаружения дескриптора конечной точки транспортного уровня, связанного с конечной точкой назначения. Приложение, создающее конечную точку, владеет этими конечными точками транспортного уровня. Этот IOCTL используется для предоставления дескриптора сокета для сопоставления дескрипторов конечной точки транспортного уровня.

Если выходной буфер недостаточно велик для дескриптора конечной точки ( cbOutBuffer меньше размера UINT64) или параметр lpvOutBuffer является указателем NULL , SOCKET_ERROR возвращается в результате этого IOCTL, а WSAGetLastError возвращает WSAEINVAL.

SIO_QUERY_WFP_ALE_ENDPOINT_HANDLE поддерживается в Windows Vista и более поздних версиях.

SIO_QUERY_PNP_TARGET_HANDLE (параметр кода операции: O, T==1)

Получение дескриптора сокета следующего поставщика в цепочке, от которой зависит текущий сокет в смысле PnP. Этот IOCTL вызывается библиотекой DLL Windows Sockets 2 только для сокетов поставщиков служб, не относящихся к IFS, созданных с помощью вызова WPUCreateSocketHandle . Поставщик должен вернуть в выходном буфере дескриптор сокета следующего поставщика в цепочке, от которой зависит данный дескриптор сокета в смысле PnP (например, удаление устройства, поддерживающего базовый дескриптор, приведет к аннулированию дескриптора выше него в цепочке).

Если перекрывающаяся операция завершается немедленно, эта функция возвращает нулевое значение, а параметр lpcbBytesReturned обновляется с учетом количества байтов в выходном буфере. Если перекрывающаяся операция успешно запущена и завершится позже, эта функция возвращает SOCKET_ERROR и указывает код ошибки WSA_IO_PENDING. В этом случае lpcbBytesReturned не обновляется. После завершения перекрывающейся операции объем данных в выходном буфере указывается либо с помощью параметра cbTransferred в подпрограмме завершения (если указано), либо с помощью параметра lpcbTransfer в LPWSPGetOverlappedResult.

SIO_RCVALL (параметр opcode: I, T==3)

Позволяет сокету получать все пакеты IPv4 или IPv6, проходящие через сетевой интерфейс. Дескриптор сокета, передаваемый в функцию WSAIoctl , должен быть одним из следующих:

  • Сокет IPv4, созданный с семейством адресов, для AF_INET, для типа сокета задано значение SOCK_RAW, а для протокола задано значение IPPROTO_IP.
  • Сокет IPv6, созданный с семейством адресов, для AF_INET6, для типа сокета задано значение SOCK_RAW, а для протокола задано значение IPPROTO_IPV6.

Сокет также должен быть привязан к явному локальному интерфейсу IPv4 или IPv6. Это означает, что невозможно выполнить привязку к INADDR_ANY или in6addr_any.

В Windows Server 2008 и более ранних версиях параметр IOCTL SIO_RCVALL не будет записывать локальные пакеты, отправленные из сетевого интерфейса. Это включало пакеты, полученные на другом интерфейсе и переадресовывые сетевые интерфейсы, указанные для SIO_RCVALL IOCTL.

В Windows 7 и Windows Server 2008 R2 этот параметр был изменен, чтобы локальные пакеты, отправленные из сетевого интерфейса, также записывались. Сюда входят пакеты, полученные на другом интерфейсе, а затем перенаправляемые сетевой интерфейс, привязанный к сокету с SIO_RCVALL IOCTL.

Для установки этого IOCTL требуются права администратора на локальном компьютере.

Эту функцию иногда называют неизвестным режимом.

Возможные значения для параметра IOCTL SIO_RCVALL указываются в перечислении RCVALL_VALUE , определенном в файле заголовка Mstcpip.h . Ниже приведены возможные значения для SIO_RCVALL.

Термин Описание
RCVALL_OFF
Отключите этот параметр, чтобы сокет не получал все пакеты IPv4 или IPv6 в сети.
RCVALL_ON
Включите этот параметр, чтобы сокет получал все пакеты IPv4 или IPv6 в сети. Этот параметр включает неизвестный режим в сетевом интерфейсе карта (NIC), если сетевой адаптер поддерживает неизвестный режим. В сегменте локальной сети с сетевым концентратором сетевая карта, поддерживающая неизменяемый режим, будет захватывать весь трафик IPv4 или IPv6 в локальной сети, включая трафик между другими компьютерами в том же сегменте локальной сети. Все захваченные пакеты (IPv4 или IPv6, в зависимости от сокета) будут доставлены в необработанный сокет.
Этот параметр не будет захватывать другие пакеты (например, ARP, IPX и NetBEUI) в интерфейсе.
Netmon использует тот же режим для сетевого интерфейса, но не использует этот параметр для сбора трафика.
RCVALL_SOCKETLEVELONLY
Эта функция в настоящее время не реализована, поэтому установка этого параметра не оказывает никакого влияния.
RCVALL_IPLEVEL
Включите этот параметр, чтобы сокет IPv4 или IPv6 получал все пакеты на уровне IP-адресов в сети. Этот параметр не включает неизвестный режим в сетевом интерфейсе карта. Этот параметр влияет только на обработку пакетов на уровне IP-адресов. Сетевой адаптер по-прежнему получает только пакеты, направленные на настроенные одноадресные и многоадресные адреса. Однако сокет с включенным параметром будет принимать не только пакеты, направленные на определенные IP-адреса, но и все пакеты IPv4 или IPv6, получаемые сетевой картой.
Этот параметр не будет захватывать другие пакеты (например, пакеты ARP, IPX и NetBEUI), полученные в интерфейсе.

Дополнительные сведения см. в справочнике по SIO_RCVALL .

SIO_RCVALL поддерживается в Windows 2000 и более поздних версиях.

SIO_RELEASE_PORT_RESERVATION (параметр opcode: I, T==3)

Освобождает резервирование среды выполнения для блока портов TCP или UDP. Резервирование среды выполнения для освобождения должно быть получено из процесса выдачи с помощью SIO_ACQUIRE_PORT_RESERVATION IOCTL.

Дополнительные сведения см. в справочнике по SIO_RELEASE_PORT_RESERVATION .

SIO_RELEASE_PORT_RESERVATION поддерживается в Windows Vista и более поздних версиях операционной системы.

SIO_ROUTING_INTERFACE_CHANGE (параметр кода операции: I, T==1)

Для получения уведомления об изменении интерфейса маршрутизации, которое должно использоваться для доступа к удаленному адресу во входном буфере (указывается в виде структуры sockaddr ). Никакие выходные данные о новом интерфейсе маршрутизации не будут предоставлены по завершении этого IOCTL; завершение просто указывает, что интерфейс маршрутизации для данного назначения изменился и должен запрашиваться с помощью SIO_ROUTING_INTERFACE_QUERY IOCTL.

Предполагается (хотя и не обязательно), что приложение использует перекрывающиеся операции ввода-вывода, чтобы получать уведомления об изменении интерфейса маршрутизации путем выполнения запроса SIO_ROUTING_INTERFACE_CHANGE . Кроме того, если SIO_ROUTING_INTERFACE_CHANGE IOCTL выдается в неблокирующем сокете с параметрами lpOverlapped и lpCompletionRoutine , установленными в значение NULL, он немедленно завершается с ошибкой WSAEWOULDBLOCK и клиент SPI-сокета Windows может ждать событий изменения маршрутизации с помощью вызова LPWSPEventSelect или LPWSPAsyncSelect с FD_ROUTING_INTERFACE_CHANGE битом, заданным в битовой маске сетевых событий.

Признается, что сведения о маршрутизации в большинстве случаев остаются стабильными, поэтому требование, чтобы приложение сохраняло несколько необработанных ICTL для получения уведомлений обо всех интересующих его назначениях, а также того, чтобы поставщик услуг отслеживал эти запросы на уведомления, будет использовать значительный объем системных ресурсов. Этой ситуации можно избежать, расширив значение входных параметров и ослабив требования поставщика услуг следующим образом:

Клиент SPI windows Sockets может указать адрес с подстановочными знаками для конкретного семейства протоколов (такой же, как в вызове Bind при запросе привязки к любому доступному адресу), чтобы запросить уведомления об изменениях маршрутизации. Это позволяет клиенту SPI-сокетов Windows хранить только одну выдающуюся SIO_ROUTING_INTERFACE_CHANGE для всех сокетов и назначений, а затем использовать SIO_ROUTING_INTERFACE_QUERY для получения фактических сведений о маршрутизации.

Поставщик услуг может проигнорировать сведения, предоставляемые клиентом SPI сокетов Windows во входном буфере SIO_ROUTING_INTERFACE_CHANGE (как если бы клиент Windows Sockets SPI указал подстановочный адрес) и завершить SIO_ROUTING_INTERFACE_CHANGE IOCTL или событие FD_ROUTING_INTERFACE_CHANGE сигнала в случае изменения информации маршрутизации (а не только маршрут к месту назначения, указанному во входном буфере).

SIO_ROUTING_INTERFACE_QUERY (параметр opcode: I, O, T==1)

Для получения адреса локального интерфейса (представленного в виде структуры sockaddr ), который следует использовать для отправки на удаленный адрес, указанный во входном буфере (как sockaddr). Адреса удаленной многоадресной рассылки можно отправить во входной буфер, чтобы получить адрес предпочтительного интерфейса для многоадресной передачи. В любом случае возвращенный адрес интерфейса может использоваться приложением в последующем запросе Bind .

Обратите внимание, что маршруты могут быть изменены. Таким образом, клиенты SPI-сокета Windows не могут полагаться на сведения, возвращаемые SIO_ROUTING_INTERFACE_QUERY , быть постоянными. Клиенты SPI могут регистрироваться для маршрутизации уведомлений об изменениях с помощью SIO_ROUTING_INTERFACE_CHANGE IOCTL, который предоставляет уведомления через перекрывающиеся операции ввода-вывода или события FD_ROUTING_INTERFACE_CHANGE. Следующую последовательность действий можно использовать, чтобы гарантировать, что клиент SPI-сокета Windows всегда имеет текущие сведения об интерфейсе маршрутизации для заданного назначения:

  • Проблема SIO_ROUTING_INTERFACE_CHANGE IOCTL.
  • Проблема SIO_ROUTING_INTERFACE_QUERY IOCTL.
  • Всякий раз , когда SIO_ROUTING_INTERFACE_CHANGE IOCTL уведомляет клиент WinSock SPI об изменении маршрутизации (через перекрывающиеся операции ввода-вывода или сигнализируя о событии FD_ROUTING_INTERFACE_CHANGE), следует повторять всю последовательность действий.

Если выходной буфер недостаточно велик, чтобы содержать адрес интерфейса, SOCKET_ERROR возвращается в результате этого IOCTL, а WSAGetLastError возвращает WSAEFAULT. В этом случае требуемый размер выходного буфера будет возвращен в lpcbBytesReturned . Обратите внимание, что код ошибки WSAEFAULT также возвращается, если параметр lpvInBuffer, lpvOutBuffer или lpcbBytesReturned не полностью содержится в допустимой части адресного пространства пользователя.

Если адрес назначения, указанный во входном буфере, недоступен через любой из доступных интерфейсов, SOCKET_ERROR возвращается в результате этого IOCTL, а WSAGetLastError возвращает WSAENETUNREACH или даже WSAENETDOWN в случае потери всех сетевых подключений.

SIO_SET_COMPATIBILITY_MODE (параметр opcode: I, T==3)

Запрашивает, как сетевой стек должен обрабатывать определенные поведения, для которых способ обработки поведения по умолчанию может отличаться в разных версиях Windows. Структура аргументов для SIO_SET_COMPATIBILITY_MODE указывается в WSA_COMPATIBILITY_MODE структуре, определенной в файле заголовка Mswsockdef.h . Эта структура определяется следующим образом:

} WSA_COMPATIBILITY_MODE, *PWSA_COMPATIBILITY_MODE;

Значение, указанное в элементе BehaviorId , указывает на запрошенное поведение. Значение, указанное в элементе TargetOsVersion , указывает версию Windows, запрашиваемую для поведения.

Элемент BehaviorId может быть одним из значений из типа перечисления WSA_COMPATIBILITY_BEHAVIOR_ID , определенного в файле заголовка Mswsockdef.h . Ниже приведены возможные значения для элемента BehaviorId .

Термин Описание
WsaBehaviorAll
Это эквивалентно запросу всех возможных совместимых поведений, определенных для WSA_COMPATIBILITY_BEHAVIOR_ID.
WsaBehaviorReceiveBuffering
Если для элемента TargetOsVersion задано значение для Windows Vista или более поздней версии, уменьшение размера буфера приема TCP в этом сокете с помощью параметра сокета SO_RCVBUF допускается даже после установки TCP-подключения.
Если для элемента TargetOsVersion задано значение, предшествующее Windows Vista, уменьшение размера буфера приема TCP в этом сокете с помощью параметра сокета SO_RCVBUF не допускается после установки подключения.
WsaBehaviorAutoTuning
Если для элемента TargetOsVersion задано значение для Windows Vista или более поздней версии, включена автоматическая настройка окна получения, а коэффициент масштабирования окна TCP уменьшается до 2 из значения по умолчанию 8.
Если для параметра TargetOsVersion задано значение, предшествующее Windows Vista, автоматическая настройка окна получения отключена. Параметр масштабирования окна TCP также отключен, а максимальный размер окна получения ограничен 65 535 байтами. Параметр масштабирования окна TCP не может быть согласован для подключения, даже если для этого сокета был вызван параметр сокета SO_RCVBUF , задающий значение больше 65 535 байт до установки подключения.

 

Дополнительные сведения см. в справочнике по SIO_SET_COMPATIBILITY_MODE .

SIO_SET_COMPATIBILITY_MODE поддерживается в Windows Vista и более поздних версиях.

SIO_SET_GROUP_QOS (параметр кода операции: I, T==1)

Зарезервировано.

SIO_SET_QOS (параметр opcode: I, T==1)

Свяжите предоставленную структуру QOS с сокетом. Выходной буфер не требуется, структура QOS будет получена из входного буфера. Код ошибки WSAENOPROTOOPT указан для поставщиков услуг, которые не поддерживают качество обслуживания.

SIO_TRANSLATE_HANDLE (параметр opcode: I, O, T==1)

Чтобы получить соответствующий дескриптор для сокетов , допустимый в контексте интерфейса-компаньона (например, TH_NETDEV и TH_TAPI). Во входном буфере указывается константа манифеста, определяющая сопутствующий интерфейс, а также любые другие необходимые параметры. Соответствующий дескриптор будет доступен в выходном буфере после завершения этой функции. Дополнительные сведения см. в соответствующем разделе в приложении windows Sockets 2 Protocol-Specific и /или документации для конкретного интерфейса-компаньона. Код ошибки WSAENOPROTOOPT указан для поставщиков служб, которые не поддерживают этот IOCTL для указанного интерфейса-компаньона. Этот IOCTL извлекает дескриптор, связанный с помощью SIO_TRANSLATE_HANDLE.

Рекомендуется использовать COM вместо этого IOCTL для обнаружения и отслеживания других интерфейсов, которые могут поддерживаться сокетом. Этот IOCTL используется для обеспечения обратной совместимости с системами, где COM недоступен или не может использоваться по какой-либо другой причине.

SIO_UDP_CONNRESET (параметр кода операции: I, T==3)

Windows XP: Определяет, передаются ли сообщения PORT_UNREACHABLE UDP. Установите значение TRUE , чтобы включить отчеты. Установите значение FALSE , чтобы отключить отчеты.

При вызове с перекрывающимся сокетом параметр lpOverlapped должен быть действителен в течение всего времени перекрывающейся операции.

Если параметр lpCompletionRoutine имеет значение NULL, поставщик услуг сообщает члену hEventlpOverlapped при завершении перекрывающейся операции, если она содержит допустимый дескриптор объекта события. Клиент WINDOWS Sockets SPI может использовать LPWSPGetOverlappedResult для опроса или ожидания объекта события.

Если lpCompletionRoutine не имеет значение NULL, элемент hEvent игнорируется и может использоваться клиентом SPI сокетов Windows для передачи контекстных сведений в подпрограмму завершения. Клиент, который передает ненулевое значение lpCompletionRoutine и более поздние версии вызывает WSAGetOverlappedResult для того же перекрывающегося запроса ввода-вывода, может не задать для параметра fWait для этого вызова WSAGetOverlappedResult значение TRUE. В этом случае использование элемента hEvent не определено, и попытка дождаться члена hEvent приведет к непредсказуемым результатам.

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

Поставщик услуг упорядочивает выполнение функции в правильном контексте потока и процесса, вызывая WPUQueueApc. Эту функцию можно вызывать из любого контекста процесса и потока, даже из контекста, отличного от потока и процесса, который использовался для запуска перекрывающейся операции.

WPUQueueApc принимает в качестве входных параметров указатель на структуру WSATHREADID (предоставляется поставщику через входной параметр lpThreadId ), указатель на вызываемую функцию APC и 32-битовое значение контекста, которое затем передается в функцию APC. Так как доступно только одно 32-разрядное значение контекста, сама функция APC не может быть указанной клиентом подпрограммой завершения. Поставщик услуг должен вместо этого предоставить указатель на собственную функцию APC, которая использует предоставленное значение контекста для доступа к необходимой результирующим сведениям для перекрывающейся операции, а затем вызывает подпрограмму завершения, указанную клиентом.

Ниже приведен прототип процедуры завершения, предоставляемой клиентом.

);

CompletionRoutine — это заполнитель для предоставленной клиентом функции. DwError указывает состояние завершения перекрывающейся операции, как указано в lpOverlapped. CbTransferred указывает количество возвращаемых байтов. В настоящее время значения флагов не определены, а dwFlags будет равно нулю. Эта функция не возвращает значение.

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

Совместимость

Коды IOCTL с T == 0 являются подмножеством кодов IOCTL, используемых в сокетах Беркли. В частности, не существует команды, эквивалентной FIOASYNC.

Примечание

Все операции ввода-вывода, инициированные данным потоком, отменяются при выходе из этого потока. Для перекрывающихся сокетов ожидающие асинхронные операции могут завершиться сбоем, если поток закрывается до завершения операций. Дополнительные сведения см. в разделе ExitThread .

Требования

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

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

WPUQueueApc

LPWSPGetSockopt

LPWSPSetSockOpt

LPWSPSocket