Condividi tramite


codice di controllo SIO_RCVALL

Descrizione

Il codice di controllo SIO_RCVALL consente a un socket di ricevere tutti i pacchetti IPv4 o IPv6 che passano attraverso un'interfaccia di rete.

Per eseguire questa operazione, chiamare la funzione WSAIoctl o WSPIoctl con i parametri seguenti.

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

Parametri

s

Descrittore che identifica un socket.

dwIoControlCode

Codice di controllo per l'operazione. Usare SIO_RCVALL per questa operazione.

lpvInBuffer

Puntatore al buffer di input che deve contenere il valore dell'opzione. I valori possibili per l'opzione IOCTL SIO_RCVALL sono specificati nell'enumerazione RCVALL_VALUE definita nel file di intestazione Mstcpip.h .

I valori possibili per SIO_RCVALL sono i seguenti:

Valore Significato
RCVALL_OFF Disabilitare questa opzione in modo che un socket non riceva tutti i pacchetti IPv4 o IPv6 che passano attraverso un'interfaccia di rete.
RCVALL_ON Abilitare questa opzione in modo che un socket riceva tutti i pacchetti IPv4 o IPv6 che passano attraverso un'interfaccia di rete. Questa opzione abilita la modalità promiscua nella scheda di interfaccia di rete (NIC), se la scheda di interfaccia di rete supporta la modalità promiscua. In un segmento LAN con un hub di rete, una scheda di interfaccia di rete che supporta la modalità promiscua acquisisce tutto il traffico IPv4 o IPv6 nella LAN, incluso il traffico tra altri computer nello stesso segmento LAN. Tutti i pacchetti acquisiti (IPv4 o IPv6, a seconda del socket) verranno recapitati al socket non elaborato. Questa opzione non acquisisce altri pacchetti (ARP, IPX e NetBEUI, ad esempio) nell'interfaccia. Netmon usa la stessa modalità per l'interfaccia di rete, ma non usa questa opzione per acquisire il traffico.
RCVALL_SOCKETLEVELONLY Questa funzionalità non è attualmente implementata, quindi l'impostazione di questa opzione non ha alcun effetto.
RCVALL_IPLEVEL Abilitare questa opzione in modo che un socket IPv4 o IPv6 riceva tutti i pacchetti a livello IP passando attraverso un'interfaccia di rete. Questa opzione non abilita la modalità promiscua nella scheda di interfaccia di rete. Questa opzione influisce solo sull'elaborazione dei pacchetti a livello IP. La scheda di interfaccia di rete riceve ancora solo pacchetti indirizzati ai relativi indirizzi unicast e multicast configurati. Tuttavia, un socket con questa opzione abilitato riceverà non solo pacchetti indirizzati a indirizzi IP specifici, ma riceverà tutti i pacchetti IPv4 o IPv6 ricevuti dalla scheda di interfaccia di rete. Questa opzione non acquisisce altri pacchetti (ARP, IPX e NetBEUI, ad esempio) ricevuti nell'interfaccia.

cbInBuffer

Dimensioni, in byte, del buffer di input. Questo parametro deve essere uguale o maggiore delle dimensioni del valore di enumerazione RCVALL_VALUE puntato dal parametro lpvInBuffer .

lpvOutBuffer

Puntatore al buffer di output. Questo parametro non viene usato per questa operazione.

cbOutBuffer

Dimensioni, in byte, del buffer di output. Questo parametro non viene usato per questa operazione.

lpcbBytesReturned

Puntatore a una variabile che riceve le dimensioni, in byte, dei dati archiviati nel buffer di output. Questo parametro non viene usato per questa operazione.

lpvOverlapped

Puntatore a una struttura WSAOVERLAPPED .

Se il socket s è stato creato senza l'attributo sovrapposto, il parametro lpOverlapped viene ignorato .

Se s è stato aperto con l'attributo sovrapposto e il parametro lpOverlapped non è NULL, l'operazione viene eseguita come operazione sovrapposta (asincrona). In questo caso, il parametro lpOverlapped deve puntare a una struttura WSAOVERLAPPED valida.

Per le operazioni sovrapposte, la funzione WSAIoctl o WSPIoctl restituisce immediatamente e il metodo di completamento appropriato viene segnalato al termine dell'operazione. In caso contrario, la funzione non restituisce finché l'operazione non è stata completata o si verifica un errore.

lpCompletionRoutine

Tipo: _In_opt_ LPWSAOVERLAPPED_COMPLETION_ROUTINE

Puntatore alla routine di completamento chiamata quando l'operazione è stata completata (ignorata per socket non sovrapposti).

lpThreadId

Puntatore a una struttura WSATHREADID da usare dal provider in una chiamata successiva a WPUQueueApc. Il provider deve archiviare la struttura WSATHREADID a cui fa riferimento (non lo stesso puntatore) fino a quando la funzione WPUQueueApc restituisce.

Nota Questo parametro si applica solo alla funzione WSPIoctl .

lpErrno

Puntatore al codice di errore.

Nota Questo parametro si applica solo alla funzione WSPIoctl .

Valore restituito

Se l'operazione viene completata correttamente, la funzione WSAIoctl o WSPIoctl restituisce zero.

Se l'operazione ha esito negativo o è in sospeso, la funzione WSAIoctl o WSPIoctl restituisce SOCKET_ERROR. Per ottenere informazioni sull'errore estese, chiamare WSAGetLastError.

Codice di errore Significato
WSA_IO_PENDING Un'operazione sovrapposta è stata avviata correttamente e il completamento verrà indicato in un secondo momento.
WSA_OPERATION_ABORTED Un'operazione sovrapposta è stata annullata a causa della chiusura del socket o dell'esecuzione del comando IOCTL SIO_FLUSH .
WSAEFAULT Il parametro lpOverlapped o lpCompletionRoutine non è totalmente contenuto in una parte valida dello spazio degli indirizzi utente.
WSAEINPROGRESS La funzione viene richiamata quando un callback è in corso.
WSAEINTR Un'operazione di blocco è stata interrotta.
WSAEINVAL Il parametro dwIoControlCode non è un comando valido o un parametro di input specificato non è accettabile oppure il comando non è applicabile al tipo di socket specificato. Questo errore viene restituito anche se il parametro cbInBuffer è minore del sizeof(UCHAR) parametro o il parametro lpvInBuffer punta al valore che non è un valore di enumerazione RCVALL_VALUE . Questo errore può essere restituito anche se non è possibile trovare l'interfaccia di rete associata al socket. Ciò può verificarsi se l'interfaccia di rete associata al socket viene eliminata o rimossa (ad esempio, un dispositivo di rete PCMCIA o USB).
WSAENETDOWN Il sottosistema di rete non è riuscito.
WSAENOBUFS Nessun spazio buffer disponibile.
WSAENOPROTOOPT L'opzione socket non è supportata nel protocollo specificato.
WSAENOTSOCK Il descrittore s non è un socket.
WSAEOPNOTSUPP Il comando IOCTL specificato non è supportato. Questo errore viene restituito se il SIO_RCVALL IOCTL non è supportato dal provider di trasporto.

Commenti

Il SIO_RCVALL IOCTL è supportato in Windows 2000 e versioni successive del sistema operativo.

Il SIO_RCVALL IOCTL consente a un socket di ricevere tutti i pacchetti IPv4 o IPv6 in un'interfaccia di rete. L'handle socket passato alla funzione WSAIoctl o WSPIoctl deve essere uno dei seguenti:

  • Socket IPv4 creato con la famiglia di indirizzi impostata su AF_INET, il tipo di socket impostato su SOCK_RAW e il protocollo impostato su IPPROTO_IP.
  • Socket IPv6 creato con la famiglia di indirizzi impostata su AF_INET6, tipo di socket impostato su SOCK_RAW e protocollo impostato su IPPROTO_IPV6.

Per altre informazioni sui socket non elaborati, vedere Socket non elaborati TCP/IP.

Il socket deve anche essere associato a un'interfaccia IPv4 o IPv6 locale esplicita, il che significa che non è possibile eseguire l'associazione a INADDR_ANY o in6addr_any.

Una volta che il socket è associato e L'IOCTL viene completato correttamente, le chiamate alle funzioni WSARecv o recv restituiscono datagrammi IPv4 che passano attraverso l'interfaccia IPv4 specificata o restituiscono datagrammi IPv6 passando attraverso l'interfaccia IPv6 specificata. Si noti che è necessario fornire un buffer sufficientemente grande. L'impostazione di questo IOCTL acquisisce solo i pacchetti IPv4 o IPv6 in una determinata interfaccia. Questo IOCTL non acquisirà altri pacchetti (pacchetti ARP, IPX e NetBEUI, ad esempio) nell'interfaccia.

Un socket associato a un'interfaccia locale specifica con il SIO_RCVALL IOCTL riceverà solo pacchetti che passano attraverso tale interfaccia. Non riceverà pacchetti ricevuti su un'altra interfaccia e verrà inoltrato su un'altra interfaccia diversa dal socket associato a SIO_RCVALL IOCTL.

In Windows Server 2008 e versioni precedenti, l'impostazione SIO_RCVALL IOCTL non acquisisce i pacchetti locali inviati da un'interfaccia di rete. Inclusi i pacchetti ricevuti in un'altra interfaccia e inoltrato l'interfaccia di rete specificata per il SIO_RCVALL IOCTL.

In Windows 7 e Windows Server 2008 R2 questo è stato modificato in modo che vengano acquisiti anche i pacchetti locali inviati da un'interfaccia di rete. Sono inclusi i pacchetti ricevuti in un'altra interfaccia e quindi inoltrata l'interfaccia di rete associata al socket con SIO_RCVALL IOCTL.

L'impostazione di questo IOCTL richiede privilegi di amministratore nel computer locale.

Questa funzionalità viene talvolta definita modalità promiscua. Qualsiasi modifica diretta rispetto all'applicazione di questa opzione in un'interfaccia e quindi a un'altra con una singola chiamata che usa questo IOCTL non è supportata. Un'applicazione deve prima usare questo IOCTL per disattivare il comportamento nella prima interfaccia e quindi usare questo IOCTL per abilitare il comportamento in una nuova interfaccia.

Vedi anche

Socket

Socket non elaborati TCP/IP

WSAGetLastError

WSAGetOverlappedResult

Wsaioctl

WSAOVERLAPPED

WSASocketA

WSASocketW