Condividi tramite


codice di controllo SIO_LOOPBACK_FAST_PATH

Descrizione

Il codice di controllo SIO_LOOPBACK_FAST_PATH configura un socket TCP per una latenza inferiore e operazioni più veloci sull'interfaccia di loopback.

Importante Il SIO_LOOPBACK_FAST_PATH è deprecato e non è consigliabile usare nel codice.

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

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

Parametri

s

Descrittore che identifica un socket.

dwIoControlCode

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

lpvInBuffer

Puntatore al buffer di input. Questo parametro contiene un puntatore a un valore booleano che indica se il socket deve essere configurato per le operazioni di loopback veloce.

cbInBuffer

Dimensioni, in byte, del buffer di input.

lpvOutBuffer

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

cbOutBuffer

Dimensioni, in byte, del buffer di output. Questo parametro deve essere impostato su zero.

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 L'operazione di I/O sovrapposta è in corso. Questo valore viene restituito se un'operazione sovrapposta è stata avviata correttamente e il completamento verrà indicato in un secondo momento.
WSA_OPERATION_ABORTED Operazione di I/O annullata per uscita da un thread o su richiesta di un'applicazione. Questo errore viene restituito se un'operazione sovrapposta è stata annullata a causa della chiusura del socket o dell'esecuzione del comando IOCTL SIO_FLUSH.
WSAEACCES È stato effettuato un tentativo di accesso a un socket in modo vietato dalle autorizzazioni di accesso. Questo errore viene restituito in diverse condizioni per le prenotazioni delle porte persistenti che includono quanto segue: l'utente non dispone dei privilegi amministrativi necessari nel computer locale o l'applicazione non è in esecuzione in una shell avanzata come amministratore predefinito (RunAs administrator).
WSAEFAULT Il sistema ha rilevato un indirizzo puntatore non valido nel tentativo di usare un argomento puntatore in una chiamata. Questo errore viene restituito del parametro lpvInBuffer, lpvoutBuffer, lpcbBytesReturned, lpOverlapped o lpCompletionRoutine non è totalmente contenuto in una parte valida dello spazio indirizzi utente.
WSAEINPROGRESS È in corso un'operazione di blocco. Questo errore viene restituito se la funzione viene richiamata quando è in corso un callback.
WSAEINTR Un'operazione di blocco è stata interrotta da una chiamata a WSACancelBlockingCall. Questo errore viene restituito se un'operazione di blocco è stata interrotta.
WSAEINVAL Argomento fornito non valido. Questo errore viene restituito se 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.
WSAENETDOWN Rete inattiva rilevata durante l'operazione del socket. Questo errore viene restituito se il sottosistema di rete non è riuscito.
WSAENOTSOCK Un'operazione è stata tentata su un elemento che non è un socket. Questo errore viene restituito se il descrittore s non è un socket.
WSAEOPNOTSUPP L'operazione tentata non è supportata per il tipo di oggetto a cui viene fatto riferimento. Questo errore viene restituito se il comando IOCTL specificato non è supportato. Questo errore viene restituito anche se la SIO_LOOPBACK_FAST_PATH IOCTL non è supportata dal provider di trasporto.

Commenti

Un'applicazione può usare la SIO_LOOPBACK_FAST_PATH IOCTL per ridurre la latenza e migliorare le prestazioni delle operazioni di loopback in un socket TCP. Questo IOCTL richiede che lo stack TCP/IP usi un percorso rapido speciale per le operazioni di loopback su questo socket. Il SIO_LOOPBACK_FAST_PATH IOCTL può essere usato solo con socket TCP. Questo IOCTL deve essere usato su entrambi i lati della sessione di loopback. Il percorso rapido del loopback TCP è supportato usando l'interfaccia di loopback IPv4 o IPv6.

Il socket che prevede di avviare la richiesta di connessione deve applicare questo IOCTL prima di effettuare la richiesta di connessione. Quindi il socket usato dalla funzione ConnectEx, WSAConnect, WSAConnectByList o WSAConnectByName per avviare la connessione deve applicare questo IOCTL per usare il percorso rapido per le operazioni di loopback.

Il socket in ascolto della richiesta di connessione deve applicare questo IOCTL prima di accettare la connessione. Quindi il socket usato dalla funzione di ascolto deve applicare questo IOCTL in modo che tutti i socket accettati useranno il percorso rapido per il loopback. Tutti i socket restituiti dalla funzione di ascolto e passati alla funzione accept, AcceptEx o WSAAccept verranno contrassegnati per usare il percorso rapido speciale per le operazioni di loopback.

Dopo che un'applicazione stabilisce la connessione in un'interfaccia di loopback usando il percorso rapido, tutti i pacchetti per la durata della connessione devono usare il percorso rapido.

L'applicazione di SIO_LOOPBACK_FAST_PATH a un socket che verrà connesso a un percorso di non loopback non avrà alcun effetto.

Questa ottimizzazione del loopback TCP genera pacchetti che passano attraverso il livello di trasporto (TL) anziché il loopback tradizionale tramite il livello di rete. Questa ottimizzazione migliora la latenza per i pacchetti di loopback. Quando un'applicazione acconsente esplicitamente a un'impostazione a livello di connessione per usare il percorso rapido di loopback, tutti i pacchetti seguiranno il percorso di loopback. Per le comunicazioni di loopback, la congestione e l'eliminazione dei pacchetti non sono previste. Il concetto di controllo della congestione e di recapito affidabile in TCP non sarà necessario. Questo, tuttavia, non è vero per il controllo del flusso. Senza il controllo del flusso, il mittente può sovraccaricare il buffer di ricezione, causando un comportamento di loopback TCP errato. Il controllo del flusso nel percorso di loopback ottimizzato per TCP viene gestito inserendo le richieste di invio in una coda. Quando il buffer di ricezione è pieno, lo stack TCP/IP garantisce che gli invii non vengano completati finché la coda non viene gestita mantenendo il controllo del flusso.

Le connessioni loopback di percorso rapido TCP in presenza di un callout di Windows Filtering Platform (WFP) per i dati di connessione devono accettare il percorso lento non ottimizzato per il loopback. Pertanto, i filtri WFP impediranno l'uso di questo nuovo percorso rapido di loopback. Quando viene abilitato un filtro WFP, il sistema userà il percorso lento anche se è stato impostato il SIO_LOOPBACK_FAST_PATH IOCTL. Ciò garantisce che le applicazioni in modalità utente abbiano la funzionalità di sicurezza completa del WFP.

Per impostazione predefinita, SIO_LOOPBACK_FAST_PATH è disabilitato.

Solo un subset delle opzioni socket TCP/IP è supportato quando il SIO_LOOPBACK_FAST_PATH IOCTL viene usato per abilitare il percorso rapido di loopback in un socket. L'elenco delle opzioni supportate include quanto segue:

  • 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

Vedi anche

Opzioni socket IPPROTO_IP

Opzioni socket IPPROTO_IPV6

Opzioni socket IPPROTO_TCP

Socket

Opzioni socket SOL_SOCKET

WSAGetLastError

WSAGetOverlappedResult

Wsaioctl

WSAOVERLAPPED

WSASocketA

WSASocketW