IP_PKTINFO通訊端選項

IP_PKTINFO通訊端選項可讓應用程式在 IPv4 通訊端上啟用或停用 LPFN_WSARECVMSG (WSARecvMsg) 函式傳回封包資訊。

若要查詢這個通訊端選項的狀態,請呼叫 getsockopt 函式。 若要設定此選項,請使用下列參數呼叫 setockopt 函式。

通訊端選項值

代表這個通訊端選項的常數是 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]

識別通訊端的描述項。

層級 [in]

定義選項的層級。 針對此作業使用 IPPROTO_IP

optname [in]

要取得或設定值的通訊端選項。 針對此作業使用IP_PKTINFO。

optval [out]

緩衝區的指標,其中包含要設定之選項的值。 此參數應該指向等於或大於 DWORD 值大小的緩衝區。

這個值會被視為布林值,使用 0 表示 FALSE (停用) 和非零值,表示已啟用 TRUE () 。

optlen [in, out]

optval緩衝區的大小指標,以位元組為單位。 此大小必須等於或大於 DWORD 值的大小。

傳回值

如果作業順利完成, 則 getsockoptsetockopt 函式會傳回零。

如果作業失敗,則會傳回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 通訊端選項呼叫的 setockopt 函式可讓應用程式啟用或停用 LPFN_WSARECVMSG (WSARecvMsg) 函式傳回封包資訊。 預設會停用通訊端的IP_PKTINFO選項, (設為 FALSE) 。

當此通訊端選項在類型為 SOCK_DGRAMSOCK_RAW的 IPv4 通訊端上啟用時,LPFN_WSARECVMSG (WSARecvMsg) 函式會傳回lpMsg參數所指向之 WSAMSG結構中的封包資訊。 傳回 WSAMSG 結構中的其中一個控制資料物件會包含用來儲存已接收封包位址資訊的 in_pktinfo 結構。

對於透過 IPv4 LPFN_WSARECVMSG (WSARecvMsg所接收的資料包) 函式,所收到的WSAMSG結構的Control成員會包含包含WSACMSGHDR結構的WSABUF結構。 此WSACMSGHDR結構的cmsg_level成員會包含IPPROTO_IP、此結構的cmsg_type成員會包含IP_PKTINFO而cmsg_data成員會包含用來儲存已接收 IPv4 封包位址資訊的in_pktinfo結構。 in_pktinfo結構中的 IPv4 位址是接收封包的來源 IPv4 位址。

針對雙堆疊資料包通訊端,如果應用程式需要 LPFN_WSARECVMSG (WSARecvMsg) 函式,才能針對透過 IPv4 接收的資料包傳回 WSAMSG 結構中的封包資訊,則IP_PKTINFO通訊端選項必須在通訊端上設定為 true。 如果通訊端上只有 IPV6_PKTINFO 選項設定為 true,則會針對透過 IPv6 接收的資料包提供封包資訊,但可能無法針對透過 IPv4 接收的資料包提供。

如果應用程式嘗試在雙堆疊資料包通訊端上設定IP_PKTINFO通訊端選項,且系統上已停用 IPv4, 則 setockopt 函式將會失敗, 且 WSAGetLastError 會傳回 WSAEINVAL錯誤。 setockopt函式也會傳回這個相同的錯誤,因為發生其他錯誤。 如果應用程式嘗試在雙堆疊通訊端上設定IPPROTO_IP層級通訊端選項,且 WSAEINVAL失敗,則應用程式應該判斷本機電腦上是否停用 IPv4。 其中一個可用來偵測 IPv4 是否已啟用或停用的方法,就是呼叫 通訊端 函式,並將 af 參數設定為 AF_INET,以嘗試並建立 IPv4 通訊端。 如果 通訊端 函式失敗,且 WSAGetLastError 傳回 WSAEAFNOSUPPORT的錯誤,表示 IPv4 未啟用。 在此情況下,嘗試設定IP_PKTINFO通訊端選項時,應用程式可能會忽略 setockopt 函式失敗。 否則嘗試設定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)