次の方法で共有


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 値のサイズ以上のバッファーを指す必要があります。

この値はブール値として扱われ、 FALSE (無効) を示すために 0 が使用され、 TRUE (有効) を示す 0 以外の値が使用されます。

optlen [in, out]

optval バッファーのサイズ (バイト単位) へのポインター。 このサイズは、 DWORD 値のサイズ以上である必要があります。

戻り値

操作が正常に完了すると、 getsockopt または setsockopt 関数は 0 を返します。

操作が失敗した場合は、SOCKET_ERRORの値が返され、 WSAGetLastError を呼び出すことによって特定のエラー コードを取得できます。

エラー コード 意味
WSANOTINITIALISED
この関数を使用する前に、 WSAStartup 呼び出しが正常に行われる必要があります。
WSAENETDOWN
ネットワーク サブシステムが失敗しました。
WSAEFAULT
optval パラメーターまたは optlen パラメーターの 1 つは、ユーザー アドレス空間の有効な部分にないメモリを指します。 optlen パラメーターが指す値が DWORD 値のサイズより小さい場合も、このエラーが返されます。
WSAEINPROGRESS
ブロックしている Windows Sockets 1.1 呼び出しが進行中であるか、サービス プロバイダーがコールバック関数を処理しています。
WSAEINVAL
無効な引数が指定されました。 このエラーは、 level パラメーターが不明または無効な場合に返されます。 Windows Vista 以降では、ソケットが遷移状態の場合も、このエラーが返されます。
WSAENOPROTOOPT
オプションが不明であるか、指定されたプロトコル ファミリでサポートされていません。 このエラーは、s パラメーターで渡されたソケット記述子のパラメーターがSOCK_DGRAMまたはSOCK_RAWされていない場合に返されます。
WSAENOTSOCK
記述子はソケットではありません。

 

解説

IP_PKTINFO ソケット オプションで呼び出される getsockopt 関数を使用すると、アプリケーションは IPv4 ソケットの LPFN_WSARECVMSG (WSARecvMsg) 関数によってパケット情報が返されるかどうかを判断できます。

IP_PKTINFO ソケット オプションで呼び出される setsockopt 関数を使用すると、アプリケーションは 、LPFN_WSARECVMSG (WSARecvMsg) 関数によるパケット情報の返しを有効または無効にすることができます。 ソケットのIP_PKTINFO オプションは、既定では無効になっています ( FALSE に設定)。

SOCK_DGRAMタイプまたはSOCK_RAWの IPv4 ソケットでこのソケット・オプションを使用可能にすると、LPFN_WSARECVMSG (WSARecvMsg) 関数は lpMsg パラメーターが指す WSAMSG 構造体のパケット情報を返します。 返される WSAMSG 構造体の制御データ・オブジェクトの 1 つに、受信パケット・アドレス情報の保管に使用される 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 アドレスです。

デュアル スタック データグラム ソケットの場合、アプリケーションで IPv4 経由で受信したデータグラムの WSAMSG 構造体でパケット情報を返すLPFN_WSARECVMSG (WSARecvMsg) 関数が必要な場合は、ソケットでソケット オプションIP_PKTINFO true に設定する必要があります。 ソケットで IPV6_PKTINFO オプションのみが true に設定されている場合、IPv6 経由で受信したデータグラムに対してパケット情報が提供されますが、IPv4 経由で受信したデータグラムには提供されない場合があります。

アプリケーションがデュアルスタック・データグラム・ソケットでIP_PKTINFOソケット・オプションを設定しようとしたときに、システムで IPv4 が使用不可になっている場合、 setsockopt 関数は失敗し、 WSAGetLastErrorWSAEINVAL のエラーで戻ります。 この同じエラーは、他のエラーの結果として setsockopt 関数によっても返されます。 アプリケーションがデュアル スタック ソケットでIPPROTO_IP レベルのソケット オプションを設定しようとして WSAEINVAL で失敗した場合、アプリケーションはローカル コンピューターで IPv4 が無効になっているかどうかを判断する必要があります。 IPv4 が有効または無効になっているかどうかを検出するために使用できるメソッドの 1 つは、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

ソケット

WSAMSG

LPFN_WSARECVMSG (WSARecvMsg)