SIO_IDEAL_SEND_BACKLOG_QUERY codice di controllo

Descrizione

Il codice di controllo SIO_IDEAL_SEND_BACKLOG_QUERY recupera il valore di backlog di invio ideale (ISB) per la connessione sottostante.

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

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

Parametri

s

Descrittore che identifica un socket.

dwIoControlCode

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

lpvInBuffer

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

cbInBuffer

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

lpvOutBuffer

Puntatore al buffer di output. Questo parametro deve puntare a un tipo di dati ULONG se i parametri lpOverlapped e lpCompletionRoutine sono NULL.

cbOutBuffer

Dimensioni, in byte, del buffer di output. Questo parametro deve essere almeno la dimensione di un tipo di dati ULONG .

lpcbBytesReturned

Puntatore a una variabile che riceve le dimensioni, in byte, dei dati archiviati nel buffer di output.

Se il buffer di output è troppo piccolo, la chiamata ha esito negativo, WSAGetLastError restituisce WSAEINVAL e il parametro lpcbBytesReturned punta a un valore DWORD pari a zero.

Se lpOverlapped è NULL, il valore DWORD puntato al parametro lpcbBytesReturned restituito in una chiamata riuscita non può essere zero.

Se il parametro lpOverlapped non è NULL per i socket sovrapposti, le operazioni che non possono essere completate immediatamente verranno avviate e il completamento verrà indicato in un secondo momento. Il valore DWORD indicato dal parametro lpcbBytesReturned restituito può essere zero poiché le dimensioni dei dati archiviati non possono essere determinate fino al completamento dell'operazione sovrapposta. Lo stato di completamento finale può essere recuperato quando il metodo di completamento appropriato viene segnalato al termine dell'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 lpvInBuffer, lpvoutBuffer, lpcbBytesReturned, 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 se il parametro cbOutBuffer è minore delle dimensioni di un tipo di dati ULONG .
WSAENETDOWN Il sottosistema di rete non è riuscito.
WSAENOPROTOOPT L'opzione socket non è supportata nel protocollo specificato.
WSAENOTCONN Il socket s non è connesso.
WSAENOTSOCK Il descrittore s non è un socket.
WSAEOPNOTSUPP Il comando IOCTL specificato non è supportato. Questo errore viene restituito se il SIO_IDEAL_SEND_BACKLOG_QUERY IOCTL non è supportato dal provider di trasporto. Questo errore viene restituito anche quando viene eseguito un tentativo di utilizzo del SIO_IDEAL_SEND_BACKLOG_QUERY IOCTL in un socket di datagram.

Commenti

Il SIO_IDEAL_SEND_BACKLOG_QUERY IOCTL è supportato in Windows Server 2008, Windows Vista con Service Pack 1 (SP1) e versioni successive del sistema operativo.

Quando si inviano dati tramite una connessione TCP usando socket Windows, è importante mantenere una quantità sufficiente di dati in sospeso (inviati ma non ancora riconosciuti) in TCP per ottenere la velocità effettiva più elevata. Il valore ideale per la quantità di dati in sospeso per ottenere la velocità effettiva migliore per la connessione TCP è chiamata la dimensione ideale del backlog di invio (ISB). Il valore ISB è una funzione del prodotto di ritardo della larghezza di banda della connessione TCP e della finestra di ricezione annunciata dal ricevitore (e in parte la quantità di congestione nella rete).

Il valore ISB per connessione è disponibile dall'implementazione del protocollo TCP in Windows Server 2008, Windows Vista con SP1 e versioni successive del sistema operativo. Il SIO_IDEAL_SEND_BACKLOG_QUERY IOCTL può essere usato da un'applicazione per ottenere una notifica quando il valore ISB cambia dinamicamente per una connessione.

In Windows Server 2008, Windows Vista con SP1 e versioni successive del sistema operativo, i SIO_IDEAL_SEND_BACKLOG_CHANGE e i SIO_IDEAL_SEND_BACKLOG_QUERY IOCTLs sono supportati nei socket orientati al flusso in uno stato connesso.

L'intervallo per il valore ISB per una connessione TCP può variare in teoria da 0 a un massimo di 16 megabyte.

L'utilizzo tipico dei SIO_IDEAL_SEND_BACKLOG_CHANGE e SIO_IDEAL_SEND_BACKLOG_QUERY IOCTLs è basato sul metodo di invio usato dalle applicazioni. Vengono illustrati due casi comuni.

Le applicazioni che eseguono una richiesta di invio bloccata o non bloccante alla volta si basano in genere sul buffer di invio interno di Winsock per ottenere una velocità effettiva decente. Il limite di buffer di invio per una determinata connessione è controllato dall'opzione socket SO_SNDBUF . Per il metodo di invio bloccante e non bloccante, il limite di buffer di invio determina la quantità di dati in sospeso in TCP. Se il valore ISB per la connessione è maggiore del limite di buffer di invio, la velocità effettiva ottenuta sulla connessione non sarà ottimale. Per ottenere una maggiore velocità effettiva, le applicazioni possono impostare il limite di buffer di invio in base al risultato della query ISB quando si verificano notifiche di modifica ISB sulla connessione.

Per le applicazioni che usano il metodo di invio sovrapposto con più richieste di invio in sospeso, la quantità di dati in sospeso in TCP è determinata dal limite di buffer di invio in Winsock e dalla quantità totale di dati contenuti nelle richieste di invio sovrapposte in sospeso. In questo caso, le applicazioni devono usare il valore ISB per determinare il numero di richieste di invio in sospeso che devono mantenere e le dimensioni dei dati per ogni richiesta di invio. Idealmente, l'applicazione deve provare a mantenere soddisfatta l'equazione seguente:

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

Si noti che l'uso degli IOCTLS ISB sui socket TCP in precedenza può causare un aumento dell'utilizzo della memoria in cambio di una maggiore velocità effettiva sulle connessioni con un prodotto con ritardo di larghezza di banda elevato. L'implementazione TCP in Windows limita i valori ISB in base all'utilizzo complessivo della memoria di sistema.

Il SIO_IDEAL_SEND_BACKLOG_QUERY IOCTL è consentito solo in un socket di flusso nello stato connesso. In caso contrario, la funzione WSAIoctl o WSPIoctl avrà esito negativo con WSAENOTCONN.

Qualsiasi IOCTL può bloccare in modo indefinito, a seconda dell'implementazione del provider di servizi. Se l'applicazione non può tollerare il blocco in una chiamata di funzione WSAIoctl o WSPIoctl , l'I/O sovrapposto dovrebbe essere consigliato per IOCTLs che sono particolarmente probabilità di bloccare.

L'SIO_IDEAL_SEND_BACKLOG_QUERY IOCTL non è probabile che blocchi in modo che sia normalmente chiamato in modo sincrono con i parametri lpOverlapped e lpCompletionRoutine impostati su NULL.

Il SIO_IDEAL_SEND_BACKLOG_QUERY IOCTL può avere esito negativo con WSAEINTR o WSA_OPERATION_ABORTED nei casi seguenti:

La connessione TCP viene normalmente disconnessa nella direzione di invio. Ciò può verificarsi come risultato di una chiamata alla funzione di arresto con il parametro impostato su SD_SEND, una chiamata alla funzione DisconnectEx o una chiamata alla funzione TransmitFile o TransmitPackets con il parametro dwFlags impostato su TF_DISCONNECT o TF_REUSE. La connessione TCP è stata reimpostata o interrotta. La richiesta viene annullata da I/O Manager.

Due funzioni wrapper inline per questi IOCTLs sono definite nel file di intestazione Ws2tcpip.h . È consigliabile usare queste funzioni inline anziché usare direttamente i SIO_IDEAL_SEND_BACKLOG_CHANGE e SIO_IDEAL_SEND_BACKLOG_QUERY IOCTLs.

La funzione wrapper inline per il SIO_IDEAL_SEND_BACKLOG_CHANGE IOCTL è la funzione idealsendbacklognotify .

La funzione wrapper inline per la SIO_IDEAL_SEND_BACKLOG_QUERY IOCTL è la funzione idealsendbacklogquery .

Il buffer di invio dinamico per TCP è stato aggiunto in Windows 7 e Windows Server 2008 R2. Per impostazione predefinita, il buffer di invio dinamico per TCP è abilitato a meno che un'applicazione non imposta l'opzione socket SO_SNDBUF nel socket di flusso.

L'uso di netsh è il metodo consigliato per eseguire query o impostare il buffer di invio dinamico per TCP.

Il valore corrente per il buffer di invio dinamico per TCP può essere recuperato usando il comando seguente:

netsh winsock show autotuning

Il buffer di invio dinamico per TCP può essere disabilitato usando il comando seguente:

netsh winsock set autotuning off

È possibile abilitare il buffer di invio dinamico per TCP usando il comando seguente:

netsh winsock set autotuning on

Sebbene sia sconsigliato, il buffer di invio dinamico può essere disabilitato da un'applicazione impostando il valore del Registro di sistema seguente su zero:

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

Quando si modifica il valore per il buffer di invio dinamico usando NetSh.exe o modificando il valore del Registro di sistema, il computer deve essere riavviato per l'effetto della modifica.

Con il buffer di invio dinamico su Windows 7 e Windows Server 2008 R2, l'uso dei SIO_IDEAL_SEND_BACKLOG_CHANGE e deiSIO_IDEAL_SEND_BACKLOG_QUERY IOCTLs sono necessari solo in circostanze speciali.

Vedi anche

SIO_IDEAL_SEND_BACKLOG_CHANGE

Socket

WSAGetLastError

WSAGetOverlappedResult

Wsaioctl

WSAOVERLAPPED

WSASocketA

WSASocketW