option de socket IP_PKTINFO
L’option de socket IP_PKTINFO permet à une application d’activer ou de désactiver le retour d’informations de paquet par la fonction LPFN_WSARECVMSG (WSARecvMsg) sur un socket IPv4.
Pour interroger la status de cette option de socket, appelez la fonction getsockopt. Pour définir cette option, appelez la fonction setsockopt avec les paramètres suivants.
La constante qui représente cette option de socket est 19.
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
);
-
s [in]
-
Descripteur identifiant le socket.
-
level [in]
-
Niveau auquel l’option est définie. Utilisez IPPROTO_IP pour cette opération.
-
optname [in]
-
Option de socket pour laquelle obtenir ou définir la valeur. Utilisez IP_PKTINFO pour cette opération.
-
optval [out]
-
Pointeur vers la mémoire tampon contenant la valeur de l’option à définir. Ce paramètre doit pointer vers la mémoire tampon égale ou supérieure à la taille d’une valeur DWORD .
Cette valeur est traitée comme une valeur booléenne avec 0 utilisé pour indiquer FALSE (désactivé) et une valeur différente de zéro pour indiquer TRUE (activé).
-
optlen [in, out]
-
Pointeur vers la taille, en octets, de la mémoire tampon optval . Cette taille doit être égale ou supérieure à la taille d’une valeur DWORD .
Si l’opération se termine correctement, la fonction getsockopt ou setsockopt retourne zéro.
Si l’opération échoue, une valeur de SOCKET_ERROR est retournée et un code d’erreur spécifique peut être récupéré en appelant WSAGetLastError.
Code d'erreur | Signification |
---|---|
Un appel WSAStartup réussi doit se produire avant d’utiliser cette fonction. |
|
Le sous-système réseau a échoué. |
|
L’un des paramètres optval ou optlen pointe vers la mémoire qui n’est pas dans une partie valide de l’espace d’adressage utilisateur. Cette erreur est également retournée si la valeur pointée vers le paramètre optlen est inférieure à la taille d’une valeur DWORD . |
|
Un appel bloquant Windows Sockets 1.1 est en cours ou le fournisseur de services traite toujours une fonction de rappel. |
|
Argument non valide fourni. Cette erreur est retournée si le paramètre de niveau est inconnu ou non valide. Sur Windows Vista et versions ultérieures, cette erreur est également retournée si le socket était dans un état de transition. |
|
L’option est inconnue ou non prise en charge par la famille de protocoles indiquée. Cette erreur est retournée si le paramètre de type pour le descripteur de socket transmis dans le paramètre sn’a pas été SOCK_DGRAM ou SOCK_RAW. |
|
Le descripteur n’est pas un socket. |
La fonction getsockopt appelée avec l’option de socket IP_PKTINFO permet à une application de déterminer si les informations de paquet doivent être retournées par la fonction LPFN_WSARECVMSG (WSARecvMsg) pour un socket IPv4.
La fonction setsockopt appelée avec l’option de socket IP_PKTINFO permet à une application d’activer ou de désactiver le retour d’informations de paquet par la fonction LPFN_WSARECVMSG (WSARecvMsg). L’option IP_PKTINFO pour un socket est désactivée (définie sur FALSE) par défaut.
Lorsque cette option de socket est activée sur un socket IPv4 de type SOCK_DGRAM ou SOCK_RAW, la fonction LPFN_WSARECVMSG (WSARecvMsg) retourne des informations sur les paquets dans la structure WSAMSG pointée vers le paramètre lpMsg . L’un des objets de données de contrôle dans la structure WSAMSG retournée contient une structure in_pktinfo utilisée pour stocker les informations d’adresse de paquet reçues.
Pour les datagrammes reçus par la fonction LPFN_WSARECVMSG (WSARecvMsg) sur IPv4, le membre Control de la structure WSAMSG reçue contiendra une structure WSABUF qui contient une structure WSACMSGHDR . Le membre cmsg_level de cette structure WSACMSGHDR contiendrait IPPROTO_IP, le membre cmsg_type de cette structure contiendrait IP_PKTINFO et le membre cmsg_data contiendrait une structure in_pktinfo utilisée pour stocker les informations d’adresse de paquet IPv4 reçues. L’adresse IPv4 dans la structure in_pktinfo est l’adresse IPv4 à partir de laquelle le paquet a été reçu.
Pour un socket de datagramme à double pile, si une application nécessite la fonction LPFN_WSARECVMSG (WSARecvMsg) pour retourner les informations de paquet dans une structure WSAMSG pour les datagrammes reçus via IPv4, IP_PKTINFO option de socket doit avoir la valeur true sur le socket. Si seule l’option IPV6_PKTINFO est définie sur true sur le socket, les informations de paquet sont fournies pour les datagrammes reçus via IPv6, mais ne peuvent pas être fournies pour les datagrammes reçus via IPv4.
Si une application tente de définir l’option de socket IP_PKTINFO sur un socket de datagramme à double pile et qu’IPv4 est désactivé sur le système, la fonction setsockopt échoue et WSAGetLastError retourne une erreur WSAEINVAL. Cette même erreur est également retournée par la fonction setsockopt à la suite d’autres erreurs. Si une application tente de définir une option de socket de niveau IPPROTO_IP sur un socket à double pile et qu’elle échoue avec WSAEINVAL, l’application doit déterminer si IPv4 est désactivé sur l’ordinateur local. Une méthode qui peut être utilisée pour détecter si IPv4 est activé ou désactivé consiste à appeler la fonction socket avec le paramètre af défini sur AF_INET pour essayer de créer un socket IPv4. Si la fonction socket échoue et que WSAGetLastError retourne une erreur de WSAEAFNOSUPPORT, cela signifie qu’IPv4 n’est pas activé. Dans ce cas, un échec de la fonction setsockopt lors de la tentative de définition de l’option de socket IP_PKTINFO peut être ignoré par l’application. Sinon, un échec lors de la tentative de définition de l’option de socket IP_PKTINFO doit être traité comme une erreur inattendue.
Notez que le fichier d’en-tête Ws2ipdef.h est automatiquement inclus dans Ws2tcpip.h et ne doit jamais être utilisé directement.
Condition requise | Valeur |
---|---|
Client minimal pris en charge |
Windows XP [applications de bureau uniquement] |
Serveur minimal pris en charge |
Windows Server 2003 [applications de bureau uniquement] |
En-tête |
|