SIO_RCVALL-Steuerungscode
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
);
Ein Deskriptor, der einen Socket identifiziert.
Der Steuerelementcode für den Vorgang. Verwenden Sie für diesen Vorgang SIO_RCVALL .
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. |
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.
Ein Zeiger auf den Ausgabepuffer. Dieser Parameter wird für diesen Vorgang nicht verwendet.
Die Größe des Ausgabepuffers in Bytes. Dieser Parameter wird für diesen Vorgang nicht verwendet.
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.
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.
Typ: _In_opt_ LPWSAOVERLAPPED_COMPLETION_ROUTINE
Ein Zeiger auf die Abschlussroutine, die aufgerufen wird, wenn der Vorgang abgeschlossen wurde (bei nicht überlappenden Sockets ignoriert).
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 .
Ein Zeiger auf den Fehlercode.
Hinweis Dieser Parameter gilt nur für die WSPIoctl-Funktion .
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. |
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.