WSASendMsg 関数 (winsock2.h)
WSASendMsg 関数は、接続されたソケットと接続されていないソケットからデータとオプションの制御情報を送信します。
構文
int WSAAPI WSASendMsg(
[in] SOCKET Handle,
[in] LPWSAMSG lpMsg,
[in] DWORD dwFlags,
[out] LPDWORD lpNumberOfBytesSent,
[in] LPWSAOVERLAPPED lpOverlapped,
[in] LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
);
パラメーター
[in] Handle
ソケットを識別する記述子。
[in] lpMsg
posix.1g msghdr 構造体を格納する WSAMSG 構造体。
[in] dwFlags
WSASendMsg 関数呼び出しの動作を変更するために使用されるフラグ。 詳細については、「解説」セクションの「dwFlags の使用」を参照してください。
[out] lpNumberOfBytesSent
I/O 操作がすぐに完了した場合に、この呼び出しによって送信された数 (バイト単位) へのポインター。
[in] lpOverlapped
WSAOVERLAPPED 構造体へのポインター。 重複していないソケットの場合は無視されます。
[in] lpCompletionRoutine
型: _In_opt_ LPWSAOVERLAPPED_COMPLETION_ROUTINE
送信操作が完了したときに呼び出される完了ルーチンへのポインター。 重複していないソケットの場合は無視されます。
戻り値
正常に完了し、すぐに完了した場合は 0 を返します。 0 が返されると、呼び出し元のスレッドが警告可能な状態のときに、指定された完了ルーチンが呼び出されます。
エラーが発生すると、SOCKET_ERROR を返し、その後の WSAGetLastError 呼び出しWSA_IO_PENDING以外の値を返します。 次の表に、エラー コードを示します。
エラー コード | 意味 |
---|---|
|
要求されたアドレスはブロードキャスト アドレスですが、適切なフラグが設定されていませんでした。 |
|
UDP データグラム ソケットの場合、このエラーは、以前の送信操作で ICMP "ポートに到達できない" メッセージが発生したことを示します。 |
|
lpMsg、lpNumberOfBytesSent、 |
|
ブロックしている Windows ソケット 1.1 呼び出しが進行中であるか、サービス プロバイダーがコールバック関数を処理しています。 |
|
WSACancelBlockingCall |
|
ソケットがバインド |
|
ソケットはメッセージ指向であり、メッセージは基になるトランスポートでサポートされている最大値を超えています。 |
|
ネットワーク サブシステムが失敗しました。 |
|
データグラム ソケットの場合、このエラーは有効期限が切れたことを示します。 |
|
ネットワークに到達できません。 |
|
Windows ソケット プロバイダーは、バッファーのデッドロックを報告します。 |
|
ソケットが接続されていません。 |
|
記述子はソケットではありません。 |
|
ソケット操作はサポートされていません。 このエラーは、lpMsg パラメーターが指す WSAMSG 構造体の dwFlags メンバーに、WSASendMsgに無効な制御フラグが含まれている場合に返されます。 |
|
ソケットがシャットダウンされました。SD_SENDまたはSD_BOTHに設定 |
|
ソケットがタイムアウトしました。このエラーは、ソケットに SO_SNDTIMEO ソケット オプションを使用して指定された待機タイムアウトがあり、タイムアウトを超えた場合に返されます。 |
|
重複するソケット: 未処理の重複 I/O 要求が多すぎます。 オーバーラップされていないソケット: ソケットは非ブロッキングとしてマークされ、送信操作をすぐに完了することはできません。 |
|
WSAStartup 呼び出し |
重複する操作が正常に開始され、完了は後で示されます。 | |
ソケットのクローズまたは WSAIoctlでの |
備考
dwFlags パラメーターには、MSG_DONTROUTE、MSG_PARTIAL、および MSG_OOBのコントロール フラグの組み合わせのみを含めることができます。 dwFlags、lpMsg パラメーターが指す WSAMSG 構造体のメンバーは、入力では無視され、出力では使用されません。
重複するソケットは、WSA_FLAG_OVERLAPPED フラグが設定された WSASocket 関数呼び出しを使用して作成されます。 重複するソケットの場合、lpOverlapped と
オーバーラップされていないソケットの場合、
この関数が重複して完了した場合、この呼び出しから戻る前に WSABUF 構造体
メッセージ指向ソケットの場合は、基になるプロバイダーの最大メッセージ サイズを超えないように注意する必要があります。これは、ソケット オプション SO_MAX_MSG_SIZEの値を取得することによって取得できます。 データが長すぎて基になるプロトコルをアトミックに通過できない場合は、WSAEMSGSIZE
SOCK_DGRAM または SOCK_RAWタイプの IPv6 ソケットでは、アプリケーションは、WSASendMsg 関数を使用して送信するために使用するローカル IP ソース アドレスを特定できます。 WSAMSG 構造体で WSASendMsg 関数に渡される制御データ・オブジェクトの 1 つに、送信に使用するローカル IPv6 ソース・アドレスを指定するために使用する in6_pktinfo 構造が含まれている場合があります。
WSASendMsg 関数を使用してデータグラムを送信するときに、アプリケーションが使用する特定のローカル IP ソース アドレスを指定する場合、デュアルスタック ソケットの場合、これを処理する方法は宛先 IP アドレスによって異なります。 IPv4 宛先アドレスまたは IPv4 マップト IPv6 宛先アドレスに送信する場合、lpMsg パラメーターが指す WSAMSG 構造体で渡される制御データ・オブジェクトの 1 つに、送信に使用するローカル IPv4 ソース・アドレスを含む in_pktinfo 構造が含まれている必要があります。 IPv4 マップト IPv6 アドレスではない IPv6 宛先アドレスに送信する場合、lpMsg パラメーターが指す WSAMSG 構造体で渡される制御データ・オブジェクトの 1 つに、送信に使用するローカル IPv6 ソース・アドレスを含む in6_pktinfo 構造が含まれている必要があります。
dwFlags の
dwFlags 入力パラメーターを使用して、関連付けられているソケットに指定されたオプションを超えて関数呼び出しの動作に影響を与えることができます。 つまり、この関数のセマンティクスは、ソケット オプションと dwFlags パラメーターによって決まります。 後者は、次のいずれかの値を持つビットごとの OR 演算子を使用して構築されます。価値 | 意味 |
---|---|
MSG_DONTROUTE | データをルーティングの対象にしないことを指定します。 Windows ソケット サービス プロバイダーは、このフラグを無視することを選択できます。 |
MSG_PARTIAL | lpMsg- |
出力時には、lpMsg パラメーターが指す WSAMSG 構造体の dwFlags メンバーは使用されません。
重複するソケット I/O を する
重複した操作がすぐに完了すると、WSASendMsg重複した I/O を使用する WSASendMsg 関数
lpOverlapped パラメーターは、重複する操作の間有効である必要があります。 複数の I/O 操作が同時に未処理の場合、それぞれが WSAOVERLAPPED 構造体
lpCompletionRoutine
完了ルーチンは、Windows ファイル I/O 完了ルーチンに規定されているのと同じ規則に従います。 完了ルーチンは、スレッドが警告可能な待機状態になるまで呼び出されません。たとえば、
トランスポート プロバイダーを使用すると、アプリケーションはソケット I/O 完了ルーチンのコンテキスト内から送受信操作を呼び出し、特定のソケットに対して I/O 完了ルーチンが入れ子にならないことを保証できます。 これにより、時間の影響を受けやすいデータ転送を、プリエンプティブ コンテキスト内で完全に実行できます。
完了ルーチンのプロトタイプは次のとおりです。
void CALLBACK CompletionRoutine(
IN DWORD dwError,
IN DWORD cbTransferred,
IN LPWSAOVERLAPPED lpOverlapped,
IN DWORD dwFlags
);
CompletionRoutine 関数は、アプリケーション定義またはライブラリ定義の関数名のプレースホルダーです。 dwError パラメーターは、lpOverlapped パラメーターで示されているように、重複する操作の完了状態を指定します。 cbTransferred パラメーターは、送信されたバイト数を示します。 現在、フラグ値は定義されておらず、dwFlags パラメーターは 0 になります。 CompletionRoutine 関数は値を返しません。
この関数から戻って、ソケットに対して別の保留中の完了ルーチンを呼び出すことができます。 警告可能なスレッドの待機がWSA_IO_COMPLETIONのリターン コードで満たされる前に、すべての待機完了ルーチンが呼び出されます。 完了ルーチンは任意の順序で呼び出すことができます。重複する操作が完了した順序で呼び出されるとは限りません。 ただし、ポストされたバッファーは、指定された順序で送信することが保証されます。
必要条件
要件 | 価値 |
---|---|
サポートされる最小クライアント | Windows 8.1、Windows Vista [デスクトップ アプリ |UWP アプリ] |
サポートされる最小サーバー | Windows Server 2008 [デスクトップ アプリ |UWP アプリ] |
ターゲット プラットフォーム の |
ウィンドウズ |
ヘッダー | winsock2.h (Mswsock.h を含む) |
ライブラリ | Ws2_32.lib |
DLL | Ws2_32.dll |
関連項目
ExitThread の
WSABUF の
WSACancelBlockingCall の
WSAGetLastError の
WSAGetOverlappedResult の
WSAIoctl を
WSAMSG を
WSAOVERLAPPED の
WSASend を
WSASendTo を
WSASocket の
WSAStartup の
WSAWaitForMultipleEvents の
を送信
シャットダウン の