WSARecvEx 関数 (mswsock.h)

WSARecvEx 関数は、接続されているソケットまたはバインドされたコネクションレス ソケットからデータを受信します。 WSARecvEx 関数は recv 関数に似ていますが、flags パラメーターは情報を返すためにのみ使用されます。 データグラム プロトコルの使用中に部分的なメッセージを受信すると、関数から返されるときに、MSG_PARTIAL ビットが flags パラメーターに設定されます。

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

構文

int WSARecvEx(
  [in]      SOCKET s,
  [out]     char   *buf,
  [in]      int    len,
  [in, out] int    *flags
);

パラメーター

[in] s

接続されているソケットを識別する記述子。

[out] buf

受信データを受信するバッファーへのポインター。

[in] len

buf パラメーターが指すバッファーの長さ (バイト単位)。

[in, out] flags

データグラム ソケットに対してメッセージが完全または部分的に受信されるかどうかを示すインジケーター。

戻り値

エラーが発生しない場合、 WSARecvEx は受信したバイト数を返します。 接続が閉じられた場合は、0 が返されます。 さらに、部分的なメッセージを受信した場合、MSG_PARTIAL ビットは flags パラメーターに設定されます。 完全なメッセージが受信された場合、MSG_PARTIALはフラグで設定されません

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

大事な ストリーム指向トランスポート プロトコルの場合、 MSG_PARTIALは WSARecvEx からの戻り値に設定されません。 この関数は、ストリーム トランスポート プロトコルの recv 関数と同じように動作します。
 
エラー コード 意味
WSAECONNABORTED
仮想回線はタイムアウトまたはその他の障害のために切断されました。 ソケットが使用できないため、アプリケーションはソケットを閉じる必要があります。
WSAECONNRESET
強制終了または中止になる閉じる操作を実行するリモート側によって仮想回線がリセットされました。 ソケットが使用できないため、アプリケーションはソケットを閉じる必要があります。 UPD データグラム ソケットでは、このエラーは前の送信操作で ICMP "ポートに到達できません" というメッセージが発生したことを示します。
WSAEFAULT
buf パラメーターは、ユーザー・アドレス・スペースの有効な部分に完全に含まれていません。
WSAEINPROGRESS
ブロックしている Windows Sockets 1.1 呼び出しが進行中であるか、サービス プロバイダーがコールバック関数を処理しています。
WSAEINTR
(ブロッキング) 呼び出しは 、WSACancelBlockingCall 呼び出しによって取り消されました。
WSAEINVAL
ソケットが バインドでバインドされていないか、不明なフラグが指定されたか、SO_OOBINLINEが有効になっているソケットまたは (バイト ストリーム ソケットの場合のみ) len が 0 または負の値で指定されたMSG_OOB。
WSAENETDOWN
ネットワーク サブシステムが失敗しました。
WSAENETRESET
接続指向ソケットの場合、このエラーは、操作の実行中に障害を検出した キープアライブ アクティビティが原因で接続が切断されたことを示します。 データグラム ソケットに関して、このエラーは有効期限が切れたことを示します。
WSAENOTCONN
ソケットは接続されていません。
WSAENOTSOCK
記述子はソケットではありません。
WSAEOPNOTSUPP
MSG_OOB指定されましたが、ソケットは、型SOCK_STREAM、OOB データは、このソケットに関連付けられている通信ドメインでサポートされていない、またはソケットが一方向であり、送信操作のみをサポートするなど、ストリーム スタイルではありません。
WSAESHUTDOWN
ソケットがシャットダウンされました。シャットダウンがSD_RECEIVEまたはSD_BOTHに設定された方法で呼び出された後、ソケットで WSARecvEx を使用することはできません。
WSAETIMEDOUT
ネットワーク障害が発生したか、ピア システムが応答できなかったため、接続は切断されました。
WSAEWOULDBLOCK
ソケットは非ブロッキングとしてマークされ、受信操作はブロックされます。
WSANOTINITIALISED
この関数を使用する前に 、WSAStartup 呼び出しが正常に行われる必要があります。

注釈

Windows Sockets 2 の Microsoft 実装の一部である WSARecvEx 関数は、フラグ パラメーターが 1 つの特定の目的で使用される点を除き、より一般的な recv 関数に似ています。 flags パラメーターは、メッセージ指向プロトコルが使用されているときに、部分的または完全なメッセージを受信するかどうかを示すために使用されます。

flags パラメーターが指す値は、入力時に無視されます。 そのため、 WSARecvEx 関数にフラグを渡して動作を変更することはできません。 flags パラメーターが指す値は、出力時に設定されます。 これは、入力の flags パラメーターによって指される値が関数の動作を変更できる recv 関数と WSARecv 関数とは異なります。

WSARecvEx 関数と recv 関数は、ストリーム指向プロトコルで同じように動作します。

flags パラメーターは、部分的なメッセージを受信する 2 つの一般的な状況に対応します。

  • アプリケーションのデータ バッファー サイズがメッセージ サイズよりも小さく、同時にメッセージが 2 つの部分で到着する場合。
  • メッセージがかなり大きく、複数の部分で到着する必要がある場合。
MSG_PARTIAL ビットは、部分的なメッセージを受信したときに WSARecvEx から返されるときに flags パラメーターによって指される値に設定されます。 完全なメッセージを受信した場合、 フラグ パラメーターによって示される値にMSG_PARTIALは設定されません。

recv 関数は、次の関数とは異なります。
WSARecvEx および WSARecv 関数は、 recv 関数がメッセージ指向トランスポート プロトコルの呼び出しごとに常に 1 つのメッセージを受信するという点で機能します。 また、recv 関数には、受信したデータが部分的なメッセージであることをアプリケーションに示す手段はありません。 アプリケーションは、recv の呼び出しのたびにエラー コード WSAEMSGSIZE を確認することによって、メッセージが部分的か完了かを確認するための独自のプロトコルを構築する必要があります。 アプリケーション バッファーが送信されるデータよりも小さい場合は、メッセージのサイズと同じ量がユーザーのバッファーにコピーされ、 recv はエラー コード WSAEMSGSIZE で返されます。 それ以降 の recv の呼び出しでは、メッセージの次の部分が取得されます。

メッセージ指向トランスポート プロトコル用に作成されたアプリケーションは、アプリケーションのデータ転送プロトコルによってメッセージのサイズ設定が保証されない場合に、この可能性のためにコード化する必要があります。 アプリケーションは recv を使用し、プロトコル自体を管理できます。 または、アプリケーションで WSARecvEx を 使用し、MSG_PARTIAL ビットが flags パラメーターに設定されていることを確認することもできます。

WSARecvEx 関数を使用すると、非常に大きなメッセージが増分的に到着したときに、受信したメッセージが部分的か完了かを調べるより効果的な方法が開発者に提供されます。 たとえば、アプリケーションが 1 MB のメッセージを送信する場合、トランスポート プロトコルはメッセージを物理ネットワーク経由で送信するために分割する必要があります。 理論的には、受信側のトランスポート プロトコルでメッセージ内のすべてのデータをバッファー処理することは可能ですが、リソースの観点からは非常にコストがかかります。 代わりに、 WSARecvEx を 使用してオーバーヘッドを最小限に抑え、アプリケーション ベースのプロトコルの必要性を排除できます。

メモ 特定のスレッドによって開始されたすべての I/O は、そのスレッドが終了すると取り消されます。 重複するソケットの場合、操作が完了する前にスレッドが閉じられた場合、保留中の非同期操作が失敗する可能性があります。 詳細については、 ExitThread 関数を参照してください。
 

要件

   
サポートされている最小のクライアント Windows 2000 Professional [デスクトップ アプリのみ]
サポートされている最小のサーバー Windows 2000 Server [デスクトップ アプリのみ]
対象プラットフォーム Windows
ヘッダー mswsock.h (mswsock.h を含む)
Library Mswsock.lib
[DLL] Mswsock.dll

こちらもご覧ください

WSAAsyncSelect

WSARecv

Winsock 関数

Winsock リファレンス

Recv

recvfrom

select

送信

socket