Share via


Código de controle SIO_RCVALL

Descrição

O código de controle SIO_RCVALL permite que um soquete receba todos os pacotes IPv4 ou IPv6 que passam por um adaptador de rede.

Para executar essa operação, chame a função WSAIoctl ou WSPIoctl com os parâmetros a seguir.

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
);

Parâmetros

s

Um descritor que identifica um soquete.

Dwiocontrolcode

O código de controle para a operação. Use SIO_RCVALL para esta operação.

Lpvinbuffer

Um ponteiro para o buffer de entrada que deve conter o valor da opção. Os valores possíveis para a opção SIO_RCVALL IOCTL são especificados na enumeração RCVALL_VALUE definida no arquivo de cabeçalho Mstcpip.h .

Os valores possíveis para SIO_RCVALL são os seguintes:

Valor Significado
RCVALL_OFF Desabilite essa opção para que um soquete não receba todos os pacotes IPv4 ou IPv6 que passam por um adaptador de rede.
RCVALL_ON Habilite essa opção para que um soquete receba todos os pacotes IPv4 ou IPv6 que passam por um adaptador de rede. Essa opção habilita o modo promíscuo na NIC (cartão de interface de rede), se a NIC der suporte ao modo promíscuo. Em um segmento lan com um hub de rede, uma NIC que dá suporte ao modo promíscuo capturará todo o tráfego IPv4 ou IPv6 na LAN, incluindo o tráfego entre outros computadores no mesmo segmento lan. Todos os pacotes capturados (IPv4 ou IPv6, dependendo do soquete) serão entregues ao soquete bruto. Essa opção não capturará outros pacotes (pacotes ARP, IPX e NetBEUI, por exemplo) na interface. O Netmon usa o mesmo modo para o adaptador de rede, mas não usa essa opção para capturar o tráfego.
RCVALL_SOCKETLEVELONLY Esse recurso não está implementado no momento, portanto, definir essa opção não tem nenhum efeito.
RCVALL_IPLEVEL Habilite essa opção para que um soquete IPv4 ou IPv6 receba todos os pacotes no nível de IP passando por um adaptador de rede. Essa opção não habilita o modo promíscuo na interface de rede cartão. Essa opção afeta apenas o processamento de pacotes no nível de IP. A NIC ainda recebe apenas pacotes direcionados para seus endereços unicast e multicast configurados. No entanto, um soquete com essa opção habilitada receberá não apenas pacotes direcionados a endereços IP específicos, mas receberá todos os pacotes IPv4 ou IPv6 que a NIC recebe. Essa opção não capturará outros pacotes (pacotes ARP, IPX e NetBEUI, por exemplo) recebidos na interface.

Cbinbuffer

O tamanho, em bytes, do buffer de entrada. Esse parâmetro deve ser igual ou maior que o tamanho do valor de enumeração RCVALL_VALUE apontado pelo parâmetro lpvInBuffer .

Lpvoutbuffer

Um ponteiro para o buffer de saída. Esse parâmetro não é usado para essa operação.

cbOutBuffer

O tamanho, em bytes, do buffer de saída. Esse parâmetro não é usado para essa operação.

Lpcbbytesreturned

Um ponteiro para uma variável que recebe o tamanho, em bytes, dos dados armazenados no buffer de saída. Esse parâmetro não é usado para essa operação.

lpvOverlapped

Um ponteiro para uma estrutura WSAOVERLAPPED .

Se soquete s tiver sido criado sem o atributo sobreposto, o parâmetro lpOverlapped será ignorado.

Se s tiver sido aberto com o atributo sobreposto e o parâmetro lpOverlapped não for NULL, a operação será executada como uma operação sobreposta (assíncrona). Nesse caso, o parâmetro lpOverlapped deve apontar para uma estrutura WSAOVERLAPPED válida.

Para operações sobrepostas, a função WSAIoctl ou WSPIoctl retorna imediatamente e o método de conclusão apropriado é sinalizado quando a operação é concluída. Caso contrário, a função não retornará até que a operação seja concluída ou ocorra um erro.

Lpcompletionroutine

Tipo: _In_opt_ LPWSAOVERLAPPED_COMPLETION_ROUTINE

Um ponteiro para a rotina de conclusão chamado quando a operação foi concluída (ignorado para soquetes não sobrepostos).

lpThreadId

Um ponteiro para uma estrutura WSATHREADID a ser usada pelo provedor em uma chamada subsequente para WPUQueueApc. O provedor deve armazenar a estrutura WSATHREADID referenciada (não o ponteiro para o mesmo) até que a função WPUQueueApc retorne.

Nota Esse parâmetro se aplica somente à função WSPIoctl .

Lperrno

Um ponteiro para o código de erro.

Nota Esse parâmetro se aplica somente à função WSPIoctl .

Valor retornado

Se a operação for concluída com êxito, a função WSAIoctl ou WSPIoctl retornará zero.

Se a operação falhar ou estiver pendente, a função WSAIoctl ou WSPIoctl retornará SOCKET_ERROR. Para obter informações de erro estendidas, chame WSAGetLastError.

Código do erro Significado
WSA_IO_PENDING Uma operação sobreposta foi iniciada com êxito e a conclusão será indicada posteriormente.
WSA_OPERATION_ABORTED Uma operação sobreposta foi cancelada devido ao fechamento do soquete ou à execução do comando IOCTL SIO_FLUSH .
WSAEFAULT O parâmetro lpOverlapped ou lpCompletionRoutine não está totalmente contido em uma parte válida do espaço de endereço do usuário.
WSAEINPROGRESS A função é invocada quando um retorno de chamada está em andamento.
WSAEINTR Uma operação de bloqueio foi interrompida.
WSAEINVAL O parâmetro dwIoControlCode não é um comando válido ou um parâmetro de entrada especificado não é aceitável ou o comando não é aplicável ao tipo de soquete especificado. Esse erro também será retornado se o parâmetro cbInBuffer for menor que o sizeof(UCHAR) ou o parâmetro lpvInBuffer apontar para o valor que não é um valor de enumeração RCVALL_VALUE . Esse erro também poderá ser retornado se o adaptador de rede associado ao soquete não puder ser encontrado. Isso poderá ocorrer se o adaptador de rede associado ao soquete for excluído ou removido (um dispositivo de rede REMOVE PCMCIA ou USB, por exemplo).
WSAENETDOWN O subsistema de rede falhou.
WSAENOBUFS Nenhum espaço de buffer disponível.
WSAENOPROTOOPT Não há suporte para a opção de soquete no protocolo especificado.
WSAENOTSOCK O descritor s não é um soquete.
WSAEOPNOTSUPP Não há suporte para o comando IOCTL especificado. Esse erro será retornado se o SIO_RCVALL IOCTL não tiver suporte do provedor de transporte.

Comentários

O SIO_RCVALL IOCTL tem suporte no Windows 2000 e versões posteriores do sistema operacional.

O SIO_RCVALL IOCTL permite que um soquete receba todos os pacotes IPv4 ou IPv6 em um adaptador de rede. O identificador de soquete passado para a função WSAIoctl ou WSPIoctl deve ser um dos seguintes:

  • Um soquete IPv4 criado com a família de endereços definida como AF_INET, o tipo de soquete definido como SOCK_RAW e o protocolo definido como IPPROTO_IP.
  • Um soquete IPv6 que foi criado com a família de endereços definida como AF_INET6, o tipo de soquete definido como SOCK_RAW e o protocolo definido como IPPROTO_IPV6.

Para obter mais informações sobre soquetes brutos, consulte Soquetes brutos TCP/IP.

O soquete também deve estar associado a uma interface IPv4 ou IPv6 local explícita, o que significa que você não pode se associar a INADDR_ANY ou in6addr_any.

Depois que o soquete é associado e o IOCTL é concluído com êxito, as chamadas para as funções WSARecv ou recv retornam datagramas IPv4 passando pela interface IPv4 fornecida ou retornam datagramas IPv6 passando pela interface IPv6 fornecida. Observe que você deve fornecer um buffer suficientemente grande. Definir esse IOCTL capturará apenas pacotes IPv4 ou IPv6 em uma determinada interface. Esse IOCTL não capturará outros pacotes (pacotes ARP, IPX e NetBEUI, por exemplo) na interface.

Um soquete associado a uma interface local específica com o SIO_RCVALL IOCTL receberá apenas pacotes que passam por essa interface. Ele não receberá pacotes recebidos em outra interface e será encaminhado em outra interface diferente do soquete associado a SIO_RCVALL IOCTL.

No Windows Server 2008 e anteriores, a configuração ioctl SIO_RCVALL não capturaria pacotes locais enviados de um adaptador de rede. Isso incluiu pacotes recebidos em outra interface e encaminhou o adaptador de rede especificado para o SIO_RCVALL IOCTL.

No Windows 7 e no Windows Server 2008 R2, isso foi alterado para que os pacotes locais enviados de um adaptador de rede também sejam capturados. Isso inclui pacotes recebidos em outra interface e, em seguida, encaminhou o adaptador de rede associado ao soquete com SIO_RCVALL IOCTL.

Definir esse IOCTL requer privilégio de administrador no computador local.

Às vezes, esse recurso é chamado de modo promíscuo. Não há suporte para qualquer alteração direta da aplicação dessa opção em uma interface e, em seguida, para outra interface com uma única chamada usando esse IOCTL. Um aplicativo deve primeiro usar esse IOCTL para desativar o comportamento na primeira interface e, em seguida, usar esse IOCTL para habilitar o comportamento em uma nova interface.

Confira também

soquete

Soquetes brutos TCP/IP

Wsagetlasterror

Wsagetoverlappedresult

Wsaioctl

WSAOVERLAPPED

WSASocketA

WSASocketW