Freigeben über


SIO_IDEAL_SEND_BACKLOG_QUERY-Steuerelementcode

BESCHREIBUNG

Der SIO_IDEAL_SEND_BACKLOG_QUERY-Steuerelementcode ruft den idealen Isb-Wert (Send Backlog) für die zugrunde liegende Verbindung ab.

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_IDEAL_SEND_BACKLOG_QUERY, // dwIoControlCode
  NULL,                         // lpvInBuffer
  0,                            // cbInBuffer
  (LPVOID) 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
);
int WSPIoctl(
  (socket) s,             // descriptor identifying a socket
  SIO_IDEAL_SEND_BACKLOG_QUERY, // dwIoControlCode
  NULL,                         // lpvInBuffer
  0,                            // cbInBuffer
  (LPVOID) 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
  (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_IDEAL_SEND_BACKLOG_QUERY .

lpvInBuffer

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

cbInBuffer

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

lpvOutBuffer

Ein Zeiger auf den Ausgabepuffer. Dieser Parameter sollte auf einen ULONG-Datentyp verweisen, wenn die Parameter lpOverlapped und lpCompletionRoutineNULL sind.

cbOutBuffer

Die Größe des Ausgabepuffers in Bytes. Dieser Parameter muss mindestens die Größe eines ULONG-Datentyps aufweisen.

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 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 Die Parameter lpvInBuffer, lpvoutBuffer, lpcbBytesReturned, lpOverlapped oder lpCompletionRoutine sind 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 zurückgegeben, wenn der cbOutBuffer-Parameter kleiner als die Größe eines ULONG-Datentyps ist.
WSAENETDOWN Fehler beim Netzwerksubsystem.
WSAENOPROTOOPT Die Socketoption wird im angegebenen Protokoll nicht unterstützt.
WSAENOTCONN Der Socket s ist nicht verbunden.
WSAENOTSOCK Der Deskriptor s ist kein Socket.
WSAEOPNOTSUPP Der angegebene IOCTL-Befehl wird nicht unterstützt. Dieser Fehler wird zurückgegeben, wenn die SIO_IDEAL_SEND_BACKLOG_QUERY IOCTL vom Transportanbieter nicht unterstützt wird. Dieser Fehler wird auch zurückgegeben, wenn versucht wird, die SIO_IDEAL_SEND_BACKLOG_QUERY IOCTL für einen Datagrammsocket zu verwenden.

Bemerkungen

Die SIO_IDEAL_SEND_BACKLOG_QUERY IOCTL wird unter Windows Server 2008, Windows Vista mit Service Pack 1 (SP1) und höheren Versionen des Betriebssystems unterstützt.

Beim Senden von Daten über eine TCP-Verbindung mithilfe von Windows-Sockets ist es wichtig, eine ausreichende Menge an daten ausstehenden (gesendeten, aber noch nicht bestätigten) In TCP zu halten, um den höchsten Durchsatz zu erreichen. Der ideale Wert für die ausstehende Datenmenge, um den besten Durchsatz für die TCP-Verbindung zu erzielen, wird als ideale Größe des Sendebacklogs (ISB) bezeichnet. Der ISB-Wert ist eine Funktion des Bandbreitenverzögerungsprodukts der TCP-Verbindung und des angekündigten Empfangsfensters des Empfängers (und teilweise der Überlastung im Netzwerk).

Der ISB-Wert pro Verbindung ist über die TCP-Protokollimplementierung in Windows Server 2008, Windows Vista mit SP1 und höheren Versionen des Betriebssystems verfügbar. Die SIO_IDEAL_SEND_BACKLOG_QUERY IOCTL kann von einer Anwendung verwendet werden, um eine Benachrichtigung zu erhalten, wenn sich der ISB-Wert für eine Verbindung dynamisch ändert.

Unter Windows Server 2008, Windows Vista mit SP1 und höheren Versionen des Betriebssystems werden die SIO_IDEAL_SEND_BACKLOG_CHANGE- und SIO_IDEAL_SEND_BACKLOG_QUERY-IOCTLs für streamorientierte Sockets unterstützt, die sich im verbundenen Zustand befinden.

Der Bereich für den ISB-Wert für eine TCP-Verbindung kann theoretisch zwischen 0 und maximal 16 Megabyte variieren.

Die typische Verwendung der SIO_IDEAL_SEND_BACKLOG_CHANGE und SIO_IDEAL_SEND_BACKLOG_QUERY IOCTLs basiert auf der send-Methode, die von den Anwendungen verwendet wird. Es werden zwei häufige Fälle behandelt.

Anwendungen, die jeweils eine blockierende oder nicht blockierende Sendeanforderung ausführen, basieren in der Regel auf der internen Sendepufferung von Winsock, um einen angemessenen Durchsatz zu erzielen. Das Sendepufferlimit für eine bestimmte Verbindung wird durch die Socketoption SO_SNDBUF gesteuert. Für die blockierende und nicht blockierende Sendemethode bestimmt der Sendepuffergrenzwert, wie viele Daten in TCP ausstehend aufbewahrt werden. Wenn der ISB-Wert für die Verbindung größer als der Sendepuffergrenzwert ist, ist der für die Verbindung erzielte Durchsatz nicht optimal. Um einen besseren Durchsatz zu erzielen, können die Anwendungen das Sendepufferlimit basierend auf dem Ergebnis der ISB-Abfrage festlegen, wenn ISB-Änderungsbenachrichtigungen für die Verbindung auftreten.

Für Anwendungen, die die überlappende Sendemethode mit mehreren ausstehenden Sendeanforderungen verwenden, wird die in TCP ausstehende Datenmenge durch das Sendepufferlimit in Winsock und die Gesamtmenge der Daten bestimmt, die in den ausstehenden überlappenden Sendeanforderungen enthalten sind. In diesem Fall sollten Anwendungen den ISB-Wert verwenden, um zu bestimmen, wie viele ausstehende Sendeanforderungen beibehalten werden sollen und wie groß die Datengröße für jede Sendeanforderung sein soll. Im Idealfall sollte die Anwendung versuchen, die folgende Gleichung zu erfüllen:

ISB value == send buffer limit + (number of simultaneous overlapped send requests * data length per send request)

Beachten Sie, dass die Verwendung der ISB-IOCTLs über TCP-Sockets auf die oben genannte Weise zu einer höheren Speicherauslastung im Austausch für einen höheren Durchsatz bei Verbindungen mit einem Produkt mit hoher Bandbreitenverzögerung führen kann. Die TCP-Implementierung in Windows drosselt ISB-Werte je nach Bedarf basierend auf der Gesamtauslastung des Systemspeichers.

Die SIO_IDEAL_SEND_BACKLOG_QUERY IOCTL ist nur für einen Datenstromsocket zulässig, der sich im verbundenen Zustand befindet. Andernfalls schlägt die WSAIoctl - oder WSPIoctl-Funktion mit WSAENOTCONN fehl.

Jede IOCTL kann je nach Implementierung des Dienstanbieters unbegrenzt blockiert werden. Wenn die Anwendung die Blockierung in einem WSAIoctl - oder WSPIoctl-Funktionsaufruf nicht tolerieren kann, werden überlappende E/A für IOCTLs empfohlen, die besonders wahrscheinlich blockiert werden.

Die SIO_IDEAL_SEND_BACKLOG_QUERY IOCTL wird wahrscheinlich nicht blockiert, sodass sie normalerweise synchron aufgerufen wird, wenn die Parameter lpOverlapped und lpCompletionRoutine auf NULL festgelegt sind.

Die SIO_IDEAL_SEND_BACKLOG_QUERY IOCTL kann mit WSAEINTR oder WSA_OPERATION_ABORTED in den folgenden Fällen fehlschlagen:

Die TCP-Verbindung wird ordnungsgemäß in Senderichtung getrennt. Dies kann durch einen Aufruf der Herunterfahren-Funktion mit dem parameter how auf SD_SEND, durch einen Aufruf der DisconnectEx-Funktion oder durch einen Aufruf der TransmitFile- oder TransmitPackets-Funktion mit dem dwFlags-Parameter auf TF_DISCONNECT oder TF_REUSE. Die TCP-Verbindung wurde zurückgesetzt oder abgebrochen. Die Anforderung wird vom E/A-Manager abgebrochen.

Zwei Inline-Wrapperfunktionen für diese IOCTLs sind in der Ws2tcpip.h-Headerdatei definiert. Es wird empfohlen, diese Inlinefunktionen zu verwenden, anstatt die SIO_IDEAL_SEND_BACKLOG_CHANGE und SIO_IDEAL_SEND_BACKLOG_QUERY IOCTLs direkt zu verwenden.

Die Inline-Wrapperfunktion für die SIO_IDEAL_SEND_BACKLOG_CHANGE IOCTL ist die Funktion idealsendbacklognotify .

Die Inline-Wrapperfunktion für die SIO_IDEAL_SEND_BACKLOG_QUERY IOCTL ist die idealsendbacklogquery-Funktion .

Der dynamische Sendepuffer für TCP wurde unter Windows 7 und Windows Server 2008 R2 hinzugefügt. Standardmäßig ist der dynamische Sendepuffer für TCP aktiviert, es sei denn, eine Anwendung legt die Option SO_SNDBUF Socket für den Datenstromsocket fest.

Die Verwendung von netsh ist die empfohlene Methode zum Abfragen oder Festlegen des dynamischen Sendepuffers für TCP.

Der aktuelle Wert für den dynamischen Sendepuffer für TCP kann mit dem folgenden Befehl abgerufen werden:

netsh winsock show autotuning

Die dynamische Sendepufferung für TCP kann mit dem folgenden Befehl deaktiviert werden:

netsh winsock set autotuning off

Der dynamische Sendepuffer für TCP kann mit dem folgenden Befehl aktiviert werden:

netsh winsock set autotuning on

Obwohl davon abgeraten wird, kann die dynamische Sendepufferung von einer Anwendung deaktiviert werden, indem Der folgende Registrierungswert auf 0 festgelegt wird:

HKEY_LOCAL_MACHINE\SYSTEM\Current Control Set\Services\AFD\Parameters\DynamicSendBufferDisable

Wenn Sie den Wert für dynamischen Sendepuffer mithilfe von NetSh.exe ändern oder den Registrierungswert ändern, muss der Computer neu gestartet werden, damit die Änderung wirksam wird.

Beim dynamischen Sendepuffer unter Windows 7 und Windows Server 2008 R2 ist die Verwendung der SIO_IDEAL_SEND_BACKLOG_CHANGE und SIO_IDEAL_SEND_BACKLOG_QUERY IOCTLs nur unter besonderen Umständen erforderlich.

Siehe auch

SIO_IDEAL_SEND_BACKLOG_CHANGE

Socket

WSAGetLastError

WSAGetOverlappedResult

WSAIoctl

WSAOVERLAPED

WSASocketA

WSASocketW