Share via


SIO_LOOPBACK_FAST_PATH-Steuerelementcode

BESCHREIBUNG

Der SIO_LOOPBACK_FAST_PATH-Steuerungscode konfiguriert einen TCP-Socket für eine geringere Latenz und schnellere Vorgänge auf der Loopbackschnittstelle.

Wichtig Die SIO_LOOPBACK_FAST_PATH ist veraltet und wird nicht empfohlen, in Ihrem Code verwendet zu 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_LOOPBACK_FAST_PATH,                // dwIoControlCode
  (LPVOID) lpvInBuffer,   // pointer to a Boolean value
  (DWORD) cbInBuffer,    // size, in bytes, of the input buffer
  (LPVOID) lpvOutBuffer,         // pointer to output buffer
  (DWORD) cbOutBuffer,       // size of output buffer
  (LPDWORD) lpcbBytesReturned,    // number of bytes returned
  (LPWSAOVERLAPPED) lpOverlapped,   // OVERLAPPED structure
  (LPWSAOVERLAPPED_COMPLETION_ROUTINE) lpCompletionRoutine,  // completion routine
);
int WSPIoctl(
  (socket) s,             // descriptor identifying a socket
  SIO_LOOPBACK_FAST_PATH,                // dwIoControlCode
  (LPVOID) lpvInBuffer,   // pointer to a Boolean value
  (DWORD) cbInBuffer,           // size, in bytes, of the input buffer
  (LPVOID) lpvOutBuffer,         // pointer to output buffer
  (DWORD) cbOutBuffer,       // size of output buffer
  (LPDWORD) lpcbBytesReturned,    // number of bytes returned
  (LPWSAOVERLAPPED) lpOverlapped,   // OVERLAPPED structure
  (LPWSAOVERLAPPED_COMPLETION_ROUTINE) lpCompletionRoutine,  // completion routine
  (LPWSATHREADID) lpThreadId,   // a WSATHREADID structure
  (LPINT) lpErrno   // a pointer to the error code.
);

Parameter

s

Ein Deskriptor, der einen Socket identifiziert.

dwIoControlCode

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

lpvInBuffer

Ein Zeiger auf den Eingabepuffer. Dieser Parameter enthält einen Zeiger auf einen booleschen Wert, der angibt, ob der Socket für schnelle Loopbackvorgänge konfiguriert werden soll.

cbInBuffer

Die Größe des Eingabepuffers in Bytes.

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 muss auf 0 festgelegt werden.

lpcbBytesReturned

Ein Zeiger auf eine Variable, die die Größe der im Ausgabepuffer gespeicherten Daten in Bytes empfängt.

Wenn der Ausgabepuffer zu klein ist, schlägt der Aufruf fehl, WSAGetLastError gibt WSAEINVAL zurück, und der parameter lpcbBytesReturned verweist auf den DWORD-Wert 0.

Wenn lpOverlappedNULL ist, kann der DWORD-Wert , auf den der lpcbBytesReturned-Parameter verweist, der bei einem erfolgreichen Aufruf zurückgegeben wird, nicht null sein.

Wenn der lpOverlapped-Parameter für überlappende Sockets nicht NULL ist, werden Vorgänge initiiert, die nicht sofort abgeschlossen werden können, und der Abschluss wird zu einem späteren Zeitpunkt angezeigt. Der DWORD-Wert , auf den der zurückgegebene Parameter lpcbBytesReturned verweist, kann null sein, da die Größe der gespeicherten Daten erst bestimmt werden kann, wenn der überlappende Vorgang abgeschlossen ist. Der endgültige Abschluss status kann abgerufen werden, wenn die entsprechende Vervollständigungsmethode signalisiert wird, wenn der Vorgang abgeschlossen ist.

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 Überlappender E/A-Vorgang wird ausgeführt. Dieser Wert wird zurückgegeben, wenn ein überlappender Vorgang erfolgreich initiiert wurde und der Abschluss zu einem späteren Zeitpunkt angegeben wird.
WSA_OPERATION_ABORTED Der E/A-Vorgang wurde wegen eines Threadendes oder einer Anwendungsanforderung abgebrochen. Dieser Fehler wird zurückgegeben, wenn ein überlappender Vorgang aufgrund des Schließens des Sockets oder der Ausführung des SIO_FLUSH IOCTL-Befehls abgebrochen wurde.
WSAEACCES Es wurde versucht, auf einen Socket auf eine Weise zuzugreifen, die durch seine Zugriffsberechtigungen verboten ist. Dieser Fehler wird unter verschiedenen Bedingungen für persistente Portreservierungen zurückgegeben, die folgendes umfassen: Dem Benutzer fehlen die erforderlichen Administratorrechte auf dem lokalen Computer, oder die Anwendung wird nicht in einer erweiterten Shell als integrierter Administrator (RunAs administrator) ausgeführt.
WSAEFAULT Das System hat beim Versuch, ein Zeigerargument in einem Aufruf zu verwenden, eine ungültige Zeigeradresse erkannt. Dieser Fehler wird zurückgegeben, wenn die Parameter lpvInBuffer, lpvoutBuffer, lpcbBytesReturned, lpOverlapped oder lpCompletionRoutine nicht vollständig in einem gültigen Teil des Benutzeradressraums enthalten sind.
WSAEINPROGRESS Ein Blockierungsvorgang wird momentan ausgeführt. Dieser Fehler wird zurückgegeben, wenn die Funktion aufgerufen wird, wenn ein Rückruf ausgeführt wird.
WSAEINTR Ein blockierender Vorgang wurde durch einen Aufruf von WSACancelBlockingCall unterbrochen. Dieser Fehler wird zurückgegeben, wenn ein blockierende Vorgang unterbrochen wurde.
WSAEINVAL Ein ungültiges Argument wurde angegeben. Dieser Fehler wird zurückgegeben, wenn der dwIoControlCode-Parameter kein gültiger Befehl ist, ein angegebener Eingabeparameter nicht akzeptabel ist oder der Befehl nicht auf den angegebenen Sockettyp anwendbar ist.
WSAENETDOWN Bei einem Socketvorgang war das Netzwerk inaktiv. Dieser Fehler wird zurückgegeben, wenn das Netzwerksubsystem fehlgeschlagen ist.
WSAENOTSOCK Ein Vorgang wurde für etwas versucht, das kein Socket ist. Dieser Fehler wird zurückgegeben, wenn der Deskriptor s kein Socket ist.
WSAEOPNOTSUPP Der versuchte Vorgang wird für den Typ des Objekts, auf das verwiesen wird, nicht unterstützt. Dieser Fehler wird zurückgegeben, wenn der angegebene IOCTL-Befehl nicht unterstützt wird. Dieser Fehler wird auch zurückgegeben, wenn die SIO_LOOPBACK_FAST_PATH IOCTL vom Transportanbieter nicht unterstützt wird.

Bemerkungen

Eine Anwendung kann die SIO_LOOPBACK_FAST_PATH IOCTL verwenden, um die Latenz zu verringern und die Leistung von Loopbackvorgängen auf einem TCP-Socket zu verbessern. Diese IOCTL fordert an, dass der TCP/IP-Stapel einen speziellen schnellen Pfad für Loopbackvorgänge für diesen Socket verwendet. Die SIO_LOOPBACK_FAST_PATH IOCTL kann nur mit TCP-Sockets verwendet werden. Diese IOCTL muss auf beiden Seiten der Loopbacksitzung verwendet werden. Der schnelle TCP-Loopbackpfad wird entweder über die IPv4- oder IPv6-Loopbackschnittstelle unterstützt.

Der Socket, der die Verbindungsanforderung initiieren möchte, muss diese IOCTL anwenden, bevor die Verbindungsanforderung gestellt wird. Daher muss der Socket, der von der ConnectEx-, WSAConnect-, WSAConnectByList- oder WSAConnectByName-Funktion zum Initiieren der Verbindung verwendet wird, diese IOCTL anwenden, um den schnellen Pfad für Loopbackvorgänge zu verwenden.

Der Socket, der auf die Verbindungsanforderung lauscht, muss diese IOCTL anwenden, bevor die Verbindung akzeptiert wird. Daher muss der von der Listenfunktion verwendete Socket diese IOCTL anwenden, damit alle akzeptierten Sockets den schnellen Pfad für Loopbacks verwenden. Alle Sockets, die von der Listenfunktion zurückgegeben und an die Accept-, AcceptEx- oder WSAAccept-Funktion übergeben werden, werden markiert, um den speziellen schnellen Pfad für Loopbackvorgänge zu verwenden.

Sobald eine Anwendung die Verbindung auf einer Loopbackschnittstelle mithilfe des schnellen Pfads herstellt, müssen alle Pakete für die Lebensdauer der Verbindung den schnellen Pfad verwenden.

Das Anwenden SIO_LOOPBACK_FAST_PATH auf einen Socket, der mit einem Nicht-Loopbackpfad verbunden wird, hat keine Auswirkungen.

Diese TCP-Loopbackoptimierung führt zu Paketen, die durch die Transport Layer (TL) fließen, anstatt durch den herkömmlichen Loopback über die Netzwerkschicht. Diese Optimierung verbessert die Latenz für Loopbackpakete. Sobald eine Anwendung sich für eine Einstellung auf Verbindungsebene für die Verwendung des schnellen Loopbackpfads entschieden hat, folgen alle Pakete dem Loopbackpfad. Bei Der Loopbackkommunikation werden keine Überlastung und ein Paketverlust erwartet. Das Konzept der Überlastungskontrolle und der zuverlässigen Übermittlung in TCP ist unnötig. Dies gilt jedoch nicht für die Flusssteuerung. Ohne Ablaufsteuerung kann der Absender den Empfangspuffer überlasten, was zu einem fehlerhaften TCP-Loopbackverhalten führt. Die Ablaufsteuerung im TCP-optimierten Loopbackpfad wird beibehalten, indem Sendeanforderungen in einer Warteschlange platziert werden. Wenn der Empfangspuffer voll ist, garantiert der TCP/IP-Stapel, dass die Gesendeten erst abgeschlossen werden, wenn die Warteschlange gewartet wird und die Flusssteuerung beibehalten wird.

TCP-Schnellpfad-Loopbackverbindungen in Anwesenheit einer WFP-Legende (Windows Filtering Platform) für Verbindungsdaten müssen den nicht optimierten langsamen Pfad für Loopback verwenden. WFP-Filter verhindern also, dass dieser neue Loopback-Schnellpfad verwendet wird. Wenn ein WFP-Filter aktiviert ist, wird vom System der langsame Pfad verwendet, auch wenn die SIO_LOOPBACK_FAST_PATH IOCTL festgelegt wurde. Dadurch wird sichergestellt, dass Anwendungen im Benutzermodus über die vollständige WFP-Sicherheitsfunktion verfügen.

Standardmäßig ist SIO_LOOPBACK_FAST_PATH deaktiviert.

Nur eine Teilmenge der TCP/IP-Socketoptionen wird unterstützt, wenn die SIO_LOOPBACK_FAST_PATH IOCTL verwendet wird, um den Schnellen Loopbackpfad für einen Socket zu aktivieren. Die Liste der unterstützten Optionen enthält Folgendes:

  • IP_TTL
  • IP_UNICAST_IF
  • IPV6_UNICAST_HOPS
  • IPV6_UNICAST_IF
  • IPV6_V6ONLY
  • SO_CONDITIONAL_ACCEPT
  • SO_EXCLUSIVEADDRUSE
  • SO_PORT_SCALABILITY
  • SO_RCVBUF
  • SO_REUSEADDR
  • TCP_BSDURGENT

Siehe auch

IPPROTO_IP Socketoptionen

IPPROTO_IPV6 Socketoptionen

IPPROTO_TCP Socketoptionen

Socket

SOL_SOCKET Socketoptionen

WSAGetLastError

WSAGetOverlappedResult

WSAIoctl

WSAOVERLAPED

WSASocketA

WSASocketW