WSAMSG 構造体 (ws2def.h)
WSAMSG 構造体は、LPFN_WSARECVMSG (WSARecvMsg) 関数と WSASendMsg 関数と共に使用され、接続されたソケットと接続されていないソケットに関するアドレスおよびオプションの制御情報、およびメッセージ データの格納に使用されるバッファーの配列を格納します。
構文
typedef struct _WSAMSG {
LPSOCKADDR name;
INT namelen;
LPWSABUF lpBuffers;
#if ...
ULONG dwBufferCount;
#else
DWORD dwBufferCount;
#endif
WSABUF Control;
#if ...
ULONG dwFlags;
#else
DWORD dwFlags;
#endif
} WSAMSG, *PWSAMSG, *LPWSAMSG;
メンバー
name
種類: LPSOCKADDR
リモート アドレスに関する情報を格納する SOCKET_ADDRESS 構造体へのポインター。 接続されていないソケットでのみ使用されます。
namelen
型: INT
pAddr メンバーで指SOCKET_ADDRESS構造体の長さ (バイト単位)。 接続されていないソケットでのみ使用されます。
lpBuffers
型: LPWSABUF
メッセージ データの受信に使用される WSABUF 構造体の配列。 lpBuffers メンバーに複数のバッファーを含める機能を使用すると、スキャッター/ギャザー I/O を使用できます。
dwBufferCount
型: DWORD
lpBuffers メンバーで指し示されているバッファーの数。
Control
種類: WSABUF
オプションの制御データを指定するために使用される WSABUF 型の構造体。 「解説」を参照してください。
dwFlags
型: DWORD
値の論理 OR として指定された 1 つ以上の制御フラグ。 入力時に dwFlags メンバーに指定できる値は、Winsock2.h ヘッダー ファイルで定義されています。 出力時 に dwFlags メンバーに指定できる値は、Winsock2.h ヘッダー ファイルによって自動的に含まれる Ws2def.h ヘッダー ファイルで定義されます。
入力時のフラグ | 意味 |
---|---|
|
受信データにプレビューします。 データはバッファーにコピーされますが、入力キューからは削除されません。 このフラグは、重複していないソケットに対してのみ有効です。 |
注釈
Microsoft Windows ソフトウェア開発キット (Windows SDK) (SDK) では、Windows Vista で使用するこの構造体のバージョンは、dwBufferCount メンバーと dwFlags メンバーのデータ型を ULONG として定義します。 ターゲット プラットフォームが Windows Vista 以降の場合にアプリケーションをコンパイルする場合 (NTDDI_VERSION >= NTDDI_LONGHORN、_WIN32_WINNT >= 0x0600、または WINVER >= 0x0600)、 dwBufferCount メンバーと dwFlags メンバーのデータ型は ULONG です。
Windows Server 2003 および Windows XP: アプリケーションをコンパイルする場合、 dwBufferCount メンバーと dwFlags メンバーの データ型は DWORD です。
Windows Vista 以降用にリリースされたWindows SDKでは、WSAMSG 構造体は Ws2def.h ヘッダー ファイルで定義されています。 Ws2def.h ヘッダー ファイルは Winsock2.h に自動的に含まれるので、直接使用しないでください
転送中にデータグラムまたは制御データが切り捨てられた場合、 WSAMSG 構造体と関連付けて使用されている関数はSOCKET_ERRORを返し、 WSAGetLastError 関数の呼び出しは WSAEMSGSIZE を返します。 MSG_TRUNCフラグやMSG_CTRUNC フラグを確認して、切り捨てられた内容を判断するのはアプリケーションの責任です。
コントロール メンバーの使用
次の表は、IPv4 および IPv6 の Control メンバーで使用できる コントロール データのさまざまな使用方法をまとめたものです。
Protocol | cmsg_level | cmsg_type | 説明 |
---|---|---|---|
IPv4 | IPPROTO_IP | IP_ORIGINAL_ARRIVAL_IF | データグラム ソケットのパケットが受信された元の IPv4 到着インターフェイスを受信します。 この制御データは、IPv4 NAT トラバーサルにTeredo、6to4、または ISATAP トンネルが使用される場合にファイアウォールによって使用されます。 WSAMSG 構造体の cmsg_data[] メンバーは、Ifdef.h ヘッダー ファイルで定義されているIF_INDEXを含む ULONG です。 詳細については、「 IP_ORIGINAL_ARRIVAL_IF ソケット オプションのIPPROTO_IP ソケット オプション」を 参照してください。 Windows Server 2008、Windows Vista、Windows Server 2003、Windows XP: IP_ORIGINAL_ARRIVAL_IF cmsg_type はサポートされていません。 |
IPv4 | IPPROTO_IP | IP_PKTINFO | IPv4 ソケットのパケット情報を指定/受信します。 詳細については、「 IP_PKTINFO ソケット オプション」を参照してください。 |
IPv4 | IPPROTO_IP | IP_ECN | サービスの種類 (TOS) IPv4 ヘッダー フィールドで ECN コードポイントを指定または受信します。 詳細については、「 WSASetRecvIPEcn」を参照してください。 |
IPv6 | IPPROTO_IPV6 | IPV6_DSTOPTS | 宛先オプションを指定/受信します。 |
IPv6 | IPPROTO_IPV6 | IPV6_HOPLIMIT | ホップ制限を指定/受信します。 詳細については、「 IPV6_HOPLIMIT ソケット オプションのIPPROTO_IPV6 ソケット オプション」を 参照してください。 |
IPv6 | IPPROTO_IPV6 | IPV6_HOPOPTS | ホップバイホップ オプションを指定/受信します。 |
IPv6 | IPPROTO_IPV6 | IPV6_NEXTHOP | 次ホップ アドレスを指定します。 |
IPv6 | IPPROTO_IPV6 | IPV6_PKTINFO | IPv6 ソケットのパケット情報を指定/受信します。 詳細については、IPV6_PKTINFO ソケット オプションに関するページ を 参照してください。 |
IPv6 | IPPROTO_IPV6 | IPV6_RTHDR | ルーティング ヘッダーを指定/受信します。 |
IPv6 | IPPROTO_IPV6 | IPV6_ECN | [トラフィック クラス IPv6] ヘッダー フィールドで ECN コードポイントを指定または受信します。 詳細については、「 WSASetRecvIPEcn」を参照してください。 |
制御データは、1 つ以上の制御データ・オブジェクトで構成され、それぞれ WSACMSGHDR 構造体で始まり、以下のように定義されます。
struct wsacmsghdr {
UINT cmsg_len;
INT cmsg_level;
INT cmsg_type;
/* followed by UCHAR cmsg_data[] */
} WSACMSGHDR;
WSACMSGHDR 構造体のメンバーは次のとおりです。
期間 | 説明 |
---|---|
cmsg_len | WSACMSGHDR の先頭からデータの末尾までのデータのバイト数 (データの後に続く可能性のあるパディング バイトを除く)。 |
cmsg_level | 制御情報を生成したプロトコル。 |
cmsg_type | プロトコル固有のコントロール情報の種類。 |
データ オブジェクト内を移動するには、次のマクロを使用します。
#define LPCMSGHDR *WSA_CMSG_FIRSTHDR(LPWSAMSG msg);
最初のコントロール データ オブジェクトへのポインターを返します。 コントロール メンバーが NULL ポインターの場合など、WSAMSG 構造体にコントロール データがない場合は NULL ポインターを返します。
#define LPCMSGHDR *WSA_CMSG_NXTHDR(LPWSAMSG msg, LPWSACMSGHDR cmsg);
次のコントロール データ オブジェクトへのポインターを返します。これ以上データ オブジェクトがない場合は NULL を 返します。 pcmsg パラメーターが NULL の場合は、最初のコントロール データ オブジェクトへのポインターが返されます。
#define UCHAR *WSA_CMSG_DATA(LPWSACMSGHDR pcmsg);
データの最初のバイトへのポインターを返します (構造体では定義されていませんが、 cmsg_data メンバーと呼ばれます)。
#define UINT WSA_CMSG_SPACE(UINT length);
データの量を指定して、コントロール データ オブジェクトの合計サイズを返します。 バッファー領域の正しい量を割り当てるために使用されます。 配置のパディングが含まれます。
#define UINT WSA_CMSG_LEN(UINT length);
データの量を 指定cmsg_len の値を返します。 配置のパディングが含まれます。
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント | Windows XP (デスクトップ アプリのみ) |
サポートされている最小のサーバー | Windows Server 2003 (デスクトップ アプリのみ) |
Header | ws2def.h (Winsock2.h を含む) |