WSARecvEx 関数 (winsock.h)
WSARecvEx 関数は、接続されたソケットまたはバインドされたコネクションレス ソケットからデータを受信します。 WSARecvEx 関数は recv 関数に似ていますが、flags パラメーターは情報を返すためにのみ使用されます。 データグラム プロトコルの使用中に部分的なメッセージを受信すると、MSG_PARTIAL ビットは関数からの戻り時に flags パラメーターに設定されます。
構文
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 を呼び出すことによって特定のエラー コードを取得できます。
エラー コード | 意味 |
---|---|
仮想回線はタイムアウトまたはその他の障害のために切断されました。 ソケットが使用できないため、アプリケーションはソケットを閉じる必要があります。 | |
強制終了または中止になる閉じる操作を実行するリモート側によって仮想回線がリセットされました。 ソケットが使用できないため、アプリケーションはソケットを閉じる必要があります。 UPD データグラム ソケットでは、このエラーは前の送信操作で ICMP "ポートに到達できません" というメッセージが発生したことを示します。 | |
buf パラメーターは、ユーザー・アドレス・スペースの有効な部分に完全には含まれていません。 | |
ブロックしている Windows Sockets 1.1 呼び出しが進行中であるか、サービス プロバイダーがコールバック関数を処理しています。 | |
(ブロッキング) 呼び出しは 、WSACancelBlockingCall 呼び出しによって取り消されました。 | |
ソケットが バインドされていないか、不明なフラグが指定されたか、SO_OOBINLINEが有効になっているソケットに対してMSG_OOBが指定されました。または (バイト ストリーム ソケットの場合のみ) len が 0 または負の値でした。 | |
ネットワーク サブシステムが失敗しました。 | |
接続指向ソケットの場合、このエラーは、操作の進行中に障害を検出した キープアライブ アクティビティが原因で接続が切断されたことを示します。 データグラム ソケットに関して、このエラーは有効期限が切れたことを示します。 | |
ソケットは接続されていません。 | |
記述子はソケットではありません。 | |
MSG_OOBが指定されましたが、ソケットは、型SOCK_STREAMなどのストリーム スタイルではありません。OOB データは、このソケットに関連付けられている通信ドメインでサポートされていないか、ソケットが一方向であり、送信操作のみをサポートします。 | |
ソケットがシャットダウンされました。SD_RECEIVEまたはSD_BOTHに設定された方法でシャットダウンが呼び出された後、ソケットで WSARecvEx を使用することはできません。 | |
ネットワーク障害が発生したか、ピア システムが応答できなかったため、接続は切断されました。 | |
ソケットは非ブロッキングとしてマークされ、受信操作はブロックされます。 | |
この関数を使用する前に、 WSAStartup 呼び出しが正常に行われる必要があります。 |
解説
Windows Sockets 2 の Microsoft 実装の一部である WSARecvEx 関数は、flags パラメーターが 1 つの特定の目的で使用される点を除き、より一般的な recv 関数と似ています。 flags パラメーターは、メッセージ指向プロトコルが使用されているときに、部分的または完全なメッセージを受信するかどうかを示すために使用されます。
flags パラメーターが指す値は、入力時に無視されます。 そのため、 WSARecvEx 関数にフラグを渡して動作を変更することはできません。 flags パラメーターが指す値は、出力時に設定されます。 これは、入力の flags パラメーターによって指される値が関数の動作を変更できる recv 関数と WSARecv 関数とは異なります。
WSARecvEx 関数と recv 関数は、ストリーム指向プロトコルで同じように動作します。
flags パラメーターは、部分的なメッセージを受信する 2 つの一般的な状況に対応します。
- アプリケーションのデータ バッファー サイズがメッセージ サイズよりも小さく、メッセージが偶然に 2 つの部分で到着する場合。
- メッセージがかなり大きく、複数の部分で到着する必要がある場合。
recv 関数は、
WSARecvEx および WSARecv 関数は、 recv 関数がメッセージ指向トランスポート プロトコルの呼び出しごとに常に 1 つのメッセージを受信するという点で機能します。
また、recv 関数には、受信したデータが部分的なメッセージだけであることをアプリケーションに示す手段はありません。 アプリケーションは、recv を呼び出すたびにエラー コード WSAEMSGSIZE を調べて、メッセージが部分的か完全かを確認するための独自のプロトコルを構築する必要があります。 アプリケーション バッファーが送信されるデータよりも小さい場合、収まるメッセージの量がユーザーのバッファーにコピーされ、 recv はエラー コード WSAEMSGSIZE を使用してを返します。 recv の後続の呼び出しでは、メッセージの次の部分が取得されます。
メッセージ指向トランスポート プロトコル用に記述されたアプリケーションは、アプリケーションのデータ転送プロトコルによってメッセージのサイズ設定が保証されない場合に、この可能性のためにコーディングする必要があります。 アプリケーションは recv を使用し、プロトコル自体を管理できます。 または、アプリケーションで WSARecvEx を使用し、MSG_PARTIAL ビットが flags パラメーターに設定されていることをチェックできます。
WSARecvEx 関数を使用すると、非常に大きなメッセージが段階的に到着したときに、受信したメッセージが部分的か完全かを確認するより効果的な方法が開発者に提供されます。 たとえば、アプリケーションが 1 メガバイトのメッセージを送信する場合、トランスポート プロトコルはメッセージを物理ネットワーク経由で送信するために分割する必要があります。 受信側のトランスポート プロトコルがメッセージ内のすべてのデータをバッファーに格納することは理論的には可能ですが、リソースの観点からは非常にコストがかかります。 代わりに、 WSARecvEx を使用してオーバーヘッドを最小限に抑え、アプリケーション ベースのプロトコルの必要性を排除できます。
要件
サポートされている最小のクライアント | Windows 2000 Professional [デスクトップ アプリのみ] |
サポートされている最小のサーバー | Windows 2000 Server [デスクトップ アプリのみ] |
対象プラットフォーム | Windows |
ヘッダー | winsock.h (Mswsock.h を含む) |
Library | Mswsock.lib |
[DLL] | Mswsock.dll |