SIO_RCVALL-Steuerungscode

BESCHREIBUNG

Der SIO_RCVALL-Steuerungscode ermöglicht es einem Socket, alle IPv4- oder IPv6-Pakete zu empfangen, die über eine Netzwerkschnittstelle übergeben werden.

Um diesen Vorgang auszuführen, rufen Sie die Funktion WSAIoctl oder WSPIoctl mit den folgenden Parametern auf.

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

Parameter

s

Ein Deskriptor, der einen Socket identifiziert.

dwIoControlCode

Der Steuerelementcode für den Vorgang. Verwenden Sie für diesen Vorgang SIO_RCVALL .

lpvInBuffer

Ein Zeiger auf den Eingabepuffer, der den Optionswert enthalten soll. Die möglichen Werte für die Option SIO_RCVALL IOCTL werden in der RCVALL_VALUE-Enumeration angegeben, die in der Headerdatei "Mstcpip.h " definiert ist.

Mögliche Werte für SIO_RCVALL :

Wert Bedeutung
RCVALL_OFF Deaktivieren Sie diese Option, damit ein Socket nicht alle IPv4- oder IPv6-Pakete empfängt, die über eine Netzwerkschnittstelle übergeben werden.
RCVALL_ON Aktivieren Sie diese Option, damit ein Socket alle IPv4- oder IPv6-Pakete empfängt, die über eine Netzwerkschnittstelle übergeben werden. Mit dieser Option wird der Promiskuous-Modus auf der Netzwerkschnittstelle Karte (NIC) aktiviert, wenn die Netzwerkkarte den Promiskuous-Modus unterstützt. In einem LAN-Segment mit einem Netzwerkhub erfasst eine Netzwerkkarte, die den promiskten Modus unterstützt, den gesamten IPv4- oder IPv6-Datenverkehr im LAN, einschließlich des Datenverkehrs zwischen anderen Computern im gleichen LAN-Segment. Alle erfassten Pakete (je nach Socket IPv4 oder IPv6) werden an den Rohsocket übermittelt. Diese Option erfasst keine anderen Pakete (z. B. ARP-, IPX- und NetBEUI-Pakete) auf der Schnittstelle. Netmon verwendet den gleichen Modus für die Netzwerkschnittstelle, verwendet diese Option jedoch nicht, um Datenverkehr zu erfassen.
RCVALL_SOCKETLEVELONLY Dieses Feature ist derzeit nicht implementiert, sodass das Festlegen dieser Option keine Auswirkungen hat.
RCVALL_IPLEVEL Aktivieren Sie diese Option, damit ein IPv4- oder IPv6-Socket alle Pakete auf IP-Ebene empfängt, die eine Netzwerkschnittstelle durchlaufen. Diese Option aktiviert den promiskuous-Modus nicht auf der Netzwerkschnittstelle Karte. Diese Option wirkt sich nur auf die Paketverarbeitung auf IP-Ebene aus. Die NIC empfängt weiterhin nur Pakete, die an die konfigurierten Unicast- und Multicastadressen weitergeleitet werden. Ein Socket mit aktivierter Option empfängt jedoch nicht nur Pakete, die an bestimmte IP-Adressen weitergeleitet werden, sondern alle IPv4- oder IPv6-Pakete, die die NIC empfängt. Mit dieser Option werden keine anderen Pakete (z. B. ARP-, IPX- und NetBEUI-Pakete) erfasst, die auf der Schnittstelle empfangen werden.

cbInBuffer

Die Größe des Eingabepuffers in Bytes. Dieser Parameter sollte gleich oder größer sein als die Größe des RCVALL_VALUE Enumerationswerts, auf den der lpvInBuffer-Parameter verweist.

lpvOutBuffer

Ein Zeiger auf den Ausgabepuffer. Dieser Parameter wird für diesen Vorgang nicht verwendet.

cbOutBuffer

Die Größe des Ausgabepuffers in Bytes. Dieser Parameter wird für diesen Vorgang nicht verwendet.

lpcbBytesReturned

Ein Zeiger auf eine Variable, die die Größe der im Ausgabepuffer gespeicherten Daten in Bytes empfängt. Dieser Parameter wird für diesen Vorgang nicht verwendet.

lpvOverlapped

Ein Zeiger auf eine WSAOVERLAPPED-Struktur .

Wenn Socket s ohne das überlappende Attribut erstellt wurde, wird der lpOverlapped-Parameter ignoriert.

Wenn s mit dem überlappenden Attribut geöffnet wurde und der lpOverlapped-Parameter nicht NULL ist, wird der Vorgang als überlappender (asynchroner) Vorgang ausgeführt. In diesem Fall muss der lpOverlapped-Parameter auf eine gültige WSAOVERLAPPED-Struktur verweisen.

Bei überlappenden Vorgängen wird die WSAIoctl - oder WSPIoctl-Funktion sofort zurückgegeben, und die entsprechende Abschlussmethode wird nach Abschluss des Vorgangs signalisiert. Andernfalls wird die Funktion erst zurückgegeben, wenn der Vorgang abgeschlossen wurde oder ein Fehler auftritt.

lpCompletionRoutine

Typ: _In_opt_ LPWSAOVERLAPPED_COMPLETION_ROUTINE

Ein Zeiger auf die Abschlussroutine, die aufgerufen wird, wenn der Vorgang abgeschlossen wurde (bei nicht überlappenden Sockets ignoriert).

lpThreadId

Ein Zeiger auf eine WSATHREADID-Struktur , die vom Anbieter in einem nachfolgenden Aufruf von WPUQueueApc verwendet werden soll. Der Anbieter sollte die referenzierte WSATHREADID-Struktur (nicht den Zeiger auf dieselbe) speichern, bis die WPUQueueApc-Funktion zurückgegeben wird.

Hinweis Dieser Parameter gilt nur für die WSPIoctl-Funktion .

lpErrno

Ein Zeiger auf den Fehlercode.

Hinweis Dieser Parameter gilt nur für die WSPIoctl-Funktion .

Rückgabewert

Wenn der Vorgang erfolgreich abgeschlossen wird, gibt die WSAIoctl - oder WSPIoctl-Funktion null zurück.

Wenn der Vorgang fehlschlägt oder aussteht, gibt die WSAIoctl - oder WSPIoctl-FunktionSOCKET_ERROR zurück. Rufen Sie WSAGetLastError auf, um erweiterte Fehlerinformationen zu erhalten.

Fehlercode Bedeutung
WSA_IO_PENDING Ein überlappender Vorgang wurde erfolgreich initiiert, und der Abschluss wird zu einem späteren Zeitpunkt angezeigt.
WSA_OPERATION_ABORTED Ein überlappender Vorgang wurde aufgrund des Schließens des Sockets oder der Ausführung des SIO_FLUSH IOCTL-Befehls abgebrochen.
WSAEFAULT Der LpOverlapped- oder lpCompletionRoutine-Parameter ist nicht vollständig in einem gültigen Teil des Benutzeradressraums enthalten.
WSAEINPROGRESS Die Funktion wird aufgerufen, wenn ein Rückruf ausgeführt wird.
WSAEINTR Ein blockierende Vorgang wurde unterbrochen.
WSAEINVAL Der dwIoControlCode-Parameter ist kein gültiger Befehl, oder ein angegebener Eingabeparameter ist nicht akzeptabel, oder der Befehl gilt nicht für den angegebenen Sockettyp. Dieser Fehler wird auch zurückgegeben, wenn der cbInBuffer-Parameter kleiner als der sizeof(UCHAR) ist oder der lpvInBuffer-Parameter auf einen Wert verweist, der kein RCVALL_VALUE Enumerationswert ist. Dieser Fehler kann auch zurückgegeben werden, wenn die dem Socket zugeordnete Netzwerkschnittstelle nicht gefunden werden kann. Dies kann auftreten, wenn die dem Socket zugeordnete Netzwerkschnittstelle gelöscht oder entfernt wird (z. B. ein PCMCIA- oder USB-Netzwerkgerät entfernen).
WSAENETDOWN Fehler beim Netzwerksubsystem.
WSAENOBUFS Kein Pufferspeicher verfügbar.
WSAENOPROTOOPT Die Socketoption wird im angegebenen Protokoll nicht unterstützt.
WSAENOTSOCK Der Deskriptor s ist kein Socket.
WSAEOPNOTSUPP Der angegebene IOCTL-Befehl wird nicht unterstützt. Dieser Fehler wird zurückgegeben, wenn die SIO_RCVALL IOCTL vom Transportanbieter nicht unterstützt wird.

Bemerkungen

Die SIO_RCVALL IOCTL wird unter Windows 2000 und höheren Versionen des Betriebssystems unterstützt.

Die SIO_RCVALL IOCTL ermöglicht es einem Socket, alle IPv4- oder IPv6-Pakete auf einer Netzwerkschnittstelle zu empfangen. Das an die WSAIoctl- oder WSPIoctl-Funktion übergebene Sockethandle muss einer der folgenden sein:

  • Ein IPv4-Socket, der erstellt wurde, wobei die Adressfamilie auf AF_INET festgelegt ist, der Sockettyp auf SOCK_RAW und das Protokoll auf IPPROTO_IP festgelegt wurde.
  • Ein IPv6-Socket, der erstellt wurde, wobei die Adressfamilie auf AF_INET6 festgelegt ist, der Sockettyp auf SOCK_RAW und das Protokoll auf IPPROTO_IPV6 festgelegt wurde.

Weitere Informationen zu unformatierten Sockets finden Sie unter TCP/IP Raw Sockets.

Der Socket muss auch an eine explizite lokale IPv4- oder IPv6-Schnittstelle gebunden sein, was bedeutet, dass Sie nicht an INADDR_ANY oder in6addr_any binden können.

Sobald der Socket gebunden ist und die IOCTL erfolgreich abgeschlossen wurde, geben Aufrufe der WSARecv - oder recv-Funktionen IPv4-Datagramme zurück, die die angegebene IPv4-Schnittstelle durchlaufen oder IPv6-Datagramme zurückgeben, die die angegebene IPv6-Schnittstelle durchlaufen. Beachten Sie, dass Sie einen ausreichend großen Puffer bereitstellen müssen. Wenn Sie diese IOCTL festlegen, werden nur IPv4- oder IPv6-Pakete auf einer bestimmten Schnittstelle erfasst. Diese IOCTL erfasst keine anderen Pakete (z. B. ARP-, IPX- und NetBEUI-Pakete) auf der Schnittstelle.

Ein Socket, der an eine bestimmte lokale Schnittstelle mit dem SIO_RCVALL IOCTL gebunden ist, empfängt nur Pakete, die diese Schnittstelle durchlaufen. Es empfängt keine Pakete, die auf einer anderen Schnittstelle empfangen und an eine andere Schnittstelle weitergeleitet werden, die von dem Socket, der an SIO_RCVALL IOCTL gebunden ist, weitergeleitet wird.

Unter Windows Server 2008 und früher erfasst die Einstellung SIO_RCVALL IOCTL keine lokalen Pakete, die über eine Netzwerkschnittstelle gesendet wurden. Dies umfasste Pakete, die auf einer anderen Schnittstelle empfangen und die für die SIO_RCVALL IOCTL angegebene Netzwerkschnittstelle weitergeleitet wurden.

Unter Windows 7 und Windows Server 2008 R2 wurde dies geändert, sodass auch lokale Pakete erfasst werden, die von einer Netzwerkschnittstelle gesendet werden. Dies schließt Pakete ein, die von einer anderen Schnittstelle empfangen und dann die Netzwerkschnittstelle weitergeleitet werden, die mit SIO_RCVALL IOCTL an den Socket gebunden ist.

Das Festlegen dieser IOCTL erfordert Administratorrechte auf dem lokalen Computer.

Dieses Feature wird manchmal als promiscuous-Modus bezeichnet. Jede direkte Änderung von der Anwendung dieser Option auf eine Schnittstelle und dann auf eine andere Schnittstelle mit einem einzelnen Aufruf mithilfe dieser IOCTL wird nicht unterstützt. Eine Anwendung muss zuerst diese IOCTL verwenden, um das Verhalten auf der ersten Schnittstelle zu deaktivieren, und dann diese IOCTL verwenden, um das Verhalten auf einer neuen Schnittstelle zu aktivieren.

Siehe auch

Socket

TCP/IP Raw Sockets

WSAGetLastError

WSAGetOverlappedResult

WSAIoctl

WSAOVERLAPED

WSASocketA

WSASocketW