Share via


Código de control SIO_RCVALL

Descripción

El código de control SIO_RCVALL permite que un socket reciba todos los paquetes IPv4 o IPv6 que pasan a través de una interfaz de red.

Para realizar esta operación, llame a la función WSAIoctl o WSPIoctl con los parámetros siguientes.

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

Descriptor que identifica un socket.

dwIoControlCode

Código de control para la operación. Use SIO_RCVALL para esta operación.

lpvInBuffer

Puntero al búfer de entrada que debe contener el valor de opción. Los valores posibles para la opción SIO_RCVALL IOCTL se especifican en la enumeración RCVALL_VALUE definida en el archivo de encabezado Mstcpip.h .

Los valores posibles para SIO_RCVALL son los siguientes:

Valor Significado
RCVALL_OFF Deshabilite esta opción para que un socket no reciba todos los paquetes IPv4 o IPv6 que pasan a través de una interfaz de red.
RCVALL_ON Habilite esta opción para que un socket reciba todos los paquetes IPv4 o IPv6 que pasan a través de una interfaz de red. Esta opción habilita el modo promiscuo en la tarjeta de interfaz de red (NIC), si la NIC admite el modo promiscuo. En un segmento LAN con un centro de red, una NIC que admita el modo promiscuo capturará todo el tráfico IPv4 o IPv6 en la LAN, incluido el tráfico entre otros equipos del mismo segmento LAN. Todos los paquetes capturados (IPv4 o IPv6, según el socket) se entregarán al socket sin procesar. Esta opción no capturará otros paquetes (paquetes ARP, IPX y NetBEUI, por ejemplo) en la interfaz. Netmon usa el mismo modo para la interfaz de red, pero no usa esta opción para capturar el tráfico.
RCVALL_SOCKETLEVELONLY Esta característica no está implementada actualmente, por lo que establecer esta opción no tiene ningún efecto.
RCVALL_IPLEVEL Habilite esta opción para que un socket IPv4 o IPv6 reciba todos los paquetes en el nivel ip que pasa a través de una interfaz de red. Esta opción no habilita el modo promiscuo en la tarjeta de interfaz de red. Esta opción solo afecta al procesamiento de paquetes en el nivel de IP. La NIC sigue recibiendo solo paquetes dirigidos a sus direcciones de unidifusión y multidifusión configuradas. Sin embargo, un socket con esta opción habilitada no solo recibirá paquetes dirigidos a direcciones IP específicas, sino que recibirá todos los paquetes IPv4 o IPv6 que recibe la NIC. Esta opción no capturará otros paquetes (paquetes ARP, IPX y NetBEUI, por ejemplo) recibidos en la interfaz.

cbInBuffer

Tamaño, en bytes, del búfer de entrada. Este parámetro debe ser igual o mayor que el tamaño del RCVALL_VALUE valor de enumeración al que apunta el parámetro lpvInBuffer .

lpvOutBuffer

Puntero al búfer de salida. Este parámetro no se usa para esta operación.

cbOutBuffer

Tamaño, en bytes, del búfer de salida. Este parámetro no se usa para esta operación.

lpcbBytesReturned

Puntero a una variable que recibe el tamaño, en bytes, de los datos almacenados en el búfer de salida. Este parámetro no se usa para esta operación.

lpvOverlapped

Puntero a una estructura WSAOVERLAPPED .

Si el socket se creó sin el atributo superpuesto, se omite el parámetro lpOverlapped .

Si se abrió con el atributo superpuesto y el parámetro lpOverlapped no es NULL, la operación se realiza como una operación superpuesta (asincrónica). En este caso, el parámetro lpOverlapped debe apuntar a una estructura WSAOVERLAPPED válida.

En el caso de las operaciones superpuestas, la función WSAIoctl o WSPIoctl devuelve inmediatamente y el método de finalización adecuado se señala cuando se ha completado la operación. De lo contrario, la función no devuelve hasta que se haya completado la operación o se produzca un error.

lpCompletionRoutine

Tipo: _In_opt_ LPWSAOVERLAPPED_COMPLETION_ROUTINE

Puntero a la rutina de finalización a la que se llama cuando se ha completado la operación (se omite para sockets no superpuestos).

lpThreadId

Puntero a una estructura WSATHREADID que va a usar el proveedor en una llamada posterior a WPUQueueApc. El proveedor debe almacenar la estructura WSATHREADID a la que se hace referencia (no el puntero a la misma) hasta que se devuelva la función WPUQueueApc .

Nota Este parámetro solo se aplica a la función WSPIoctl .

lpErrno

Puntero al código de error.

Nota Este parámetro solo se aplica a la función WSPIoctl .

Valor devuelto

Si la operación se completa correctamente, la función WSAIoctl o WSPIoctl devuelve cero.

Si se produce un error en la operación o está pendiente, la función WSAIoctl o WSPIoctl devuelve SOCKET_ERROR. Para obtener información de error extendida, llame a WSAGetLastError.

Código de error Significado
WSA_IO_PENDING Una operación superpuesta se inició correctamente y la finalización se indicará en un momento posterior.
WSA_OPERATION_ABORTED Se canceló una operación superpuesta debido al cierre del socket o a la ejecución del comando SIO_FLUSH IOCTL.
WSAEFAULT El parámetro lpOverlapped o lpCompletionRoutine no está totalmente incluido en una parte válida del espacio de direcciones del usuario.
WSAEINPROGRESS La función se invoca cuando hay una devolución de llamada en curso.
WSAEINTR Se interrumpió una operación de bloqueo.
WSAEINVAL El parámetro dwIoControlCode no es un comando válido o un parámetro de entrada especificado no es aceptable o el comando no es aplicable al tipo de socket especificado. Este error también se devuelve si el parámetro cbInBuffer es menor que o sizeof(UCHAR) el parámetro lpvInBuffer apunta al valor que no es un valor de enumeración RCVALL_VALUE . Este error también se puede devolver si no se encuentra la interfaz de red asociada al socket. Esto puede ocurrir si la interfaz de red asociada al socket se elimina o quita (por ejemplo, un dispositivo de red PCMCIA o USB).
WSAENETDOWN Error en el subsistema de red.
WSAENOBUFS No hay espacio de búfer disponible.
WSAENOPROTOOPT La opción de socket no se admite en el protocolo especificado.
WSAENOTSOCK El descriptor s no es un socket.
WSAEOPNOTSUPP No se admite el comando IOCTL especificado. Este error se devuelve si el proveedor de transporte no admite el SIO_RCVALL IOCTL.

Observaciones

El SIO_RCVALL IOCTL es compatible con Windows 2000 y versiones posteriores del sistema operativo.

El SIO_RCVALL IOCTL permite que un socket reciba todos los paquetes IPv4 o IPv6 en una interfaz de red. El identificador de socket pasado a la función WSAIoctl o WSPIoctl debe ser uno de los siguientes:

  • Un socket IPv4 que se creó con la familia de direcciones establecida en AF_INET, el tipo de socket establecido en SOCK_RAW y el protocolo establecido en IPPROTO_IP.
  • Un socket IPv6 que se creó con la familia de direcciones establecida en AF_INET6, el tipo de socket establecido en SOCK_RAW y el protocolo establecido en IPPROTO_IPV6.

Para obtener más información sobre los sockets sin procesar, consulte Sockets sin formato TCP/IP.

El socket también debe estar enlazado a una interfaz IPv4 o IPv6 local explícita, lo que significa que no se puede enlazar a INADDR_ANY o in6addr_any.

Una vez enlazado el socket y el IOCTL se completa correctamente, las llamadas a las funciones WSARecv o recv devuelven datagramas IPv4 que pasan por la interfaz IPv4 especificada o devuelven datagramas IPv6 que pasan a través de la interfaz IPv6 especificada. Tenga en cuenta que debe proporcionar un búfer suficientemente grande. Establecer este IOCTL solo capturará paquetes IPv4 o IPv6 en una interfaz determinada. Este IOCTL no capturará otros paquetes (paquetes ARP, IPX y NetBEUI, por ejemplo) en la interfaz.

Un socket enlazado a una interfaz local específica con el SIO_RCVALL IOCTL recibirá solo los paquetes que pasan a través de esa interfaz. No recibirá paquetes recibidos en otra interfaz y se reenvía en otra interfaz diferente del socket enlazado con SIO_RCVALL IOCTL.

En Windows Server 2008 y versiones anteriores, la configuración de SIO_RCVALL IOCTL no capturaría los paquetes locales enviados fuera de una interfaz de red. Esto incluía los paquetes recibidos en otra interfaz y reenviaron la interfaz de red especificada para el SIO_RCVALL IOCTL.

En Windows 7 y Windows Server 2008 R2 , esto se cambió para que los paquetes locales enviados fuera de una interfaz de red también se capturen. Esto incluye los paquetes recibidos en otra interfaz y, a continuación, reenvía la interfaz de red enlazada al socket con SIO_RCVALL IOCTL.

Establecer este IOCTL requiere privilegios de administrador en el equipo local.

Esta característica se conoce a veces como modo promiscuo. No se admite ningún cambio directo al aplicar esta opción en una interfaz y, a continuación, a otra interfaz con una sola llamada mediante este IOCTL. En primer lugar, una aplicación debe usar este IOCTL para desactivar el comportamiento en la primera interfaz y, a continuación, usar este IOCTL para habilitar el comportamiento en una nueva interfaz.

Vea también

socket

Sockets sin formato TCP/IP

WSAGetLastError

WSAGetOverlappedResult

WSAIoctl

WSAOVERLAPPED

WSASocketA

WSASocketW