次の方法で共有


WSARecvEx 関数 (winsock.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 を呼び出すことによって特定のエラー コードを取得できます。

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

解説

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

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

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

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

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

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

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

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

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

要件

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

関連項目

WSAAsyncSelect

WSARecv

Winsock 関数

Winsock リファレンス

Recv

recvfrom

select

送信

socket