Код элемента управления SIO_RCVALL
Описание
Код элемента управления SIO_RCVALL позволяет сокету получать все пакеты IPv4 или IPv6, проходящие через сетевой интерфейс.
Для выполнения этой операции вызовите функцию WSAIoctl или WSPIoctl со следующими параметрами.
int WSAIoctl(
(socket) s, // descriptor identifying a socket
SIO_RCV_ALL, // dwIoControlCode
NULL, // lpvInBuffer
0, // cbInBuffer
NULL, // lpvOutBuffer output buffer
(DWORD) cbOutBuffer, // size of output buffer
(LPDWORD) lpcbBytesReturned, // number of bytes returned
(LPWSAOVERLAPPED) lpOverlapped, // OVERLAPPED structure
(LPWSAOVERLAPPED_COMPLETION_ROUTINE) lpCompletionRoutine, // completion routine
);
Параметры
s
Дескриптор, определяющий сокет.
dwIoControlCode
Код элемента управления для операции. Для этой операции используйте SIO_RCVALL .
lpvInBuffer
Указатель на входной буфер, который должен содержать значение параметра. Возможные значения для параметра IOCTL SIO_RCVALL указываются в перечислении RCVALL_VALUE , определенном в файле заголовка Mstcpip.h .
Возможные значения для SIO_RCVALL :
Значение | Значение |
---|---|
RCVALL_OFF | Отключите этот параметр, чтобы сокет не получал все пакеты IPv4 или IPv6, проходящие через сетевой интерфейс. |
RCVALL_ON | Включите этот параметр, чтобы сокет получал все пакеты IPv4 или IPv6, проходящие через сетевой интерфейс. Этот параметр включает неразборчивый режим на сетевом интерфейсе карта , если сетевой адаптер поддерживает неразборчивый режим. В сегменте локальной сети с сетевым концентратором сетевая карта, поддерживающая неразборчивый режим, будет записывать весь трафик IPv4 или IPv6 в локальной сети, включая трафик между другими компьютерами в том же сегменте локальной сети. Все захваченные пакеты (IPv4 или IPv6, в зависимости от сокета) будут доставлены в необработанный сокет. Этот параметр не будет записывать другие пакеты (например, ARP, IPX и NetBEUI) в интерфейсе. Netmon использует тот же режим для сетевого интерфейса, но не использует этот параметр для отслеживания трафика. |
RCVALL_SOCKETLEVELONLY | Эта функция в настоящее время не реализована, поэтому настройка этого параметра не влияет. |
RCVALL_IPLEVEL | Включите этот параметр, чтобы сокет IPv4 или IPv6 получал все пакеты на уровне IP-адресов, проходящих через сетевой интерфейс. Этот параметр не включает неразборчивый режим на сетевом интерфейсе карта. Этот параметр влияет только на обработку пакетов на уровне IP-адреса. Сетевой адаптер по-прежнему получает только пакеты, направленные на настроенные одноадресные и многоадресные адреса. Однако сокет с включенным параметром будет получать не только пакеты, направленные на определенные IP-адреса, но и все пакеты IPv4 или IPv6, получаемые сетевой картой. Этот параметр не будет записывать другие пакеты (например, ARP, IPX и NetBEUI), полученные в интерфейсе. |
cbInBuffer
Размер входного буфера (в байтах). Этот параметр должен быть равен или больше значения перечисления RCVALL_VALUE , на которое указывает параметр lpvInBuffer .
lpvOutBuffer
Указатель на выходной буфер. Этот параметр не используется для этой операции.
cbOutBuffer
Размер выходного буфера (в байтах). Этот параметр не используется для этой операции.
lpcbBytesReturned
Указатель на переменную, которая получает размер данных в байтах, хранящихся в выходном буфере. Этот параметр не используется для этой операции.
lpvOverlapped
Указатель на структуру WSAOVERLAPPED .
Если сокеты были созданы без перекрывающихся атрибутов, параметр lpOverlapped игнорируется.
Если объект был открыт с перекрывающимся атрибутом, а параметр lpOverlapped не имеет значения NULL, операция выполняется как перекрываемая (асинхронная) операция. В этом случае параметр lpOverlapped должен указывать на допустимую структуру WSAOVERLAPPED .
Для перекрывающихся операций функция WSAIoctl или WSPIoctl возвращается немедленно, а соответствующий метод завершения получает сигнал о завершении операции. В противном случае функция не возвращается, пока операция не будет завершена или не возникнет ошибка.
lpCompletionRoutine
Тип: _In_opt_ LPWSAOVERLAPPED_COMPLETION_ROUTINE
Указатель на подпрограмму завершения, вызываемую при завершении операции (игнорируется для неперекрывающихся сокетов).
lpThreadId
Указатель на структуру WSATHREADID , которая будет использоваться поставщиком при последующем вызове WPUQueueApc. Поставщик должен хранить указанную структуру WSATHREADID (а не указатель на нее) до тех пор, пока не будет возвращена функция WPUQueueApc .
Примечание Этот параметр применяется только к функции WSPIoctl .
lpErrno
Указатель на код ошибки.
Примечание Этот параметр применяется только к функции WSPIoctl .
Возвращаемое значение
Если операция завершается успешно, функция WSAIoctl или WSPIoctl возвращает ноль.
Если операция завершается сбоем или находится в состоянии ожидания, функция WSAIoctl или WSPIoctl возвращает SOCKET_ERROR. Чтобы получить расширенные сведения об ошибке, вызовите WSAGetLastError.
Код ошибки | Значение |
---|---|
WSA_IO_PENDING | Перекрываемая операция была успешно инициирована, а завершение будет указано позже. |
WSA_OPERATION_ABORTED | Перекрываемая операция была отменена из-за закрытия сокета или выполнения команды IOCTL SIO_FLUSH . |
WSAEFAULT | Параметр lpOverlapped или lpCompletionRoutine не полностью содержится в допустимой части адресного пространства пользователя. |
WSAEINPROGRESS | Функция вызывается при выполнении обратного вызова. |
WSAEINTR | Операция блокировки была прервана. |
WSAEINVAL | Параметр dwIoControlCode не является допустимой командой, заданный входной параметр недопустим, или команда не применима к указанному типу сокета. Эта ошибка также возвращается, если параметр cbInBuffer меньше sizeof(UCHAR) или параметр lpvInBuffer указывает на значение, которое не является значением перечисления RCVALL_VALUE. Эта ошибка также может быть возвращена, если не удается найти сетевой интерфейс, связанный с сокетом. Это может произойти при удалении или удалении сетевого интерфейса, связанного с сокетом (например, при удалении PCMCIA или сетевого usb-устройства). |
WSAENETDOWN | Произошел сбой сетевой подсистемы. |
WSAENOBUFS | Буферное пространство недоступно. |
WSAENOPROTOOPT | Параметр сокета не поддерживается в указанном протоколе. |
WSAENOTSOCK | Дескриптор s не является сокетом. |
WSAEOPNOTSUPP | Указанная команда IOCTL не поддерживается. Эта ошибка возвращается, если SIO_RCVALL IOCTL не поддерживается поставщиком транспорта. |
Комментарии
IOCTL SIO_RCVALL поддерживается в Windows 2000 и более поздних версиях операционной системы.
IOCTL SIO_RCVALL позволяет сокету получать все пакеты IPv4 или IPv6 на сетевом интерфейсе. Дескриптор сокета, передаваемый в функцию WSAIoctl или WSPIoctl , должен быть одним из следующих:
- Сокет IPv4, созданный с семейством адресов, для AF_INET, для типа сокета задано значение SOCK_RAW, а для протокола задано значение IPPROTO_IP.
- Сокет IPv6, созданный с семейством адресов, для AF_INET6, для типа сокета задано значение SOCK_RAW, а для протокола задано значение IPPROTO_IPV6.
Дополнительные сведения о необработанных сокетах см. в разделе Необработанные сокеты TCP/IP.
Сокет также должен быть привязан к явному локальному интерфейсу IPv4 или IPv6. Это означает, что невозможно выполнить привязку к INADDR_ANY или in6addr_any.
После привязки сокета и успешного завершения IOCTL вызовы функций WSARecv или recv возвращают датаграммы IPv4, проходящие через заданный интерфейс IPv4, или возвращают датаграммы IPv6, проходящие через заданный интерфейс IPv6. Обратите внимание, что необходимо предоставить достаточно большой буфер. Установка этого IOCTL будет записывать только пакеты IPv4 или IPv6 в заданном интерфейсе. Этот IOCTL не будет захватывать другие пакеты (например, ARP, IPX и NetBEUI) в интерфейсе.
Сокет, привязанный к определенному локальному интерфейсу с SIO_RCVALL IOCTL, будет получать только пакеты, проходящие через этот интерфейс. Он не будет получать пакеты, полученные в другом интерфейсе, и пересылаться на другой интерфейс, отличный от сокета, привязанного к SIO_RCVALL IOCTL.
В Windows Server 2008 и более ранних версиях параметр IOCTL SIO_RCVALL не будет записывать локальные пакеты, отправленные из сетевого интерфейса. Это включало пакеты, полученные на другом интерфейсе и переадресовывые сетевые интерфейсы, указанные для SIO_RCVALL IOCTL.
В Windows 7 и Windows Server 2008 R2 этот параметр был изменен, чтобы локальные пакеты, отправленные из сетевого интерфейса, также записывались. Сюда входят пакеты, полученные на другом интерфейсе, а затем перенаправляемые сетевой интерфейс, привязанный к сокету с SIO_RCVALL IOCTL.
Для установки этого IOCTL требуются права администратора на локальном компьютере.
Эту функцию иногда называют неизвестным режимом. Любое прямое изменение после применения этого параметра к одному интерфейсу, а затем к другому интерфейсу с одним вызовом, использующим этот IOCTL, не поддерживается. Приложение должно сначала использовать этот IOCTL, чтобы отключить поведение первого интерфейса, а затем использовать этот IOCTL для включения поведения в новом интерфейсе.