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

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

Синтаксис

int WSAAPI WSAIoctl(
  [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] s

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

[in] dwIoControlCode

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

[in] lpvInBuffer

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

[in] cbInBuffer

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

[out] lpvOutBuffer

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

[in] cbOutBuffer

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

[out] lpcbBytesReturned

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

[in] lpOverlapped

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

[in] lpCompletionRoutine

Тип: _In_opt_ LPWSAOVERLAPPED_COMPLETION_ROUTINE

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

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

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

Код ошибки Значение
WSA_IO_PENDING
Перекрываемая операция была успешно инициирована, а завершение будет указано позже.
WSAENETDOWN
Произошел сбой сетевой подсистемы.
WSAEFAULT
Параметр lpvInBuffer, lpvOutBuffer, lpcbBytesReturned, lpOverlapped или lpCompletionRoutine не полностью содержится в допустимой части адресного пространства пользователя или слишком мал параметр cbInBuffer или cbOutBuffer .
WSAEINVAL
Параметр dwIoControlCode не является допустимой командой, заданный входной параметр недопустим, или команда не применима к указанному типу сокета.
WSAEINPROGRESS
Функция вызывается при выполнении обратного вызова.
WSAENOTSOCK
Дескриптор s не является сокетом.
WSAEOPNOTSUPP
Указанная команда IOCTL не может быть реализована. (Например, структуры FLOWSPEC , указанные в SIO_SET_QOS или SIO_SET_GROUP_QOS , не могут быть удовлетворены.)
WSAEWOULDBLOCK
Сокет помечается как неблокирующий, и запрошенная операция будет блокироваться.
WSAENOPROTOOPT
Параметр сокета не поддерживается в указанном протоколе. Например, была предпринята попытка использовать SIO_GET_BROADCAST_ADDRESS IOCTL в сокете IPv6 или попытка использовать TCP-SIO_KEEPALIVE_VALS IOCTL в сокете датаграмм.

Комментарии

Функция WSAIoctl используется для задания или получения операционных параметров, связанных с сокетом, транспортным протоколом или подсистемой связи.

Если и lpOverlapped , и lpCompletionRoutine имеют значение NULL, сокет в этой функции будет рассматриваться как неперекрытый сокет. Для неперекрывающихся сокетов параметры lpOverlapped и lpCompletionRoutine игнорируются, что приводит к поведении функции, аналогичной стандартной функции ioctlsocket , за исключением того, что функция может блокировать, если сокет находится в режиме блокировки. Если сокет находится в режиме без блокировки, эта функция может возвращать WSAEWOULDBLOCK, если указанная операция не может быть немедленно завершена. В этом случае приложение может переключить сокет в режим блокировки и повторно отправить запрос или дождаться соответствующего сетевого события (например, FD_ROUTING_INTERFACE_CHANGE или FD_ADDRESS_LIST_CHANGE в случае SIO_ROUTING_INTERFACE_CHANGE или SIO_ADDRESS_LIST_CHANGE) с помощью сообщения Windows (с помощью WSAsyncSelect) или механизма уведомления на основе события (с помощью WSAEventSelect).

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

Любой IOCTL может блокироваться на неопределенный срок в зависимости от реализации поставщика услуг. Если приложение не допускает блокировки в вызове WSAIoctl , перекрывающиеся операции ввода-вывода будут рекомендованы для списков 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 , выглядит следующим образом:

#ifndef UNICODE
#define UNICODE
#endif

#define WIN32_LEAN_AND_MEAN

#include <winsock2.h>
#include <Ws2tcpip.h>
#include <stdio.h>

// Link with ws2_32.lib
#pragma comment(lib, "Ws2_32.lib")


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

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

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

I O V T Семейство поставщиков или адресов Код
3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
 
Примечание Биты в параметре dwIoControlCode , отображаемые в таблице, должны считываться по вертикали сверху вниз по столбцу. Таким образом, самый левый бит — бит 31, следующий бит — бит 30, а самый правый бит — бит 0.
 
Значение I задано, если входной буфер действителен для кода, как и в случае с IOC_IN.

O устанавливается, если выходной буфер действителен для кода, как и в случае с IOC_OUT. Коды управления с помощью входных и выходных буферов задают как I, так и O.

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

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

0 IOCTL — это стандартный код IOCTL Unix, как и FIONREAD и FIONBIO.

1 IOCTL — это универсальный код IOCTL windows Sockets 2. Новые коды IOCTL, определенные для сокетов Windows 2, будут иметь T == 1.

2 IOCTL применяется только к определенному семейству адресов.

3 IOCTL применяется только к поставщику определенного поставщика, как и IOC_VENDOR. Этот тип позволяет назначить компаниям номер поставщика, который отображается в параметре семейства "Поставщик/адрес ". Затем поставщик может определить новые ioCTL, относящиеся к этому поставщику, без необходимости регистрировать IOCTL в клиринговом центре, обеспечивая тем самым гибкость и конфиденциальность поставщика.

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

Код 16-разрядное количество, содержащее конкретный код IOCTL для операции.

Поддерживаются следующие коды IOCTL Unix (команды).

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

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

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

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

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

Ниже приведен прототип процедуры завершения.


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

Этот объект CompletionRoutine является заполнителем для определяемой приложением или библиотекой функции. Подпрограмма завершения вызывается только в том случае, если поток находится в состоянии предупреждения. Чтобы поместить поток в оповещенное состояние, используйте функцию WSAWaitForMultipleEvents, WaitForSingleObjectEx или WaitForMultipleObjectsEx с параметром fAlertable или bAlertable, равнымTRUE.

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

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

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

Коды IOCTL с T == 0 являются подмножеством кодов IOCTL, используемых в сокетах Беркли. В частности, не существует команды, эквивалентной FIOASYNC.
Примечание Для некоторых кодов IOCTL требуются дополнительные файлы заголовков. Например, для использования SIO_RCVALL IOCTL требуется файл заголовка Mstcpip.h.
 
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 winsock2.h
Библиотека Ws2_32.lib
DLL Ws2_32.dll

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

Параметры сокета SOL_SOCKET

WSASocket

Функции Winsock

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

getsockopt

ioctlsocket

setsockopt

Сокета