Winsock IOCTLs

Questa sezione descrive i controlli di input/output di Winsock Socket (IOCTLs) per varie edizioni dei sistemi operativi Windows. Usare la funzione WSAIoctl o WSPIoctl per rilasciare un IOCTL Winsock per controllare la modalità di un socket, il protocollo di trasporto o il sottosistema di comunicazione.

Alcuni IOCTL Winsock richiedono una spiegazione maggiore di quanto possa comunicare questa tabella; tali opzioni contengono collegamenti ad argomenti aggiuntivi.

È possibile adottare uno schema di codifica che mantiene gli opcode ioctlsocket attualmente definiti, fornendo un modo pratico per partizionare lo spazio degli identificatori opcode in quanto il parametro dwIoControlCode è ora un'entità a 32 bit. Il parametro dwIoControlCode viene creato per consentire l'indipendenza del protocollo e del fornitore quando si aggiungono nuovi codici di controllo mantenendo la compatibilità con le versioni precedenti con i codici di controllo Windows Sockets 1.1 e Unix. Il parametro dwIoControlCode ha il formato seguente.

I O V T Famiglia fornitore/indirizzo Codice
3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0

Nota

I bit nel parametro dwIoControlCode visualizzati nella tabella devono essere letti verticalmente dall'alto verso il basso per colonna. Il bit più a sinistra è quindi 31, il bit successivo è 30 e il bit più a destra è 0.

Viene impostato se il buffer di input è valido per il codice, come con IOC_IN.

O viene impostato se il buffer di output è valido per il codice, come con IOC_OUT. I codici di controllo che usano sia i buffer di input che di output impostano sia I che O.

V viene impostato se non sono presenti parametri per il codice, come con IOC_VOID.

T è una quantità a 2 bit che definisce il tipo di IOCTL. Vengono definiti i valori seguenti:

0 IOCTL è un codice IOCTL Unix standard, come con FIONREAD e FIONBIO.

1 IOCTL è un codice IOCTL Windows Sockets 2 generico. I nuovi codici IOCTL definiti per Windows Sockets 2 avranno T == 1.

2 L'IOCTL si applica solo a una famiglia di indirizzi specifica.

3 L'IOCTL si applica solo al provider di un fornitore specifico, come per IOC_VENDOR. Questo tipo consente alle aziende di assegnare un numero fornitore visualizzato nel parametro della famiglia Fornitore/Indirizzo . Quindi, il fornitore può definire nuovi IOCTL specifici di tale fornitore senza dover registrare IOCTL con una clearinghouse, fornendo così flessibilità e privacy del fornitore.

Famiglia fornitore/indirizzo Quantità a 11 bit che definisce il fornitore proprietario del codice (se T == 3) o che contiene la famiglia di indirizzi a cui si applica il codice (se T == 2). Se si tratta di un codice IOCTL Unix (T == 0), questo parametro ha lo stesso valore del codice in Unix. Se si tratta di un generico IOCTL (T == 1) di Windows Sockets 2, questo parametro può essere usato come estensione del parametro di codice per fornire valori di codice aggiuntivi.

Codice Quantità a 16 bit che contiene il codice IOCTL specifico per l'operazione.

Codici IOCTL Unix

Sono supportati i seguenti codici IOCTL Unix (comandi).

FIONBIO

Abilitare o disabilitare la modalità di non blocco nel socket s. Il parametro lpvInBuffer punta a un valore di tipo unsigned long (QoS), diverso da zero se la modalità non bloccante deve essere abilitata e zero se deve essere disabilitata. Quando viene creato un socket, funziona in modalità di blocco ( ovvero, la modalità non bloccanti è disabilitata). Ciò è coerente con i socket BSD.

La routine WSAAsyncSelect o WSAEventSelect imposta automaticamente un socket sulla modalità non bloccanti. Se WSAAsyncSelect o WSAEventSelect è stato emesso su un socket, qualsiasi tentativo di usare WSAIoctl per impostare nuovamente la modalità di blocco del socket avrà esito negativo con WSAEINVAL. Per ripristinare la modalità di blocco, un'applicazione deve prima disabilitare WSAAsyncSelect chiamando WSAAsyncSelect con il parametro lEvent uguale a zero oppure disabilitare WSAEventSelect chiamando WSAEventSelect con il parametro lNetworkEvents uguale a zero.

FIONREAD

Determinare la quantità di dati che possono essere letti in modo atomico dal socket s. Il parametro lpvOutBuffer punta a un long senza segno in cui WSAIoctl archivia il risultato.

Se il socket passato nel parametro s è orientato al flusso (ad esempio, tipo SOCK_STREAM), FIONREAD restituisce la quantità totale di dati che possono essere letti in una singola operazione di ricezione; si tratta in genere della quantità totale di dati accodati sul socket (poiché un flusso di dati è orientato ai byte, questo non è garantito).

Se il socket passato nel parametro s è orientato ai messaggi (ad esempio, tipo SOCK_DGRAM), FIONREAD restituisce il numero totale di byte disponibili per la lettura, non le dimensioni del primo datagramma (messaggio) accodato sul socket.

SIOCATMARK

Determinare se tutti i dati OOB sono stati letti o meno. Questo vale solo per un socket di tipo flusso (ad esempio, tipo SOCK_STREAM) configurato per la ricezione inline di qualsiasi dati OOB (SO_OOBINLINE). Se non è in attesa di lettura alcun dato OOB, l'operazione restituisce TRUE. In caso contrario, restituisce FALSE e l'operazione di ricezione successiva eseguita sul socket recupererà alcuni o tutti i dati precedenti al contrassegno; l'applicazione deve usare l'operazione SIOCATMARK per determinare se rimane. Se sono presenti dati normali che precedono i dati urgenti (fuori banda), verranno ricevuti in ordine. Si noti che le operazioni recv non combinano mai IOB e i dati normali nella stessa chiamata. lpvOutBuffer punta a un valore BOOL in cui WSAIoctl archivia il risultato.

Comandi di Windows Sockets 2

Sono supportati i comandi di Windows Sockets 2 seguenti.

SIO_ACQUIRE_PORT_RESERVATION (impostazione opcode: I, T==3)

Richiedere una prenotazione di runtime per un blocco di porte TCP o UDP. Per le prenotazioni delle porte di runtime, il pool di porte richiede che le prenotazioni vengano utilizzate dal processo in cui è stata concessa la prenotazione. Le prenotazioni delle porte di runtime durano solo a condizione che sia stata chiamata la durata del socket in cui è stato chiamato il SIO_ACQUIRE_PORT_RESERVATION IOCTL. Al contrario, le prenotazioni di porta persistenti create usando createPersistentTcpPortReservation o CreatePersistentUdpPortReservation possono essere utilizzate da qualsiasi processo con la possibilità di ottenere prenotazioni persistenti.

Per informazioni più dettagliate, vedere le informazioni di riferimento sul SIO_ACQUIRE_PORT_RESERVATION .

SIO_ACQUIRE_PORT_RESERVATION è supportato in Windows Vista e versioni successive del sistema operativo.

SIO_ADDRESS_LIST_CHANGE (impostazione opcode: V, T==1)

Per ricevere una notifica delle modifiche nell'elenco degli indirizzi di trasporto locali della famiglia di protocolli del socket a cui l'applicazione può associare. Nessuna informazione di output verrà fornita al completamento di questo IOCTL; il completamento indica semplicemente che l'elenco di indirizzi locali disponibili è stato modificato e deve essere nuovamente sottoposto a query tramite SIO_ADDRESS_LIST_QUERY.

Si presuppone (anche se non obbligatorio) che l'applicazione usi operazioni di I/O sovrapposte per ricevere una notifica di modifica al completamento della richiesta di SIO_ADDRESS_LIST_CHANGE . In alternativa, se il SIO_ADDRESS_LIST_CHANGE IOCTL viene emesso in un socket non bloccante e senza parametri sovrapposti (lpOverlapped/ lpCompletionRoutine sono impostati su NULL), verrà completato immediatamente con l'errore WSAEWOULDBLOCK. L'applicazione può quindi attendere gli eventi di modifica dell'elenco di indirizzi tramite una chiamata a WSAEventSelect o WSAAsyncSelect con FD_ADDRESS_LIST_CHANGE bit impostato nella maschera di bit dell'evento di rete.

SIO_ADDRESS_LIST_QUERY (impostazione opcode: O, T==1)

Ottiene un elenco di indirizzi di trasporto locali della famiglia di protocolli del socket a cui l'applicazione può associare. L'elenco degli indirizzi varia in base alla famiglia di indirizzi e alcuni indirizzi vengono esclusi dall'elenco.

Nota

Negli ambienti Plug-n-Play di Windows gli indirizzi possono essere aggiunti e rimossi in modo dinamico. Pertanto, le applicazioni non possono basarsi sulle informazioni restituite da SIO_ADDRESS_LIST_QUERY per essere persistenti. Le applicazioni possono registrarsi per le notifiche di modifica degli indirizzi tramite il SIO_ADDRESS_LIST_CHANGE IOCTL che fornisce la notifica tramite un evento di I/O sovrapposto o FD_ADDRESS_LIST_CHANGE. La sequenza di azioni seguente può essere usata per garantire che l'applicazione abbia sempre informazioni sull'elenco indirizzi corrente:

  • Problema SIO_ADDRESS_LIST_CHANGE IOCTL
  • Problema SIO_ADDRESS_LIST_QUERY IOCTL
  • Ogni volta che SIO_ADDRESS_LIST_CHANGE IOCTL invia una notifica all'applicazione della modifica dell'elenco indirizzi (tramite operazioni di I/O sovrapposte o segnalando FD_ADDRESS_LIST_CHANGE evento), è necessario ripetere l'intera sequenza di azioni.

Per informazioni più dettagliate, vedere le informazioni di riferimento SIO_ADDRESS_LIST_QUERY . SIO_ADDRESS_LIST_QUERY è supportato in Windows 2000 e versioni successive.

SIO_APPLY_TRANSPORT_SETTING (impostazione opcode: I, T==3)

Applica un'impostazione di trasporto a un socket. L'impostazione di trasporto applicata è basata sul TRANSPORT_SETTING_ID passato nel parametro lpvInBuffer .

L'unica impostazione di trasporto attualmente definita è per la funzionalità di REAL_TIME_NOTIFICATION_CAPABILITY in un socket TCP.

Se il TRANSPORT_SETTING_ID passato ha impostato il membro Guid su REAL_TIME_NOTIFICATION_CAPABILITY, si tratta di una richiesta di applicazione delle impostazioni di notifica in tempo reale per il socket TCP usato con ControlChannelTrigger per ricevere notifiche di rete in background in un'app di Windows Store.

Per informazioni più dettagliate, vedere il riferimento SIO_APPLY_TRANSPORT_SETTING . SIO_APPLY_TRANSPORT_SETTING è supportato in Windows 8, Windows Server 2012 e versioni successive.

SIO_ASSOCIATE_HANDLE (impostazione opcode: I, T==1)

Associa il socket all'handle specificato di un'interfaccia correlata. Il buffer di input contiene il valore intero corrispondente alla costante manifesto per l'interfaccia complementare (ad esempio, TH_NETDEV e TH_TAPI.), seguito da un valore che è un handle dell'interfaccia complementare specificata, insieme ad altre informazioni necessarie. Per informazioni dettagliate su una particolare interfaccia complementare, vedere la sezione appropriata in Winsock Allegati . La dimensione totale viene riflessa nella lunghezza del buffer di input. Non è necessario alcun buffer di output. Il codice di errore WSAENOPROTOOPT è indicato per i provider di servizi che non supportano questo IOCTL. L'handle associato a questo IOCTL può essere recuperato usando SIO_TRANSLATE_HANDLE.

Un'interfaccia complementare può essere usata, ad esempio, se un determinato provider fornisce (1) una grande quantità di controlli aggiuntivi sul comportamento di un socket e (2) i controlli sono abbastanza specifici del provider che non mappano alle funzioni Windows Socket esistenti o a quelle probabilmente definite in futuro. È consigliabile usare Il modello a oggetti componente (COM) anziché questo IOCTL per individuare e tenere traccia di altre interfacce che potrebbero essere supportate da un socket. Questo IOCTL è presente per la compatibilità (inversa) con i sistemi in cui COM non è disponibile o non può essere usato per un altro motivo.

SIO_ASSOCIATE_PORT_RESERVATION (impostazione opcode: I, T==3)

Associare un socket a una prenotazione persistente o di runtime per un blocco di porte TCP o UDP identificate dal token di prenotazione della porta. Il SIO_ASSOCIATE_PORT_RESERVATION IOCTL deve essere rilasciato prima che il socket sia associato. Se e quando il socket è associato, la porta assegnata a verrà selezionata dalla prenotazione della porta identificata dal token specificato. Se non sono disponibili porte dalla prenotazione specificata, la chiamata alla funzione di associazione avrà esito negativo.

Per informazioni più dettagliate, vedere il riferimento SIO_ASSOCIATE_PORT_RESERVATION .

SIO_ASSOCIATE_PORT_RESERVATION è supportato in Windows Vista e versioni successive del sistema operativo.

SIO_BASE_HANDLE (impostazione opcode: O, T==1)

Recupera l'handle del provider di servizi di base per un determinato socket. Il valore restituito è un SOCKET.

Un provider di servizi a livelli non intercetta mai questo IOCTL perché il valore restituito deve essere l'handle socket dal provider di servizi di base.

Se il buffer di output non è sufficiente per un handle socket ( cbOutBuffer è minore delle dimensioni di un SOCKET) o il parametro lpvOutBuffer è un puntatore NULL , SOCKET_ERROR viene restituito come risultato di questo IOCTL e WSAGetLastError restituisce WSAEFAULT.

SIO_BASE_HANDLE è definito nel file di intestazione Mswsock.h e supportato in Windows Vista e versioni successive.

SIO_BSP_HANDLE (impostazione opcode: O, T==1)

Recupera l'handle del provider di servizi di base per un socket usato dalla funzione WSASendMsg . Il valore restituito è un SOCKET.

Questo Ioctl viene usato da un provider di servizi a livelli per garantire che il provider intercetta la funzione WSASendMsg .

Se il buffer di output non è sufficiente per un handle socket ( cbOutBuffer è minore delle dimensioni di un SOCKET) o il parametro lpvOutBuffer è un puntatore NULL , SOCKET_ERROR viene restituito come risultato di questo IOCTL e WSAGetLastError restituisce WSAEFAULT.

SIO_BSP_HANDLE è definito nel file di intestazione Mswsock.h e supportato in Windows Vista e versioni successive.

SIO_BSP_HANDLE_SELECT (impostazione opcode: O, T==1)

Recupera l'handle del provider di servizi di base per un socket usato dalla funzione select . Il valore restituito è un SOCKET.

Questo Ioctl viene usato da un provider di servizi a livelli per garantire che il provider intercetta la funzione di selezione .

Se il buffer di output non è sufficiente per un handle socket ( cbOutBuffer è minore delle dimensioni di un SOCKET) o il parametro lpvOutBuffer è un puntatore NULL , SOCKET_ERROR viene restituito come risultato di questo IOCTL e WSAGetLastError restituisce WSAEFAULT.

SIO_BSP_HANDLE_SELECT è definito nel file di intestazione Mswsock.h e supportato in Windows Vista e versioni successive.

SIO_BSP_HANDLE_POLL (impostazione opcode: O, T==1)

Recupera l'handle del provider di servizi di base per un socket usato dalla funzione WSAPoll . Il parametro lpOverlapped deve essere un puntatore NULL . Il valore restituito è un SOCKET.

Questo Ioctl viene usato da un provider di servizi a livelli per garantire che il provider intercetta la funzione WSAPoll .

Se il buffer di output non è sufficiente per un handle socket ( cbOutBuffer è minore delle dimensioni di un SOCKET), il parametro lpvOutBuffer è un puntatore NULL o il parametro lpOverlapped non è un puntatore NULL , SOCKET_ERROR viene restituito come risultato di questo IOCTL e WSAGetLastError restituisce WSAEFAULT.

SIO_BSP_HANDLE_POLL è definito nel file di intestazione Mswsock.h e supportato in Windows Vista e versioni successive.

SIO_CHK_QOS (impostazione opcode: I, O, T==3)

Recupera informazioni sulle caratteristiche del traffico QoS. Durante la fase di transizione sul sistema di invio tra la configurazione del flusso e la ricezione di un messaggio RESV (vedere Come il servizio RSVP richiama TC per altre informazioni sulla fase di transizione), il traffico associato a un flusso RSVP viene modellato in base al tipo di servizio (BEST EFFORT, CONTROLLED LOAD o GUARANTEED). Per altre informazioni, vedere Uso di SIO_CHK_QOS nella sezione Qualità del servizio di Platform SDK.

SIO_CPU_AFFINITY (impostazione opcode: I, T==3)

Abilita la condivisione delle porte e riceve l'indicazione di parallelizzazione. Quando l'applicazione usa questa opzione socket per associare socket a processori diversi e quindi associa i socket allo stesso indirizzo, le indicazioni di ricezione verranno distribuite tra i socket in base all'hash RSS (Receive Side Scaling). Le impostazioni RSS non cambiano, quindi qualsiasi flusso specificato (endpoint locale, coppia di endpoint remoti) verrà sempre indicato nello stesso processore. Di conseguenza, tutti i pacchetti appartenenti a un determinato flusso verranno indicati nello stesso socket. Questo IOCTL deve essere chiamato prima dell'associazione, in caso contrario, verrà restituito WSAEINVAL. Il buffer di input è un indice del processore (basato su 0) di tipo USHORT. IOCTL non è compatibile con SO_REUSEADDR e SO_REUSE_MULTICASTPORT. Supportato solo per i socket UDP.

Nota

Se si usa la versione 10.0.19041.0 (Windows 10, versione 2004) di Windows SDK, usare il valore 0x98000015 anziché il nome SIO_CPU_AFFINITY.

SIO_ENABLE_CIRCULAR_QUEUEING (impostazione opcode: V, T==1)

Indica al provider di servizi orientati ai messaggi sottostanti che un messaggio appena arrivato non deve mai essere eliminato a causa di un overflow della coda del buffer. Al contrario, il messaggio meno recente nella coda deve essere eliminato per supportare il messaggio appena arrivato. Non sono necessari buffer di input e output. Si noti che questo IOCTL è valido solo per i socket associati a protocolli non affidabili e orientati ai messaggi. Il codice di errore WSAENOPROTOOPT è indicato per i provider di servizi che non supportano questo IOCTL.

SIO_FIND_ROUTE (impostazione opcode: O, T=1)

Quando viene emesso, questo IOCTL richiede che venga individuata la route all'indirizzo remoto specificato come sockaddr nel buffer di input. Se l'indirizzo esiste già nella cache locale, la voce è invalidata. Nel caso di IPX di Novell, questa chiamata avvia un indirizzo IPX GetLocalTarget (GLT), che esegue una query sulla rete per l'indirizzo remoto specificato.

SIO_FLUSH (impostazione opcode: V, T=1)

Elimina il contenuto corrente della coda di invio associata a questo socket. Non sono necessari buffer di input e output. Il codice di errore WSAENOPROTOOPT è indicato per i provider di servizi che non supportano questo IOCTL.

SIO_GET_BROADCAST_ADDRESS (impostazione opcode: O, T==1)

Questo IOCTL riempie il buffer di output con una struttura sockaddr contenente un indirizzo di trasmissione adatto per l'uso con sendto/ WSASendTo. Questo IOCTL non è supportato per i socket IPv6 e restituisce il codice di errore WSAENOPROTOOPT .

SIO_GET_EXTENSION_FUNCTION_POINTER (impostazione opcode: O, I, T=1)

Recuperare un puntatore alla funzione di estensione specificata supportata dal provider di servizi associato. Il buffer di input contiene un identificatore univoco globale (GUID) il cui valore identifica la funzione di estensione in questione. Il puntatore alla funzione desiderata viene restituito nel buffer di output. Gli identificatori delle funzioni di estensione vengono stabiliti dai fornitori di provider di servizi e devono essere inclusi nella documentazione del fornitore che descrive le funzionalità delle funzioni di estensione e la semantica.

I valori GUID per le funzioni di estensione supportati dal provider di servizi TCP/IP di Windows sono definiti nel file di intestazione Mswsock.h . Il valore possibile per questi GUID è il seguente:

Termine Descrizione
WSAID_ACCEPTEX
Funzione di estensione AcceptEx .
WSAID_CONNECTEX
Funzione di estensione ConnectEx .
WSAID_DISCONNECTEX
Funzione di estensione DisconnectEx .
WSAID_GETACCEPTEXSOCKADDRS
Funzione di estensione GetAcceptExSockaddrs .
WSAID_TRANSMITFILE
Funzione di estensione TransmitFile .
WSAID_TRANSMITPACKETS
Funzione di estensione TransmitPackets .
WSAID_WSARECVMSG
Funzione di estensione LPFN_WSARECVMSG (WSARecvMsg).
WSAID_WSASENDMSG
Funzione di estensione WSASendMsg .

SIO_GET_GROUP_QOS (impostazione opcode: O, I, T==1)

Riservato per l'uso futuro con socket.

Recuperare la struttura QOS associata al gruppo di socket a cui appartiene questo socket. Il buffer di input è facoltativo. Alcuni protocolli ,ad esempio RSVP, consentono l'uso del buffer di input per qualificare una qualità della richiesta di servizio. La struttura QOS verrà copiata nel buffer di output. Se questo socket non appartiene a un gruppo di socket appropriato, i membri SendingFlowspec e ReceivingFlowspec della struttura QOS restituita sono impostati su NULL. Il codice di errore WSAENOPROTOOPT è indicato per i provider di servizi che non supportano la qualità del servizio.

SIO_GET_INTERFACE_LIST (impostazione opcode: O, T==0)

Restituisce un elenco di interfacce IP configurate e i relativi parametri come matrice di strutture INTERFACE_INFO .

Nota

Il supporto di questo comando è obbligatorio per i provider di servizi TCP/IP conformi a Windows Sockets 2.

Il parametro lpvOutBuffer punta al buffer in cui archiviare le informazioni sulle interfacce come matrice di strutture INTERFACE_INFO per indirizzi IP unicast nelle interfacce. Il parametro cbOutBuffer specifica la lunghezza del buffer di output. Il numero di interfacce restituite (numero di strutture restituite nel buffer a cui punta il parametro lpvOutBuffer ) può essere determinato in base alla lunghezza effettiva del buffer di output restituito nel parametro lpcbBytesReturned .

Se la funzione WSAIoctl viene chiamata con SIO_GET_INTERFACE_LIST e il membro di livello del parametro del socket non viene definito come IPPROTO_IP, viene restituito WSAEINVAL . Una chiamata alla funzione WSAIoctl con SIO_GET_INTERFACE_LIST restituisce WSAEFAULT se il parametro cbOutBuffer che specifica la lunghezza del buffer di output è troppo piccola riceve l'elenco di interfacce configurate.

SIO_GET_INTERFACE_LIST è supportato in Windows Me/98 e Windows NT 4.0 con SP4 e versioni successive.

SIO_GET_INTERFACE_LIST_EX (impostazione opcode: O, T==0)

Riservato per l'uso futuro con socket.

Restituisce un elenco di interfacce IP configurate e i relativi parametri come matrice di strutture INTERFACE_INFO_EX .

Il parametro lpvOutBuffer punta al buffer in cui archiviare le informazioni sulle interfacce come matrice di strutture INTERFACE_INFO_EX per indirizzi IP unicast nell'interfaccia. Il parametro cbOutBuffer specifica la lunghezza del buffer di output. Il numero di interfacce restituite (numero di strutture restituite in lpvOutBuffer) può essere determinato in base alla lunghezza effettiva del buffer di output restituito nel parametro lpcbBytesReturned .

SIO_GET_INTERFACE_LIST_EX non è attualmente supportato in Windows.

SIO_GET_QOS (impostazione opcode: O, T==1)

Riservato per l'uso futuro con socket. Recuperare la struttura QOS associata al socket. Il buffer di input è facoltativo. Alcuni protocolli ,ad esempio RSVP, consentono l'uso del buffer di input per qualificare una qualità della richiesta di servizio. La struttura QOS verrà copiata nel buffer di output. Il buffer di output deve essere di dimensioni sufficienti per contenere la struttura QOS completa. Il codice di errore WSAENOPROTOOPT è indicato per i provider di servizi che non supportano la qualità del servizio.

Un mittente potrebbe non chiamare SIO_GET_QOS finché il socket non è connesso.

Un ricevitore può chiamare SIO_GET_QOS non appena è associato.

SIO_GET_TX_TIMESTAMP

Un socket IOCTL usato per ottenere timestamp per i pacchetti TX trasmessi. Valido solo per i socket datagram.

Il codice di controllo SIO_GET_TX_TIMESTAMP rimuove un timestamp di trasmissione dalla coda di timestamp di trasmissione di un socket. Abilitare prima la ricezione timestamp usando il socket IOCTL SIO_TIMESTAMPING . Recuperare quindi i timestamp tx in base all'ID chiamando la funzione WSAIoctl (o WSPIoctl) con i parametri seguenti.

Per SIO_GET_TX_TIMESTAMP, l'input è un ID timestamp UINT32 e l'output è un valore timestamp UINT64 . In caso di esito positivo, il timestamp tx è disponibile e viene restituito. Se non sono disponibili timestamp di trasmissione, WSAGetLastError restituisce WSAEWOULDBLOCK.

Nota

I timestamp TX non sono supportati quando si esegue un invio in unione tramite UDP_SEND_MSG_SIZE.

Vedere anche timestamp Winsock.

SIO_IDEAL_SEND_BACKLOG_CHANGE (impostazione opcode: V, T=0)

Notifica a un'applicazione quando il valore ISB (Ideal Send BackLog) cambia per la connessione sottostante.

Quando si inviano dati tramite una connessione TCP usando i socket Di 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_CHANGE IOCTL può essere usato da un'applicazione per ricevere una notifica quando il valore ISB cambia dinamicamente per una connessione.

Per informazioni più dettagliate, vedere il riferimento SIO_IDEAL_SEND_BACKLOG_CHANGE .

SIO_IDEAL_SEND_BACKLOG_CHANGE è supportato in Windows Server 2008, Windows Vista con SP1 e versioni successive del sistema operativo.

SIO_IDEAL_SEND_BACKLOG_QUERY (impostazione opcode: O, T==0)

Recupera il valore di backlog di invio ideale (ISB) per la connessione sottostante.

Quando si inviano dati tramite una connessione TCP usando i socket Di 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 e versioni successive. Il SIO_IDEAL_SEND_BACKLOG_QUERY IOCTL può essere usato da un'applicazione per eseguire una query sul valore ISB per una connessione.

Per informazioni più dettagliate, vedere il riferimento SIO_IDEAL_SEND_BACKLOG_QUERY .

SIO_IDEAL_SEND_BACKLOG_QUERY è supportato in Windows Server 2008, Windows Vista con SP1 e versioni successive del sistema operativo.

SIO_KEEPALIVE_VALS (impostazione opcode: I, T==3)

Abilita o disabilita l'impostazione per connessione dell'opzione TCP keep-alive che specifica il timeout e l'intervallo TCP keep-alive. Per altre informazioni sull'opzione keep-alive, vedere la sezione 4.2.3.6 sui requisiti per gli host Internet: livelli di comunicazione specificati in RFC 1122 disponibili nel sito Web IETF. Questa risorsa può essere disponibile solo in inglese.

SIO_KEEPALIVE_VALS può essere usato per abilitare o disabilitare probe keep-alive e impostare il timeout e l'intervallo keep-alive. Il timeout keep-alive specifica il timeout, in millisecondi, senza attività finché non viene inviato il primo pacchetto keep-alive. L'intervallo keep-alive specifica l'intervallo, in millisecondi, tra quando vengono inviati pacchetti keep-alive successivi se non viene ricevuto alcun riconoscimento.

L'opzione SO_KEEPALIVE , che è una delle opzioni socket SOL_SOCKET, può essere usata anche per abilitare o disabilitare il valore TCP keep-alive in una connessione, nonché eseguire una query sullo stato corrente di questa opzione. Per eseguire query sul fatto che TCP keep-alive sia abilitato in un socket, è possibile chiamare la funzione getsockopt con l'opzione SO_KEEPALIVE . Per abilitare o disabilitare TCP keep-alive, la funzione setockopt può essere chiamata con l'opzione SO_KEEPALIVE . Se TCP keep-alive è abilitato con SO_KEEPALIVE, le impostazioni TCP predefinite vengono usate per il timeout e l'intervallo keep-alive, a meno che questi valori non siano stati modificati usando SIO_KEEPALIVE_VALS.

Per informazioni più dettagliate, vedere il riferimento SIO_KEEPALIVE_VALS . SIO_KEEPALIVE_VALS è supportato in Windows 2000 e versioni successive.

SIO_LOOPBACK_FAST_PATH (impostazione opcode: I, T==3)

Configura un socket TCP per una latenza inferiore e operazioni più veloci sull'interfaccia di loopback. 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. Per impostazione predefinita, SIO_LOOPBACK_FAST_PATH è disabilitato.

Per informazioni più dettagliate, vedere il riferimento SIO_LOOPBACK_FAST_PATH . SIO_LOOPBACK_FAST_PATH è supportato in Windows 8, Windows Server 2012 e versioni successive.

SIO_MULTIPOINT_LOOPBACK (impostazione opcode: V, T==1)

Controlla se i dati inviati da un'applicazione nel computer locale (non necessariamente dallo stesso socket) in una sessione multicast verranno ricevuti da un socket aggiunto al gruppo di destinazione multicast nell'interfaccia di loopback. Un valore true causa l'invio di dati multicast da un'applicazione nel computer locale a un socket di ascolto nell'interfaccia di loopback. Un valore false impedisce che i dati multicast inviati da un'applicazione nel computer locale vengano recapitati a un socket di ascolto nell'interfaccia di loopback. Per impostazione predefinita, SIO_MULTIPOINT_LOOPBACK è abilitato.

SIO_MULTICAST_SCOPE (impostazione opcode: I, T==1)

Specifica l'ambito su cui si verificheranno le trasmissioni multicast. L'ambito è definito come numero di segmenti di rete indirizzati da coprire. Un ambito pari a zero indica che la trasmissione multicast non verrebbe posizionata sul filo, ma potrebbe essere distribuita tra socket all'interno dell'host locale. Un valore di ambito di uno (impostazione predefinita) indica che la trasmissione verrà posizionata sul filo, ma non intersecherà alcun router. I valori di ambito più elevati determinano il numero di router che possono essere incrociati. Si noti che corrisponde al parametro TTL (time-to-live) nel multicast IP. Per impostazione predefinita, l'ambito è 1.

SIO_QUERY_RSS_PROCESSOR_INFO (impostazione opcode: O, T==1)

Esegue query sull'associazione tra un socket e un core del processore RSS e un nodo NUMA.

Il SIO_QUERY_RSS_PROCESSOR_INFO IOCTL restituisce una struttura SOCKET_PROCESSOR_AFFINITY che contiene l'PROCESSOR_NUMBER e l'ID nodo NUMA. La struttura PROCESSOR_NUMBER restituita contiene un numero di gruppo e un numero di processore relativo all'interno del gruppo.

Per informazioni più dettagliate, vedere il riferimento SIO_QUERY_RSS_PROCESSOR_INFO . SIO_QUERY_RSS_PROCESSOR_INFO è supportato in Windows 8, Windows Server 2012 e versioni successive.

SIO_QUERY_RSS_SCALABILITY_INFO (impostazione opcode: O, T==3)

Query offload interfacce per la scalabilità lato ricezione (RSS). La struttura dell'argomento restituita per SIO_QUERY_RSS_SCALABILITY_INFO viene specificata nella struttura di RSS_SCALABILITY_INFO definita nel file di intestazione Mstcpip.h . Questa struttura è definita come segue:

// Scalability info for the transport
typedef struct _RSS_SCALABILITY_INFO {
   BOOLEAN RssEnabled;
} RSS_SCALABILITY_INFO, *PRSS_SCALABILITY_INFO;

Il valore restituito nel membro RssEnabled indica se RSS è abilitato su almeno un'interfaccia.

Se il buffer di output non è abbastanza grande per la struttura RSS_SCALABILITY_INFO ( cbOutBuffer è minore delle dimensioni di un RSS_SCALABILITY_INFO) o il parametro lpvOutBuffer è un puntatore NULL , SOCKET_ERROR viene restituito come risultato di questo IOCTL e WSAGetLastError restituisce WSAEINVAL.

Nella rete ad alta velocità in cui si trovano più CPU all'interno di un singolo sistema, la capacità dello stack di protocolli di rete di ridimensionare bene in un sistema multi-CPU è inibita perché l'architettura di NDIS 5.1 e versioni precedenti limita l'elaborazione del protocollo a una singola CPU. Il ridimensionamento lato ricezione (RSS) risolve questo problema consentendo al carico di rete da una scheda di rete di essere bilanciato tra più CPU.

SIO_QUERY_RSS_SCALABILITY_INFO è supportato in Windows Vista e versioni successive.

SIO_QUERY_TRANSPORT_SETTING (impostazione opcode: I, T==3)

Esegue una query sulle impostazioni di trasporto in un socket. L'impostazione di trasporto sottoposta a query è basata sul TRANSPORT_SETTING_ID passato nel parametro lpvInBuffer .

L'unica impostazione di trasporto attualmente definita è per la funzionalità di REAL_TIME_NOTIFICATION_CAPABILITY in un socket TCP.

Se il TRANSPORT_SETTING_ID ha il membro Guid impostato su REAL_TIME_NOTIFICATION_CAPABILITY, si tratta di una richiesta per eseguire query sulle impostazioni di notifica in tempo reale per il socket TCP usato con ControlChannelTrigger per ricevere notifiche di rete in background in un'app di Windows Store. Se la chiamata WSAIoctl o WSPIoctl ha esito positivo, questo IOCTL restituisce una struttura REAL_TIME_NOTIFICATION_SETTING_OUTPUT con lo stato corrente.

Per informazioni più dettagliate, vedere il riferimento SIO_QUERY_TRANSPORT_SETTING . SIO_QUERY_TRANSPORT_SETTING è supportato in Windows 8, Windows Server 2012 e versioni successive.

SIO_QUERY_WFP_ALE_ENDPOINT_HANDLE (impostazione opcode: O, T==3)

Esegue una query sull'endpoint APPLICATION Layer Enforcement (ALE).

Windows Filtering Platform (WFP) supporta l'ispezione e la modifica del traffico di rete. In Windows Vista, WFP si concentra sugli scenari in cui il computer host è l'endpoint di comunicazione. In Windows Server 2008, tuttavia, sono disponibili implementazioni del firewall perimetrale che vogliono sfruttare la piattaforma WFP per controllare e trasferire il traffico pass-through proxy. Il server Internet Security and Acceleration (ISA) è un esempio di tale dispositivo perimetrale.

Esistono alcuni scenari del firewall che possono richiedere la possibilità di inserire un pacchetto in ingresso nel percorso di invio associato a un endpoint esistente. È necessario disporre di un meccanismo per individuare l'handle dell'endpoint del livello di trasporto associato all'endpoint di destinazione. L'applicazione che ha creato l'endpoint possiede questi endpoint del livello di trasporto. Questo IOCTL viene usato per fornire l'handle socket per il mapping dell'endpoint del livello di trasporto.

Se il buffer di output non è abbastanza grande per l'handle dell'endpoint ( cbOutBuffer è minore delle dimensioni di un oggetto UINT64) o il parametro lpvOutBuffer è un puntatore NULL , SOCKET_ERROR viene restituito come risultato di questo IOCTL e WSAGetLastError restituisce WSAEINVAL.

SIO_QUERY_WFP_ALE_ENDPOINT_HANDLE è supportato in Windows Vista e versioni successive.

SIO_QUERY_WFP_CONNECTION_REDIRECT_CONTEXT (impostazione opcode: I, T==3)

Esegue query sul contesto di reindirizzamento per un record di reindirizzamento usato da un servizio di reindirizzamento di Windows Filtering Platform (WFP).

Il SIO_QUERY_WFP_CONNECTION_REDIRECT_CONTEXT IOCTL viene usato per fornire il rilevamento della connessione proxied sulle connessioni socket reindirizzate. Questa funzionalità WFP facilita il rilevamento dei record di reindirizzamento dal reindirizzamento iniziale di una connessione alla connessione finale alla destinazione.

Per informazioni più dettagliate, vedere il riferimento SIO_QUERY_WFP_CONNECTION_REDIRECT_CONTEXT . SIO_QUERY_WFP_CONNECTION_REDIRECT_CONTEXT è supportato in Windows 8, Windows Server 2012 e versioni successive.

SIO_QUERY_WFP_CONNECTION_REDIRECT_RECORDS (impostazione opcode: I, T==3)

Esegue query sul record di reindirizzamento per la connessione TCP/IP accettata per l'uso da parte di un servizio di reindirizzamento di Windows Filtering Platform (WFP).

Il SIO_QUERY_WFP_CONNECTION_REDIRECT_RECORDS IOCTL viene usato per fornire il rilevamento della connessione proxied sulle connessioni socket reindirizzate. Questa funzionalità WFP facilita il rilevamento dei record di reindirizzamento dal reindirizzamento iniziale di una connessione alla connessione finale alla destinazione.

Per informazioni più dettagliate, vedere il riferimento SIO_QUERY_WFP_CONNECTION_REDIRECT_RECORDS . SIO_QUERY_WFP_CONNECTION_REDIRECT_RECORDS è supportato in Windows 8, Windows Server 2012 e versioni successive.

SIO_RCVALL (impostazione opcode: I, T==3)

Consente a un socket di ricevere tutti i pacchetti IPv4 o IPv6 passando un'interfaccia di rete. L'handle socket passato alla funzione WSAIoctl deve essere uno dei seguenti:

  • Socket IPv4 creato con la famiglia di indirizzi impostata su AF_INET, il tipo di socket impostato su SOCK_RAW e il protocollo impostato su IPPROTO_IP.
  • Socket IPv6 creato con la famiglia di indirizzi impostata su AF_INET6, il tipo di socket impostato su SOCK_RAW e il protocollo impostato su IPPROTO_IPV6.

Il socket deve essere associato anche a un'interfaccia IPv4 o IPv6 esplicita, che significa che non è possibile eseguire l'associazione a INADDR_ANY o in6addr_any.

In Windows Server 2008 e versioni precedenti, l'impostazione IOCTL SIO_RCVALL non acquisisce pacchetti locali inviati da un'interfaccia di rete. Sono stati inclusi pacchetti ricevuti in un'altra interfaccia e inoltrato l'interfaccia di rete specificata per il SIO_RCVALL IOCTL.

In Windows 7 e Windows Server 2008 R2 è stato modificato in modo che i pacchetti locali inviati da un'interfaccia di rete vengano acquisiti anche. Sono inclusi pacchetti ricevuti in un'altra interfaccia e quindi inoltrati all'interfaccia di rete associata al socket con SIO_RCVALL IOCTL.

L'impostazione di questo IOCTL richiede privilegi di amministratore nel computer locale.

Questa funzionalità viene talvolta definita modalità promiscua.

I valori possibili per l'opzione IOCTL SIO_RCVALL sono specificati nell'enumerazione RCVALL_VALUE definita nel file di intestazione Mstcpip.h . I valori possibili per SIO_RCVALL sono i seguenti:

Termine Descrizione
RCVALL_OFF
Disabilitare questa opzione in modo che un socket non riceva tutti i pacchetti IPv4 o IPv6 nella rete.
RCVALL_ON
Abilitare questa opzione in modo che un socket riceva tutti i pacchetti IPv4 o IPv6 nella rete. Questa opzione abilita la modalità promiscua nella scheda di interfaccia di rete (NIC), se la scheda di interfaccia di rete supporta la modalità promiscua. In un segmento LAN con un hub di rete, una scheda di interfaccia di rete che supporta la modalità promiscua acquisisce tutto il traffico IPv4 o IPv6 nella LAN, incluso il traffico tra altri computer nello stesso segmento LAN. Tutti i pacchetti acquisiti (IPv4 o IPv6, a seconda del socket) verranno recapitati al socket non elaborato.
Questa opzione non acquisisce altri pacchetti (ARP, IPX e NetBEUI, ad esempio) nell'interfaccia.
Netmon usa la stessa modalità per l'interfaccia di rete, ma non usa questa opzione per acquisire il traffico.
RCVALL_SOCKETLEVELONLY
Questa funzionalità non è attualmente implementata, quindi l'impostazione di questa opzione non ha alcun effetto.
RCVALL_IPLEVEL
Abilitare questa opzione in modo che un socket IPv4 o IPv6 riceva tutti i pacchetti a livello IP nella rete. Questa opzione non abilita la modalità promiscua nella scheda di interfaccia di rete. Questa opzione influisce solo sull'elaborazione dei pacchetti a livello IP. La scheda di interfaccia di rete riceve ancora solo pacchetti indirizzati ai relativi indirizzi unicast e multicast configurati. Tuttavia, un socket con questa opzione abilitato riceverà non solo pacchetti indirizzati a indirizzi IP specifici, ma riceverà tutti i pacchetti IPv4 o IPv6 ricevuti dalla scheda di interfaccia di rete.
Questa opzione non acquisisce altri pacchetti (ARP, IPX e NetBEUI, ad esempio) ricevuti nell'interfaccia.

Per informazioni più dettagliate, vedere il riferimento SIO_RCVALL .

SIO_RCVALL è supportato in Windows 2000 e versioni successive.

SIO_RCVALL_IGMPMCAST (impostazione opcode: I, T==3)

Consente a un socket di ricevere tutto il traffico IP multicast IGMP nella rete, senza ricevere altro traffico IP multicast. L'handle socket passato alla funzione WSAIoctl deve essere di famiglia di indirizzi AF_INET, SOCK_RAW tipo di socket e IPPROTO_IGMP protocollo. Il socket deve essere associato anche a un'interfaccia locale esplicita, il che significa che non è possibile associare a INADDR_ANY.

Dopo aver associato il socket e il set IOCTL, le chiamate alle funzioni WSARecv o recv restituiscono dati IP multicast passando l'interfaccia specificata. Si noti che è necessario specificare un buffer sufficientemente grande. L'impostazione di questo IOCTL richiede privilegi di amministratore nel computer locale.

SIO_RCVALL_IGMPMCAST è supportato in Windows 2000 e versioni successive.

SIO_RCVALL_MCAST (impostazione opcode: I, T==3)

Consente a un socket di ricevere tutto il traffico IP multicast nella rete, ovvero tutti i pacchetti IP destinati agli indirizzi IP nell'intervallo di 224.0.0.0.0 a 239.255.255.255.255. L'handle socket passato alla funzione WSAIoctl deve essere di AF_INET famiglia di indirizzi, SOCK_RAW tipo di socket e IPPROTO_UDP protocollo. Il socket deve anche essere associato a un'interfaccia locale esplicita, il che significa che non è possibile eseguire l'associazione a INADDR_ANY. Il socket deve essere associato alla porta zero.

Dopo che il socket è associato e il set IOCTL, le chiamate alle funzioni WSARecv o recv restituiscono datagrammi IP multicast passando attraverso l'interfaccia specificata. Si noti che è necessario fornire un buffer sufficientemente grande. L'impostazione di questo IOCTL richiede privilegi di amministratore nel computer locale.

SIO_RCVALL_MCAST è supportato in Windows 2000 e versioni successive.

SIO_RELEASE_PORT_RESERVATION (impostazione opcode: I, T==3)

Rilascia una prenotazione di runtime per un blocco di porte TCP o UDP. La prenotazione di runtime da rilasciare deve essere stata ottenuta dal processo di emissione usando il SIO_ACQUIRE_PORT_RESERVATION IOCTL.

Per informazioni più dettagliate, vedere il riferimento SIO_RELEASE_PORT_RESERVATION .

SIO_RELEASE_PORT_RESERVATION è supportato in Windows Vista e versioni successive del sistema operativo.

SIO_ROUTING_INTERFACE_CHANGE (impostazione opcode: I, T==1)

Per ricevere la notifica di una modifica dell'interfaccia di routing che deve essere usata per raggiungere l'indirizzo remoto nel buffer di input (specificato come struttura sockaddr ). Nessuna informazione di output sulla nuova interfaccia di routing verrà fornita al completamento di questo IOCTL; il completamento indica semplicemente che l'interfaccia di routing per una determinata destinazione è stata modificata e deve essere eseguita una query usando il SIO_ROUTING_INTERFACE_QUERY IOCTL.

Si presuppone, anche se non obbligatorio, che l'applicazione usi operazioni di I/O sovrapposte per ricevere una notifica della modifica dell'interfaccia di routing tramite il completamento di SIO_ROUTING_INTERFACE_CHANGE richiesta. In alternativa, se il SIO_ROUTING_INTERFACE_CHANGE IOCTL viene emesso su un socket non bloccante con i parametri lpOverlapped e lpCompletionRoutine impostati su NULL), verrà completato immediatamente e WSAEWOULDBLOCK come errore e l'applicazione può attendere il routing degli eventi di modifica tramite la chiamata a WSAEventSelect o WSAAsyncSelect con FD_ROUTING_INTERFACE_CHANGE bit impostato nella maschera di bit dell'evento di rete.

Si riconosce che le informazioni di routing rimangono stabili nella maggior parte dei casi, in modo da richiedere all'applicazione di mantenere più IOCTL in sospeso per ricevere notifiche su tutte le destinazioni a cui è interessato e che il provider di servizi tenga traccia di queste richieste di notifica userà una quantità significativa di risorse di sistema. Questa situazione può essere evitata estendendo il significato dei parametri di input e riducendo i requisiti del provider di servizi come indicato di seguito:

  • L'applicazione può specificare un indirizzo jolly specifico della famiglia di protocolli (uguale a quello usato nella chiamata di associazione quando si richiede di eseguire l'associazione a qualsiasi indirizzo disponibile) per richiedere notifiche di eventuali modifiche al routing. In questo modo l'applicazione può mantenere una sola SIO_ROUTING_INTERFACE_CHANGE in sospeso per tutti i socket e le destinazioni di cui dispone e quindi usare SIO_ROUTING_INTERFACE_QUERY per ottenere le informazioni di routing effettive.
  • Un provider di servizi ha la possibilità di ignorare le informazioni specificate dall'applicazione nel buffer di input del SIO_ROUTING_INTERFACE_CHANGE (come se l'applicazione specifica un indirizzo con caratteri jolly) e completare l'evento FD_ROUTING_INTERFACE_CHANGE IOCTL o segnale SIO_ROUTING_INTERFACE_CHANGE in caso di modifica delle informazioni di routing (non solo la route alla destinazione specificata nel buffer di input).

SIO_ROUTING_INTERFACE_QUERY (impostazione opcode: I, O, T==1)

Per ottenere l'indirizzo dell'interfaccia locale (rappresentata come struttura sockaddr ) che deve essere usata per inviare all'indirizzo remoto specificato nel buffer di input (come sockaddr). Gli indirizzi multicast remoti possono essere inviati nel buffer di input per ottenere l'indirizzo dell'interfaccia preferita per la trasmissione multicast. In ogni caso, l'indirizzo dell'interfaccia restituito può essere usato dall'applicazione in una richiesta bind() successiva.

Si noti che le route sono soggette a modifiche. Pertanto, le applicazioni non possono basarsi sulle informazioni restituite da SIO_ROUTING_INTERFACE_QUERY per essere persistenti. Le applicazioni possono registrarsi per il routing delle notifiche di modifica tramite il SIO_ROUTING_INTERFACE_CHANGE IOCTL che fornisce la notifica tramite operazioni di I/O sovrapposte o un evento di FD_ROUTING_INTERFACE_CHANGE. È possibile usare la sequenza di azioni seguente per garantire che l'applicazione disponga sempre di informazioni sull'interfaccia di routing correnti per una determinata destinazione:

  • Problema SIO_ROUTING_INTERFACE_CHANGE IOCTL
  • Problema SIO_ROUTING_INTERFACE_QUERY IOCTL
  • Ogni volta che SIO_ROUTING_INTERFACE_CHANGE IOCTL invia una notifica all'applicazione di modifica del routing (tramite operazioni di I/O sovrapposte o segnalando FD_ROUTING_INTERFACE_CHANGE evento), è necessario ripetere l'intera sequenza di azioni.

Se il buffer di output non è sufficientemente grande da contenere l'indirizzo dell'interfaccia, SOCKET_ERROR viene restituito come risultato di questo IOCTL e WSAGetLastError restituisce WSAEFAULT. In questo caso, le dimensioni necessarie del buffer di output verranno restituite in lpcbBytesReturned . Si noti che il codice di errore WSAEFAULT viene restituito anche se il parametro lpvInBuffer, lpvOutBuffer o lpcbBytesReturned non è totalmente contenuto in una parte valida dello spazio indirizzi utente.

Se l'indirizzo di destinazione specificato nel buffer di input non può essere raggiunto tramite alcuna delle interfacce disponibili, SOCKET_ERROR viene restituito come risultato di questo IOCTL e WSAGetLastError restituisce WSAENETUNREACH o anche WSAENETDOWN se tutta la connettività di rete viene persa.

SIO_SET_COMPATIBILITY_MODE (impostazione opcode: I, T==3)

Richiede il modo in cui lo stack di rete deve gestire determinati comportamenti per i quali il modo predefinito di gestire il comportamento può differire tra le versioni di Windows. La struttura dell'argomento per SIO_SET_COMPATIBILITY_MODE viene specificata nella struttura WSA_COMPATIBILITY_MODE definita nel file di intestazione Mswsockdef.h . Questa struttura è definita come segue:

/* Argument structure for SIO_SET_COMPATIBILITY_MODE */
typedef struct _WSA_COMPATIBILITY_MODE {
    WSA_COMPATIBILITY_BEHAVIOR_ID BehaviorId;
    ULONG TargetOsVersion;
} WSA_COMPATIBILITY_MODE, *PWSA_COMPATIBILITY_MODE;

Il valore specificato nel membro BehaviorId indica il comportamento richiesto. Il valore specificato nel membro TargetOsVersion indica la versione di Windows richiesta per il comportamento.

Il membro BehaviorId può essere uno dei valori del tipo di enumerazione WSA_COMPATIBILITY_BEHAVIOR_ID definito nel file di intestazione Mswsockdef.h . I valori possibili per il membro BehaviorId sono i seguenti.

Termine Descrizione
WsaBehaviorAll
Equivale a richiedere tutti i possibili comportamenti compatibili definiti per WSA_COMPATIBILITY_BEHAVIOR_ID.
WsaBehaviorReceiveBuffering
Quando il membro TargetOsVersion è impostato su un valore per Windows Vista o versione successiva, le riduzioni delle dimensioni del buffer di ricezione TCP in questo socket tramite l'opzione socket SO_RCVBUF sono consentite anche dopo l'istituzione di una connessione TCP.
Quando il membro TargetOsVersion è impostato su un valore precedente a Windows Vista, le riduzioni alla dimensione del buffer di ricezione TCP in questo socket tramite l'opzione socket SO_RCVBUF non sono consentite dopo la creazione della connessione.
WsaBehaviorAutoTuning
Quando il membro TargetOsVersion è impostato su un valore per Windows Vista o versione successiva, l'ottimizzazione automatica della finestra di ricezione è abilitata e il fattore di scala della finestra TCP viene ridotto a 2 dal valore predefinito 8.
Quando TargetOsVersion è impostato su un valore precedente a Windows Vista, l'ottimizzazione automatica della finestra di ricezione è disabilitata. L'opzione tcp window scaling è disabilitata e la dimensione massima della finestra di ricezione è limitata a 65.535 byte. L'opzione di ridimensionamento delle finestre TCP non può essere negoziata sulla connessione anche se l'opzione socket SO_RCVBUF è stata chiamata su questo socket specificando un valore maggiore di 65.535 byte prima che la connessione sia stata stabilita.

Per informazioni più dettagliate, vedere le informazioni di riferimento SIO_SET_COMPATIBILITY_MODE .

SIO_SET_COMPATIBILITY_MODE è supportato in Windows Vista e versioni successive.

SIO_SET_GROUP_QOS (impostazione opcode: I, T==1)

Riservato.

SIO_SET_PRIORITY_HINT (impostazione opcode: I, T==3)

Fornisce un suggerimento al protocollo di trasporto sottostante per gestire il traffico su questo socket con una priorità specifica. LpvInBuffer deve puntare a una variabile di tipo PRIORITY_HINT con cbInBuffer impostato su sizeof(PRIORITY_HINT). I parametri lpvOutBuffer e cbOutBuffer devono essere NULL e 0, rispettivamente. L'implementazione TCP di Microsoft Windows supporta questo IOCTL a partire da Windows 10, versione 1809 (10.0; Build 17763) e versioni successive come indicato di seguito: quando il valore di priorità richiesto è impostato su IoPriorityHintVeryLow, TCP usa una versione modificata dell'algoritmo LEDBAT (definito in RFC 6817) per controllare la frequenza del traffico in uscita nel socket. Il traffico in ingresso non è interessato da questo IOCTL. LEDBAT è un algoritmo di scavenger e il suo obiettivo è quello di mantenere bassa la latenza e prevenire eventuali effetti negativi sul traffico con priorità normale eliminando il traffico con priorità normale quando è presente il traffico con priorità normale.

Vedere anche RFC 6817.

SIO_SET_PRIORITY_HINT è supportato in Windows 10, versione 1809 (10,0; Build 17763) e versioni successive.

SIO_SET_QOS (impostazione opcode: I, T==1)

Associare la struttura QOS specificata al socket. Non è necessario alcun buffer di output, la struttura QOS verrà ottenuta dal buffer di input. Il codice di errore WSAENOPROTOOPT è indicato per i provider di servizi che non supportano la qualità del servizio.

SIO_TCP_INITIAL_RTO (impostazione opcode: I, T==3)

Controlla le caratteristiche di ritrasmissione iniziale (SYN/SYN+ACK) di un socket TCP configurando i parametri RTO (Initial Retransmission Timeout). I parametri di configurazione vengono specificati in una struttura TCP_INITIAL_RTO_PARAMETERS .

Per informazioni più dettagliate, vedere le informazioni di riferimento sul SIO_TCP_INITIAL_RTO . SIO_TCP_INITIAL_RTO è supportato in Windows 8, Windows Server 2012 e versioni successive.

SIO_TIMESTAMPING

Socket IOCTL usato per configurare la ricezione dei timestamp di trasmissione/ricezione del socket. Valido solo per i socket di datagrammi. Il tipo di input per SIO_TIMESTAMPING è la struttura TIMESTAMPING_CONFIG .

Vedere anche Timestamp winsock.

SIO_TRANSLATE_HANDLE (impostazione opcode: I, O, T==1)

Per ottenere un handle corrispondente per socket s valido nel contesto di un'interfaccia complementare , ad esempio TH_NETDEV e TH_TAPI. Una costante manifesto che identifica l'interfaccia complementare insieme a qualsiasi altro parametro necessario viene specificata nel buffer di input. L'handle corrispondente sarà disponibile nel buffer di output al termine di questa funzione. Per informazioni dettagliate specifiche per una particolare interfaccia complementare, fare riferimento alla sezione appropriata in Winsock. Il codice di errore WSAENOPROTOOPT è indicato per i provider di servizi che non supportano questo IOCTL per l'interfaccia complementare specificata. Questo IOCTL recupera l'handle associato tramite SIO_TRANSLATE_HANDLE.

È consigliabile usare com (Component Object Model) anziché questo IOCTL per individuare e tenere traccia di altre interfacce che potrebbero essere supportate da un socket. Questo IOCTL è presente per la compatibilità con le versioni precedenti con i sistemi in cui COM non è disponibile o non può essere usato per qualche altro motivo.

SIO_UDP_CONNRESET (impostazione opcode: I, T==3)

Windows XP: Controlla se vengono segnalati messaggi di PORT_UNREACHABLE UDP. Impostare su TRUE per abilitare la creazione di report. Impostare su FALSE per disabilitare la creazione di report.

SIO_SET_WFP_CONNECTION_REDIRECT_RECORDS (impostazione opcode: I, T==3)

Imposta il record di reindirizzamento sul nuovo socket TCP utilizzato per la connessione alla destinazione finale per l'uso da parte di un servizio di reindirizzamento di Windows Filtering Platform (WFP).

Il SIO_SET_WFP_CONNECTION_REDIRECT_RECORDS IOCTL viene usato come parte del rilevamento delle connessioni tramite proxy sulle connessioni socket reindirizzate. Questa funzionalità DEL WFP facilita il rilevamento dei record di reindirizzamento dal reindirizzamento iniziale di una connessione alla connessione finale alla destinazione.

Per informazioni più dettagliate, vedere il riferimento SIO_SET_WFP_CONNECTION_REDIRECT_RECORDS . SIO_SET_WFP_CONNECTION_REDIRECT_RECORDS è supportato in Windows 8, Windows Server 2012 e versioni successive.

SIO_TCP_INFO (impostazione opcode: I, O, T==3)

Recupera le statistiche TCP per un socket. Le statistiche TCP vengono fornite in una struttura TCP_INFO_v0 .

A differenza del recupero delle statistiche TCP con la funzione GetPerTcpConnectionEStats , il recupero delle statistiche TCP con questo codice di controllo non richiede il caricamento, l'archiviazione e il filtro della tabella di connessione TCP e non richiede privilegi elevati da usare.

Per altre informazioni, vedere SIO_TCP_INFO. SIO_TCP_INFO è supportato in Windows 10, versione 1703, Windows Server 2016 e versioni successive.

Commenti

Ioctls Winsock sono definiti in un numero di file di intestazione diversi. Questi includono il file di intestazione Winsock2.h, Mswsock.h e Mstcpip.h .

Nel Microsoft Windows Software Development Kit (SDK) rilasciato per Windows Vista e versioni successive, l'organizzazione dei file di intestazione è stata modificata e alcuni Ioctls Winsock sono definiti anche nei file di intestazione Ws2def.h, Ws2ipdef.h e Mswsockdef.h. Il file di intestazione Ws2def.h viene automaticamente incluso dal file di intestazione Winsock2.h . Il file di intestazione Ws2ipdef.h viene incluso automaticamente dal file di intestazione Ws2tcpip.h . Il file di intestazione Mswsockdef.h viene incluso automaticamente nel file di intestazione Mswsockdef.h .

Requisiti

Requisito Valore
Intestazione
Winsock2.h;
Mstcpip.h;
Mswsock.h;
Mswsockdef.h in Windows Vista, Windows Server 2008 e Windows 7 (includono Mswsock.h);
Ws2def.h in Windows Vista, Windows Server 2008 e Windows 7 (includono Winsock2.h);
Ws2ipdef.h in Windows Vista, Windows Server 2008 e Windows 7 (includono Ws2tcpip.h)