IP_PKTINFO套接字选项

IP_PKTINFO套接字选项允许应用程序启用或禁用 IPv4 套接字上的 LPFN_WSARECVMSG (WSARecvMsg) 函数返回数据包信息。

若要查询此套接字选项的状态,请调用 getsockopt 函数。 若要设置此选项,请使用以下参数调用 setsockopt 函数。

套接字选项值

表示此套接字选项的常量为 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]

标识套接字的描述符。

level [in]

定义选项的级别。 对此操作使用 IPPROTO_IP

optname [in]

要为其获取或设置值的套接字选项。 对此操作使用 IP_PKTINFO。

optval [out]

指向缓冲区的指针,该缓冲区包含要设置的选项的值。 此参数应指向等于或大于 DWORD 值大小的缓冲区。

此值被视为一个布尔值,0 用于指示 FALSE (禁用) ,非零值指示 TRUE (启用) 。

optlen [in, out]

指向 optval 缓冲区的大小(以字节为单位)的指针。 此大小必须等于或大于 DWORD 值的大小。

返回值

如果操作成功完成, 则 getsockoptsetsockopt 函数返回零。

如果操作失败,则返回值 SOCKET_ERROR,并且可以通过调用 WSAGetLastError 来检索特定的错误代码。

错误代码 含义
WSANOTINITIALISED
在使用此函数之前,必须成功调用 WSAStartup
WSAENETDOWN
网络子系统失败。
WSAEFAULT
optvaloptlen 参数之一指向不在用户地址空间有效部分中的内存。 如果 optlen 参数指向的值小于 DWORD 值的大小,也会返回此错误。
WSAEINPROGRESS
阻止 Windows Sockets 1.1 调用正在进行,或者服务提供程序仍在处理回调函数。
WSAEINVAL
提供了无效的参数。 如果 级别 参数未知或无效,则返回此错误。 在 Windows Vista 及更高版本中,如果套接字处于过渡状态,也会返回此错误。
WSAENOPROTOOPT
选项未知或不受指定的协议系列支持。 如果 s 参数中传递的套接字描述符的类型参数未SOCK_DGRAMSOCK_RAW,则返回此错误。
WSAENOTSOCK
:描述符不是套接字。

 

备注

使用 IP_PKTINFO 套接字选项调用的 getsockopt 函数允许应用程序确定是否由 IPv4 套接字的 LPFN_WSARECVMSG (WSARecvMsg) 函数返回数据包信息。

使用 IP_PKTINFO 套接字选项调用的 setsockopt 函数允许应用程序启用或禁用 LPFN_WSARECVMSG (WSARecvMsg) 函数返回数据包信息。 默认情况下,将禁用套接字的IP_PKTINFO选项 (设置为 FALSE) 。

SOCK_DGRAMSOCK_RAW 类型的 IPv4 套接字上启用此套接字选项时,LPFN_WSARECVMSG (WSARecvMsg) 函数将返回 lpMsg 参数指向的 WSAMSG 结构中的数据包信息。 返回的 WSAMSG 结构中的控制数据对象之一将包含用于存储接收的数据包地址信息的 in_pktinfo 结构。

对于LPFN_WSARECVMSG (WSARecvMsg) 函数通过 IPv4 接收的数据报,收到的 WSAMSG 结构的 Control 成员将包含包含 WSACMSGHDR 结构的 WSABUF 结构。WSACMSGHDR 结构的cmsg_level成员将包含IPPROTO_IP,此结构的cmsg_type成员将包含IP_PKTINFOcmsg_data成员将包含用于存储收到的 IPv4 数据包地址信息的in_pktinfo结构。 in_pktinfo结构中的 IPv4 地址是从中接收数据包的 IPv4 地址。

对于双堆栈数据报套接字,如果应用程序要求 LPFN_WSARECVMSG (WSARecvMsg) 函数在 WSAMSG 结构中返回通过 IPv4 接收的数据报的数据包信息,则必须在套接字上将IP_PKTINFO套接字选项设置为 true。 如果在套接字上仅将 IPV6_PKTINFO 选项设置为 true,则将为通过 IPv6 接收的数据报提供数据包信息,但可能不会为通过 IPv4 接收的数据报提供数据包信息。

如果应用程序尝试在双堆栈数据报套接字上设置 IP_PKTINFO 套接字选项,并且已在系统上禁用 IPv4,则 setsockopt 函数将失败, WSAGetLastError 将返回 WSAEINVAL 错误。 由于其他错误, setsockopt 函数也会返回相同的错误。 如果应用程序尝试在双堆栈套接字上设置IPPROTO_IP级套接字选项,但失败并出现 WSAEINVAL,则应用程序应确定是否在本地计算机上禁用了 IPv4。 可用于检测 IPv4 是启用或禁用的一种方法是调用 套接字 函数,并将 af 参数设置为 AF_INET,以尝试创建 IPv4 套接字。 如果 套接字 函数失败,并且 WSAGetLastError 返回 WSAEAFNOSUPPORT 错误,则表示未启用 IPv4。 在这种情况下,应用程序可以忽略尝试设置IP_PKTINFO套接字选项时 setsockopt 函数失败。 否则,尝试设置IP_PKTINFO套接字选项时失败应被视为意外错误。

请注意, Ws2ipdef.h 头文件自动包含在 Ws2tcpip.h 中,不应直接使用。

要求

要求
最低受支持的客户端
Windows XP [仅限桌面应用]
最低受支持的服务器
Windows Server 2003 [仅限桌面应用]
标头
Ws2ipdef.h (包括 Ws2tcpip.h)

另请参阅

双堆栈套接字

getsockopt

in_pktinfo

IPPROTO_IP套接字选项

IPV6_PKTINFO

setsockopt

socket

WSAMSG

LPFN_WSARECVMSG (WSARecvMsg)