次の方法で共有


WSASendMsg 関数 (winsock2.h)

WSASendMsg 関数は、接続されたソケットと接続されていないソケットからデータとオプションの制御情報を送信します。

この関数は、Windows ソケット仕様に対する Microsoft 固有の拡張機能です。

 

構文

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 操作がすぐに完了した場合に、この呼び出しによって送信された数 (バイト単位) へのポインター。

lpOverlapped パラメーターが NULL されていない場合は、このパラメーター NULL を使用して、誤った結果を回避します。 このパラメーターは、lpOverlapped パラメーターが NULLでない場合にのみ、NULL できます。

[in] lpOverlapped

WSAOVERLAPPED 構造体へのポインター。 重複していないソケットの場合は無視されます。

[in] lpCompletionRoutine

型: _In_opt_ LPWSAOVERLAPPED_COMPLETION_ROUTINE

送信操作が完了したときに呼び出される完了ルーチンへのポインター。 重複していないソケットの場合は無視されます。

戻り値

正常に完了し、すぐに完了した場合は 0 を返します。 0 が返されると、呼び出し元のスレッドが警告可能な状態のときに、指定された完了ルーチンが呼び出されます。

SOCKET_ERRORの戻り値、およびWSA_IO_PENDINGを返す WSAGetLastError 後続の呼び出しは、重複する操作が正常に開始されたことを示します。完了は、イベントや完了ポートなど、他の方法で示されます。

エラーが発生すると、SOCKET_ERROR を返し、その後の WSAGetLastError 呼び出しWSA_IO_PENDING以外の値を返します。 次の表に、エラー コードを示します。

エラー コード 意味
WSAEACCES の
要求されたアドレスはブロードキャスト アドレスですが、適切なフラグが設定されていませんでした。
WSAECONNRESET の
UDP データグラム ソケットの場合、このエラーは、以前の送信操作で ICMP "ポートに到達できない" メッセージが発生したことを示します。
WSAEFAULT の
lpMsg、lpNumberOfBytesSent、lpOverlapped、または lpCompletionRoutine パラメーター は、ユーザー アドレス空間の有効な部分に完全には含まれていません。 このエラーは、lpMsg パラメーターが指す WSAMSG 構造体の メンバーが NULL ポインターであり、WSAMSG 構造体の namelen メンバーがゼロに設定されていない場合にも返されます。 このエラーは、lpMsg パラメーターが指す WSAMSG 構造体の Control.buf メンバーが NULL ポインターであり、WSAMSG 構造体の Control.len メンバーがゼロに設定されていない場合にも返されます。
WSAEINPROGRESS を する
ブロックしている Windows ソケット 1.1 呼び出しが進行中であるか、サービス プロバイダーがコールバック関数を処理しています。
WSAEINTR の
WSACancelBlockingCallによって、ブロックされている Windows ソケット 1.1 呼び出しが取り消されました。
WSAEINVAL の
ソケットがバインドバインドされていないか、重複するフラグでソケットが作成されていません。
WSAEMSGSIZE の
ソケットはメッセージ指向であり、メッセージは基になるトランスポートでサポートされている最大値を超えています。
WSAENETDOWN の
ネットワーク サブシステムが失敗しました。
WSAENETRESET の
データグラム ソケットの場合、このエラーは有効期限が切れたことを示します。
WSAENETUNREACH を する
ネットワークに到達できません。
WSAENOBUFS の
Windows ソケット プロバイダーは、バッファーのデッドロックを報告します。
WSAENOTCONN の
ソケットが接続されていません。
WSAENOTSOCK の
記述子はソケットではありません。
WSAEOPNOTSUPP の
ソケット操作はサポートされていません。 このエラーは、lpMsg パラメーターが指す WSAMSG 構造体の dwFlags メンバーに、WSASendMsgに無効な制御フラグが含まれている場合に返されます。
WSAESHUTDOWN の
ソケットがシャットダウンされました。SD_SENDまたはSD_BOTHに設定 シャットダウン が呼び出された後、ソケットで WSASendMsg 関数を呼び出すことはできません。
WSAETIMEDOUT の
ソケットがタイムアウトしました。このエラーは、ソケットに SO_SNDTIMEO ソケット オプションを使用して指定された待機タイムアウトがあり、タイムアウトを超えた場合に返されます。
WSAEWOULDBLOCK を する
重複するソケット: 未処理の重複 I/O 要求が多すぎます。 オーバーラップされていないソケット: ソケットは非ブロッキングとしてマークされ、送信操作をすぐに完了することはできません。
WSANOTINITIALIZED の
WSAStartup 呼び出し 成功してから、この関数を使用する必要があります。
WSA_IO_PENDING
重複する操作が正常に開始され、完了は後で示されます。
WSA_OPERATION_ABORTED
ソケットのクローズまたは WSAIoctlでの SIO_FLUSH コマンドの実行により、重複する操作 取り消されました。

備考

WSASendMsg 関数は、WSASend の代わりに使用でき、WSASendTo 関数 できます。 WSASendMsg 関数は、データグラムおよび生ソケットでのみ使用できます。 パラメーターのソケット記述子は、ソケットの種類を SOCK_DGRAM または SOCK_RAWに設定して開く必要があります。

dwFlags パラメーターには、MSG_DONTROUTEMSG_PARTIAL、および MSG_OOBのコントロール フラグの組み合わせのみを含めることができます。 dwFlagslpMsg パラメーターが指す WSAMSG 構造体のメンバーは、入力では無視され、出力では使用されません。

注意WSASendMsg 関数の関数ポインターは、SIO_GET_EXTENSION_FUNCTION_POINTER オペコードを指定して WSAIoctl 関数を呼び出すことによって、実行時に取得する必要があります。 WSAIoctl 関数に渡される入力バッファーには、WSAID_WSASENDMSG、その値が WSASendMsg 拡張関数 識別するグローバル一意識別子 (GUID) が含まれている必要があります。 成功した場合、WSAIoctl 関数によって返される出力には、WSASendMsg 関数へのポインターが含まれます。 WSAID_WSASENDMSG GUID は、Mswsock.h ヘッダー ファイルで定義されています。
 

重複するソケットは、WSA_FLAG_OVERLAPPED フラグが設定された WSASocket 関数呼び出しを使用して作成されます。 重複するソケットの場合、lpOverlapped と lpCompletionRoutine の両方 が NULLされない限り、情報の送信には重複 I/O が使用されます。lpOverlapped lpCompletionRoutine が NULL場合、ソケットはオーバーラップされていないソケットとして扱われます。 完了の兆候は、重複するソケットで発生します。バッファーまたはバッファーがトランスポートによって使用されると、完了ルーチンがトリガーされるか、イベント オブジェクトが設定されます。 操作がすぐに完了しない場合は、完了ルーチンを介して、または WSAGetOverlappedResult 関数 呼び出すことによって、最終的な完了状態が取得されます。

オーバーラップされていないソケットの場合、lpOverlapped および lpCompletionRoutine パラメーター は無視され、WSASendMsg は、送信 関数と同じブロッキング セマンティクスを採用します。データはバッファーまたはバッファーからトランスポートのバッファーにコピーされます。 ソケットが非ブロッキングでストリーム指向で、トランスポートのバッファーに十分な領域がない場合、WSASendMsg は、アプリケーションのバッファーの一部のみが消費された状態で返されます。 これに対し、ブロッキング ソケットでのこのバッファー状況では、アプリケーションのすべてのバッファー コンテンツが使用されるまで、WSASendMsg がブロックされます。

この関数が重複して完了した場合、この呼び出しから戻る前に WSABUF 構造体 キャプチャするのは Winsock サービス プロバイダーの責任です。 これにより、アプリケーションは、lpMsg パラメーターが指す WSAMSG 構造体の lpBuffers メンバーによって指される WSABUF 配列にスタック ベースの を構築できます。

メッセージ指向ソケットの場合は、基になるプロバイダーの最大メッセージ サイズを超えないように注意する必要があります。これは、ソケット オプション SO_MAX_MSG_SIZEの値を取得することによって取得できます。 データが長すぎて基になるプロトコルをアトミックに通過できない場合は、WSAEMSGSIZE エラーが返され、データは送信されません。

SOCK_DGRAM または SOCK_RAWタイプの IPv4 ソケットでは、アプリケーションは、WSASendMsg 関数を して送信するために使用するローカル IP ソース アドレスを特定できます。 WSAMSG 構造体で WSASendMsg 関数に渡される制御データ・オブジェクトの 1 つに、送信に使用するローカル IPv4 ソース・アドレスを指定するために使用する in_pktinfo 構造が含まれている場合があります。

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 構造が含まれている必要があります。

SO_SNDTIMEO ソケット オプションは、ブロッキング ソケットにのみ適用されます。
 
注意WSASendMsg が正常に完了しても、データが正常に配信されたことは示されません。
 
lpOverlapped パラメーターが NULL に設定された WSASendMsg などのブロッキング Winsock 呼び出しを発行する場合、Winsock は呼び出しを完了する前にネットワーク イベントを待機する必要があります。 Winsock は、この状況でアラート可能な待機を実行します。この待機は、同じスレッドでスケジュールされた非同期プロシージャ 呼び出し (APC) によって中断される可能性があります。 同じスレッドで進行中の Winsock 呼び出しを中断した別のブロック Winsock 呼び出しを APC 内で発行すると、未定義の動作が発生し、Winsock クライアントが試行してはなりません。
 

dwFlags の

dwFlags 入力パラメーターを使用して、関連付けられているソケットに指定されたオプションを超えて関数呼び出しの動作に影響を与えることができます。 つまり、この関数のセマンティクスは、ソケット オプションと dwFlags パラメーターによって決まります。 後者は、次のいずれかの値を持つビットごとの OR 演算子を使用して構築されます。
価値 意味
MSG_DONTROUTE データをルーティングの対象にしないことを指定します。 Windows ソケット サービス プロバイダーは、このフラグを無視することを選択できます。
MSG_PARTIAL lpMsg-lpBuffers に部分的なメッセージのみが含まれていることを指定します。 WSAEOPNOTSUPP エラー コードは、部分的なメッセージ転送をサポートしていないトランスポートによって返されることに注意してください。
 

dwFlags パラメーター 指定できる値は、Winsock2.h ヘッダー ファイルで定義されています。

出力時には、lpMsg パラメーターが指す WSAMSG 構造体の dwFlags メンバーは使用されません。

重複するソケット I/O を する

重複した操作がすぐに完了すると、WSASendMsg
0 の値が返され、lpNumberOfBytesSent パラメーターが送信されたバイト数で更新されます。 重複した操作が正常に開始され、後で完了する場合は、WSASendMsg SOCKET_ERRORを返し、エラー コード WSA_IO_PENDINGを示します。 この場合、lpNumberOfBytesSent は更新されません。 重複する操作が完了すると、転送されるデータの量は、完了ルーチンの cbTransferred パラメーター (指定されている場合) または WSAGetOverlappedResultの lpcbTransfer パラメーター 使用して示されます。
特定のスレッドによって開始されたすべての I/O、そのスレッドが終了すると取り消されることに注意してください。 重複するソケットの場合、保留中の非同期操作は、操作が完了する前にスレッドが閉じられた場合に失敗する可能性があります。 詳細については、「ExitThread の を参照してください。
 

重複した I/O を使用する WSASendMsg 関数 は、前の WSARecvWSARecvFrom前の完了ルーチン内から呼び出すことができます。 LPFN_WSARECVMSG (WSARecvMsg)、WSASend、WSASendMsg、または WSASendTo 関数 します。 これにより、時間の影響を受けやすいデータ転送を、プリエンプティブ コンテキスト内で完全に実行できます。

lpOverlapped パラメーターは、重複する操作の間有効である必要があります。 複数の I/O 操作が同時に未処理の場合、それぞれが WSAOVERLAPPED 構造体 個別に参照する必要があります。

lpCompletionRoutine パラメーターが NULL場合、重複した操作が完了したときに、lpOverlappedhEvent パラメーターが通知されます (有効なイベント オブジェクト ハンドルが含まれている場合)。 アプリケーションは、WSAWaitForMultipleEvents 使用することも、WSAGetOverlappedResultしてイベント オブジェクトを待機またはポーリングすることもできます。

lpCompletionRoutine NULLされていない場合、hEvent パラメーターは無視され、アプリケーションがコンテキスト情報を完了ルーチンに渡すために使用できます。 以外の NULLlpCompletionRoutine を渡し、同じ重複 I/O 要求 WSAGetOverlappedResult を後で呼び出す呼び出し元は、WSAGetOverlappedResult の呼び出しに対して fWait パラメーターを設定して TRUEを することはできません。 この場合、hEvent パラメーターの使用は未定義であり、hEvent パラメーターを待機しようとすると、予測できない結果が発生します。

完了ルーチンは、Windows ファイル I/O 完了ルーチンに規定されているのと同じ規則に従います。 完了ルーチンは、スレッドが警告可能な待機状態になるまで呼び出されません。たとえば、WSAWaitForMultipleEvents fAlertable パラメーターを TRUEに設定して呼び出

トランスポート プロバイダーを使用すると、アプリケーションはソケット 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 Server 2012 R2: この関数は、Windows 8.1、Windows Server 2012 R2 以降の Windows ストア アプリでサポートされています。

必要条件

要件 価値
サポートされる最小クライアント Windows 8.1、Windows Vista [デスクトップ アプリ |UWP アプリ]
サポートされる最小サーバー Windows Server 2008 [デスクトップ アプリ |UWP アプリ]
ターゲット プラットフォーム の ウィンドウズ
ヘッダー winsock2.h (Mswsock.h を含む)
ライブラリ Ws2_32.lib
DLL Ws2_32.dll

関連項目

ExitThread の

IPV6_PKTINFO

IP_PKTINFO

WSABUF の

WSACancelBlockingCall の

WSAGetLastError の

WSAGetOverlappedResult の

WSAIoctl を する

WSAMSG を する

WSAOVERLAPPED の

WSASend を する

WSASendTo を する

WSASocket の

WSAStartup の

WSAWaitForMultipleEvents の

Winsock Functions

Winsock リファレンス

バインド

in6_pktinfo

in_pktinfo

を送信

シャットダウン の