opzione socket IP_PKTINFO
L'opzione socket IP_PKTINFO consente a un'applicazione di abilitare o disabilitare la restituzione delle informazioni sui pacchetti dalla funzione LPFN_WSARECVMSG (WSARecvMsg) in un socket IPv4.
Per eseguire una query sullo stato di questa opzione socket, chiamare la funzione getsockopt . Per impostare questa opzione, chiamare la funzione setsockopt con i parametri seguenti.
Valore dell'opzione socket
La costante che rappresenta questa opzione socket è 19.
Sintassi
int getsockopt(
(SOCKET) s, // descriptor identifying a socket
(int) IPPROTO_IP, // level
(int) IP_PKTINFO, // optname
(char *) optval, // output buffer,
(int) optlen, // size of output buffer
);
int setsockopt(
(SOCKET) s, // descriptor identifying a socket
(int) IPPROTO_IP, // level
(int) IP_PKTINFO, // optname
(char *) optval, // input buffer,
(int) optlen, // size of input buffer
);
Parametri
-
s [in]
-
Descrittore che identifica il socket.
-
level [in]
-
Livello in cui è definita l'opzione. Usare IPPROTO_IP per questa operazione.
-
optname [in]
-
Opzione socket per cui ottenere o impostare il valore. Usare IP_PKTINFO per questa operazione.
-
optval [out]
-
Puntatore al buffer contenente il valore per l'opzione da impostare. Questo parametro deve puntare al buffer uguale o maggiore della dimensione di un valore DWORD .
Questo valore viene considerato come un valore booleano con 0 usato per indicare FALSE (disabilitato) e un valore diverso da zero per indicare TRUE (abilitato).
-
optlen [in, out]
-
Puntatore alle dimensioni, in byte, del buffer optval . Questa dimensione deve essere uguale o maggiore della dimensione di un valore DWORD .
Valore restituito
Se l'operazione viene completata correttamente, la funzione getsockopt o setsockopt restituisce zero.
Se l'operazione non riesce, viene restituito un valore di SOCKET_ERROR e è possibile recuperare un codice di errore specifico chiamando WSAGetLastError.
Codice di errore | Significato |
---|---|
Prima di usare questa funzione, è necessario che venga eseguita una chiamata WSAStartup riuscita. |
|
Il sottosistema di rete non è riuscito. |
|
Uno dei parametri optval o optlen punta alla memoria che non si trova in una parte valida dello spazio indirizzi utente. Questo errore viene restituito anche se il valore a cui punta il parametro optlen è minore della dimensione di un valore DWORD . |
|
È in corso una chiamata di Windows Sockets 1.1 bloccante oppure il provider di servizi sta ancora elaborando una funzione di callback. |
|
Argomento fornito non valido. Questo errore viene restituito se il parametro di livello è sconosciuto o non valido. In Windows Vista e versioni successive, questo errore viene restituito anche se il socket si trovava in uno stato transitorio. |
|
L'opzione è sconosciuta o non supportata dalla famiglia di protocolli indicata. Questo errore viene restituito se il parametro di tipo per il descrittore socket passato nel parametro s non è stato SOCK_DGRAM o SOCK_RAW. |
|
Il descrittore non è un socket. |
Commenti
La funzione getsockopt chiamata con l'opzione socket IP_PKTINFO consente a un'applicazione di determinare se le informazioni sui pacchetti devono essere restituite dalla funzione LPFN_WSARECVMSG (WSARecvMsg)per un socket IPv4.
La funzione setsockopt chiamata con l'opzione socket IP_PKTINFO consente a un'applicazione di abilitare o disabilitare la restituzione di informazioni sui pacchetti dalla funzione LPFN_WSARECVMSG (WSARecvMsg). L'opzione IP_PKTINFO per un socket è disabilitata (impostata su FALSE) per impostazione predefinita.
Quando questa opzione socket è abilitata in un socket IPv4 di tipo SOCK_DGRAM o SOCK_RAW, la funzione LPFN_WSARECVMSG (WSARecvMsg) restituisce informazioni sui pacchetti nella struttura WSAMSG a cui punta il parametro lpMsg . Uno degli oggetti dati del controllo nella struttura WSAMSG restituita conterrà una struttura in_pktinfo utilizzata per archiviare le informazioni sull'indirizzo del pacchetto ricevuto.
Per i datagrammi ricevuti dalla funzione LPFN_WSARECVMSG (WSARecvMsg) su IPv4, il membro Control della struttura WSAMSG ricevuta conterrà una struttura WSABUF che contiene una struttura WSACMSGHDR . Il membro cmsg_level di questa struttura WSACMSGHDR conterrà IPPROTO_IP, il membro cmsg_type di questa struttura conterrà IP_PKTINFO e il membro cmsg_data conterrà una struttura in_pktinfo utilizzata per archiviare le informazioni sull'indirizzo del pacchetto IPv4 ricevuto. L'indirizzo IPv4 nella struttura in_pktinfo è l'indirizzo IPv4 da cui è stato ricevuto il pacchetto.
Per un socket di datagrammi dual stack, se un'applicazione richiede la funzione LPFN_WSARECVMSG (WSARecvMsg) per restituire informazioni sui pacchetti in una struttura WSAMSG per i datagrammi ricevuti su IPv4, IP_PKTINFO opzione socket deve essere impostata su true nel socket. Se solo l'opzione IPV6_PKTINFO è impostata su true nel socket, le informazioni sui pacchetti verranno fornite per i datagrammi ricevuti su IPv6, ma potrebbero non essere fornite per i datagrammi ricevuti su IPv4.
Se un'applicazione tenta di impostare l'opzione socket IP_PKTINFO su un socket datagram a doppio stack e IPv4 è disabilitata nel sistema, la funzione setsockopt avrà esito negativo e WSAGetLastError restituirà un errore WSAEINVAL. Lo stesso errore viene restituito anche dalla funzione setsockopt in seguito ad altri errori. Se un'applicazione tenta di impostare un'opzione socket a livello di IPPROTO_IP su un socket a doppio stack e ha esito negativo con WSAEINVAL, l'applicazione deve determinare se IPv4 è disabilitato nel computer locale. Un metodo che può essere usato per rilevare se IPv4 è abilitato o disabilitato consiste nel chiamare la funzione socket con il parametro af impostato su AF_INET per provare a creare un socket IPv4. Se la funzione socket ha esito negativo e WSAGetLastError restituisce un errore WSAEAFNOSUPPORT, significa che IPv4 non è abilitato. In questo caso, un errore della funzione setsockopt quando si tenta di impostare l'opzione socket IP_PKTINFO può essere ignorata dall'applicazione. In caso contrario, un errore durante il tentativo di impostare l'opzione socket IP_PKTINFO deve essere considerata come un errore imprevisto.
Si noti che il file di intestazione Ws2ipdef.h viene automaticamente incluso in Ws2tcpip.h e non deve mai essere usato direttamente.
Requisiti
Requisito | Valore |
---|---|
Client minimo supportato |
Windows XP [solo app desktop] |
Server minimo supportato |
Windows Server 2003 [solo app desktop] |
Intestazione |
|
Vedi anche