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 ヘッダー ファイルで定義されます。

入力時のフラグ 意味
MSG_PEEK
受信データにプレビューします。 データはバッファーにコピーされますが、入力キューからは削除されません。 このフラグは、重複していないソケットに対してのみ有効です。
 
返されるフラグ 意味
MSG_BCAST
データグラムは、リンク層ブロードキャストとして、またはブロードキャスト アドレスである宛先 IP アドレスで受信されました。
MSG_MCAST
データグラムは、マルチキャスト アドレスである宛先 IP アドレスで受信されました。
MSG_TRUNC
データグラムが切り捨てられました。 割り当てられたプロセスのスペースよりも多くのデータが存在しました。
MSG_CTRUNC
コントロール (補助) データが切り捨てられました。 割り当てられたプロセスの部屋よりも多くの制御データが存在しました。

注釈

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 構造体のヘッダー情報を入力します。 アプリケーションは、必要なソケット オプションを設定するだけで、適切なバッファー サイズを提供します。
 

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 を含む)

こちらもご覧ください

IPV6_PKTINFO

IP_PKTINFO

SOCKET_ADDRESS

Wsabuf

WSARecv

WSARecvFrom

LPFN_WSARECVMSG (WSARecvMsg)

WSASendMsg