Code de contrôle SIO_RCVALL

Description

Le code de contrôle SIO_RCVALL permet à un socket de recevoir tous les paquets IPv4 ou IPv6 passant par une interface réseau.

Pour effectuer cette opération, appelez la fonction WSAIoctl ou WSPIoctl avec les paramètres suivants.

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

Paramètres

s

Descripteur identifiant un socket.

dwIoControlCode

Code de contrôle pour l’opération. Utilisez SIO_RCVALL pour cette opération.

lpvInBuffer

Pointeur vers la mémoire tampon d’entrée qui doit contenir la valeur d’option. Les valeurs possibles pour l’option IOCTL SIO_RCVALL sont spécifiées dans l’énumération RCVALL_VALUE définie dans le fichier d’en-tête Mstcpip.h .

Les valeurs possibles pour SIO_RCVALL sont les suivantes :

Valeur Signification
RCVALL_OFF Désactivez cette option afin qu’un socket ne reçoive pas tous les paquets IPv4 ou IPv6 passant via une interface réseau.
RCVALL_ON Activez cette option pour qu’un socket reçoive tous les paquets IPv4 ou IPv6 passant par une interface réseau. Cette option active le mode promiscuous sur l’interface réseau carte (carte réseau), si la carte réseau prend en charge le mode promiscuous. Sur un segment LAN avec un hub réseau, une carte réseau qui prend en charge le mode promiscuous capture tout le trafic IPv4 ou IPv6 sur le réseau local, y compris le trafic entre d’autres ordinateurs sur le même segment LAN. Tous les paquets capturés (IPv4 ou IPv6, selon le socket) sont remis au socket brut. Cette option ne capture pas d’autres paquets (paquets ARP, IPX et NetBEUI, par exemple) sur l’interface. Netmon utilise le même mode pour l’interface réseau, mais n’utilise pas cette option pour capturer le trafic.
RCVALL_SOCKETLEVELONLY Cette fonctionnalité n’étant pas implémentée actuellement, la définition de cette option n’a aucun impact.
RCVALL_IPLEVEL Activez cette option pour qu’un socket IPv4 ou IPv6 reçoive tous les paquets au niveau IP passant par une interface réseau. Cette option n’active pas le mode promiscuous sur l’interface réseau carte. Cette option affecte uniquement le traitement des paquets au niveau de l’adresse IP. La carte réseau reçoit toujours uniquement des paquets dirigés vers ses adresses de monodiffusion et de multidiffusion configurées. Toutefois, un socket avec cette option activée recevra non seulement des paquets dirigés vers des adresses IP spécifiques, mais recevra également tous les paquets IPv4 ou IPv6 que la carte réseau reçoit. Cette option ne capture pas les autres paquets (paquets ARP, IPX et NetBEUI, par exemple) reçus sur l’interface.

cbInBuffer

Taille, en octets, de la mémoire tampon d’entrée. Ce paramètre doit être égal ou supérieur à la taille de la valeur d’énumération RCVALL_VALUE pointée par le paramètre lpvInBuffer .

lpvOutBuffer

Pointeur vers la mémoire tampon de sortie. Ce paramètre n’est pas utilisé pour cette opération.

cbOutBuffer

Taille, en octets, de la mémoire tampon de sortie. Ce paramètre n’est pas utilisé pour cette opération.

lpcbBytesReturned

Pointeur vers une variable qui reçoit la taille, en octets, des données stockées dans la mémoire tampon de sortie. Ce paramètre n’est pas utilisé pour cette opération.

lpvOverlapped

Pointeur vers une structure WSAOVERLAPPED .

Si le socket s a été créé sans l’attribut superposé, le paramètre lpOverlapped est ignoré.

Si s a été ouvert avec l’attribut qui se chevauche et que le paramètre lpOverlapped n’a pas la valeur NULL, l’opération est effectuée en tant qu’opération (asynchrone) qui se chevauche. Dans ce cas, le paramètre lpOverlapped doit pointer vers une structure WSAOVERLAPPED valide.

Pour les opérations qui se chevauchent, la fonction WSAIoctl ou WSPIoctl retourne immédiatement, et la méthode d’achèvement appropriée est signalée une fois l’opération terminée. Sinon, la fonction ne retourne pas tant que l’opération n’est pas terminée ou qu’une erreur se produit.

lpCompletionRoutine

Type : _In_opt_ LPWSAOVERLAPPED_COMPLETION_ROUTINE

Pointeur vers la routine d’achèvement appelée une fois l’opération terminée (ignorée pour les sockets qui ne se chevauchent pas).

lpThreadId

Pointeur vers une structure WSATHREADID à utiliser par le fournisseur dans un appel ultérieur à WPUQueueApc. Le fournisseur doit stocker la structure WSATHREADID référencée (pas le pointeur vers le même) jusqu’à ce que la fonction WPUQueueApc soit retournée.

Note Ce paramètre s’applique uniquement à la fonction WSPIoctl .

lpErrno

Pointeur vers le code d’erreur.

Note Ce paramètre s’applique uniquement à la fonction WSPIoctl .

Valeur retournée

Si l’opération se termine correctement, la fonction WSAIoctl ou WSPIoctl retourne zéro.

Si l’opération échoue ou est en attente, la fonction WSAIoctl ou WSPIoctl retourne SOCKET_ERROR. Pour obtenir des informations d’erreur étendues, appelez WSAGetLastError.

Code d'erreur Signification
WSA_IO_PENDING Une opération superposée a été lancée avec succès et l’achèvement sera indiqué ultérieurement.
WSA_OPERATION_ABORTED Une opération qui se chevauche a été annulée en raison de la fermeture du socket ou de l’exécution de la commande IOCTL SIO_FLUSH .
WSAEFAULT Le paramètre lpOverlapped ou lpCompletionRoutine n’est pas totalement contenu dans une partie valide de l’espace d’adressage utilisateur.
WSAEINPROGRESS La fonction est appelée lorsqu’un rappel est en cours.
WSAEINTR Une opération de blocage a été interrompue.
WSAEINVAL Le paramètre dwIoControlCode n’est pas une commande valide, ou un paramètre d’entrée spécifié n’est pas acceptable, ou la commande n’est pas applicable au type de socket spécifié. Cette erreur est également retournée si le paramètre cbInBuffer est inférieur à ou sizeof(UCHAR) si le paramètre lpvInBuffer pointe vers une valeur qui n’est pas une valeur d’énumération RCVALL_VALUE . Cette erreur peut également être retournée si l’interface réseau associée au socket est introuvable. Cela peut se produire si l’interface réseau associée au socket est supprimée ou supprimée (un périphérique réseau PCMCIA ou USB de suppression, par exemple).
WSAENETDOWN Le sous-système réseau a échoué.
WSAENOBUFS Aucun espace de mémoire tampon disponible.
WSAENOPROTOOPT L’option socket n’est pas prise en charge sur le protocole spécifié.
WSAENOTSOCK Le descripteur s n’est pas un socket.
WSAEOPNOTSUPP La commande IOCTL spécifiée n’est pas prise en charge. Cette erreur est retournée si le SIO_RCVALL IOCTL n’est pas pris en charge par le fournisseur de transport.

Notes

La SIO_RCVALL IOCTL est prise en charge sur Windows 2000 et versions ultérieures du système d’exploitation.

La SIO_RCVALL IOCTL permet à un socket de recevoir tous les paquets IPv4 ou IPv6 sur une interface réseau. Le handle de socket passé à la fonction WSAIoctl ou WSPIoctl doit être l’un des suivants :

  • Un socket IPv4 créé avec la famille d’adresses définie sur AF_INET, le type de socket défini sur SOCK_RAW et le protocole défini sur IPPROTO_IP.
  • Un socket IPv6 créé avec la famille d’adresses définie sur AF_INET6, le type de socket défini sur SOCK_RAW et le protocole défini sur IPPROTO_IPV6.

Pour plus d’informations sur les sockets bruts, consultez Sockets bruts TCP/IP.

Le socket doit également être lié à une interface IPv4 ou IPv6 locale explicite, ce qui signifie que vous ne pouvez pas lier à INADDR_ANY ou in6addr_any.

Une fois que le socket est lié et que l’IOCTL se termine correctement, les appels aux fonctions WSARecv ou recv retournent des datagrammes IPv4 passant par l’interface IPv4 donnée ou retournent des datagrammes IPv6 passant par l’interface IPv6 donnée. Notez que vous devez fournir une mémoire tampon suffisamment grande. La définition de ce IOCTL capture uniquement les paquets IPv4 ou IPv6 sur une interface donnée. Cet IOCTL ne capture pas d’autres paquets (paquets ARP, IPX et NetBEUI, par exemple) sur l’interface.

Un socket lié à une interface locale spécifique avec le SIO_RCVALL IOCTL recevra uniquement les paquets passant par cette interface. Il ne recevra pas les paquets reçus sur une autre interface et transférés sur une autre interface différente du socket lié à SIO_RCVALL IOCTL.

Sur Windows Server 2008 et versions antérieures, le paramètre IOCTL SIO_RCVALL ne capture pas les paquets locaux envoyés à partir d’une interface réseau. Cela incluait les paquets reçus sur une autre interface et transférés vers l’interface réseau spécifiée pour le SIO_RCVALL IOCTL.

Sur Windows 7 et Windows Server 2008 R2 , cela a été modifié afin que les paquets locaux envoyés à partir d’une interface réseau soient également capturés. Cela inclut les paquets reçus sur une autre interface, puis transférés hors de l’interface réseau liée au socket avec SIO_RCVALL IOCTL.

La définition de ce IOCTL nécessite des privilèges d’administrateur sur l’ordinateur local.

Cette fonctionnalité est parfois appelée mode promiscuous. Toute modification directe de l’application de cette option sur une interface, puis sur une autre interface avec un seul appel à l’aide de ce IOCTL n’est pas prise en charge. Une application doit d’abord utiliser cet IOCTL pour désactiver le comportement sur la première interface, puis utiliser cet IOCTL pour activer le comportement sur une nouvelle interface.

Voir aussi

socket

Sockets bruts TCP/IP

WSAGetLastError

WSAGetOverlappedResult

WSAIoctl

WSAOVERLAPPED

WSASocketA

WSASocketW