recv関数は、接続されたソケットまたはバインドされた非接続ソケットからデータを受信します。
int recv( SOCKET s, // socket discriptor char* buf, // data buffer int len, // data length int flags // flags );
WS2_32.DLL
接続されたソケットを識別するディスクリプタを指定します。
受信データを格納するバッファへのポインタを指定します。
bufパラメータが指すバッファの長さをバイト単位で指定します。
呼び出しをどのように行うかを指定するフラグを指定します。このパラメータは、0または以下の値のビット論理和で構成されます。
受信データを覗き見ます。データはバッファにコピーされますが、入力キューから削除されません。続いて関数は1回のrecv(またはrecvfrom)関数で呼び出しで読み込み可能なデータ量を返しますが、これはそのソケットに対してキューイングされている全データ量と同じではない可能性があります。recv(またはrecvfrom)関数の1回の呼び出しで実際に読み込み可能なデータ量はsendまたはsendto関数呼び出しで書き込まれたサイズに制限されます。
受信要求は以下のいずれかのイベントが発生した時のみ完了します。
下層のトランスポート層がMSG_WAITALLをサポートしていないか、ソケとが非ブロッキングモードである場合、この呼び出しはWSAEOPNOTSUPPエラーで失敗します。また、MSG_OOB, MSG_PEEK, MSG_PARTIALのいずれかとともにMSG_WAITALLを指定した場合も、WSAEOPNOTSUPPエラーで失敗します。このフラグはデータグラムソケットやメッセージ指向ソケットではサポートされていません。
成功すると、受信したデータのバイト数を返します。ソケットがgracefulクローズされると、この関数は0を返します。
失敗すると-1 (SOCKET_ERROR) を返します。特定のエラーコードを取得するにはWSAGetLastError関数を呼び出します。
(ブロッキング)Windows Sockets 1.1呼び出しがWSACancelBlockingCallによりキャンセルされました。
bufパラメータは、ユーザアドレス空間の有効な部分に含まれていません。
ソケットが非ブロッキングとしてマークされていますが、受信操作がブロックしようとしました。
ブロッキングWindows Sockets 1.1呼び出しが実行中であるか、サービスプロバイダがコールバック関数を実行中です。
指定されたディスクリプタはソケットではありません。
メッセージが大きすぎて指定されたバッファに収めることができず、メッセージは切り捨てられました。
以下のいずれかのソケットに対してMSG_OOBが指定されました。
ネットワークサブシステムが失敗しました。
コネクション指向ソケットにおいて、操作を進行中にkeep-aliveアクティビティが障害を検出したために接続が破棄されました。ダイアグラムソケットにおいては、このエラーはパケット生存期間(TTL)が切れたことを示します。
仮想通信路がタイムアウトまたは他のエラーにより終了しました。そのソケットはもはや使用することができないので、アプリケーションはソケットをクローズするべきです。
リモート側がhardクローズまたはabortiveクローズを実行したことにより、仮想通信路がリセットされました。UDPソケットの場合、リモートホストは以前に送信されたUDPデータグラムを配信することができずに、「ポート不到達」ICMPパケット応答を返しました。そのソケットはもはや使用することができないので、アプリケーションはソケットをクローズするべきです。
ソケットは接続されていません。
指定されたソケットはシャットダウンされています。SD_RECEIVEまたはSD_BOTHを指定してshutdown関数を呼び出した後では、そのソケットから受信することはできません。
ネットワークのエラーのため、または相手側のシステムからの応答がなかったために、接続が破棄されました。
この関数を呼び出す前にWSAStartup関数の呼び出しが成功していなければなりません。
以下のいずれかのエラーが発生しました。
recv関数、コネクション指向ソケットまたは非接続型ソケットにおいて受信データを読み取るのに使用されます。コネクション指向プロトコルを使用するには、recv関数を呼び出す前にソケットが接続されていなければなりません。非接続型プロトコルを使用するには、recv関数を呼び出す前にソケットがバインドされていなければなりません。
ソケットのローカルアドレスは既知でなければなりません。サーバアプリケーションでは、明示的なbind関数や、間接的なaccept関数またはWSAAcceptを使用してください。クライアントアプリケーションでは、ソケットはconnect、WSAConnect、sendto、WSASendTo、WSAJoinLeaf関数を使用して間接的にローカルアドレスにバインドすることができます。
接続型ソケットまたは非接続型ソケットにおいて、recv関数は受信メッセージを受け取るアドレスを制限します。この関数は接続で指定されたリモートアドレスからのメッセージのみを返します。それ以外のアドレスからのメッセージは(暗黙のうちに)放棄されます。
接続型ソケット(例えばSOCK_STREAM)において、recv関数呼び出しは、指定されたバッファサイズ以下で、現在利用可能であるだけの長さのデータを返します。ソケットがOOBデータOOBデータのインラインレセプション用に設定されていて(ソケットオプションSO_OOBINLINE)、OOBデータがまだ読み込まれていない場合は、OOBデータを返します。アプリケーションはioctlsocketまたはWSAIoctl関数のSIOCATMARKコマンドを使用して、それ以上のまだ読み込まれていないOOBデータがあるかどうかを決定することができます。
非接続型ソケット(SOCK_DGRAM型やその他のメッセージ指向ソケット)において、connect関数で指定された宛先アドレスからの最初にキューに入れられたデータグラム(メッセージ)からデータが取り出されます。
データグラムやメッセージが指定されたバッファよりも長い場合、バッファにはデータグラムの最初の部分が格納され、recv関数はWSAEMSGSIZEエラーを返します。信頼性の低いプロトコル(例えばUDPなど)では、超過分のデータは失われます。信頼性の高いプロトコルでは、十分な大きさのバッファを指定してrecv関数を呼び出すことによって正常に読み込まれるまで、サービスプロバイダによってデータが保持されます。
指定されたソケットにおいて取得可能な受信データが存在しない場合は、ソケットが非ブロッキングでない限り、recv関数呼び出しはプロックして、WSARecv関数のMSG_PARTIALフラグをセットしない場合に対して定義されるブロッキング規則に従ってデータの到着を待機します。ソケットが非ブロッキングである場合、エラーコードにWSAEWOULDBLOCKをセットしてSOCKET_ERROR値を返します。select関数、WSAEventSelect関数、WSAEventSelect関数を使用して、追加のデータがいつ到着するかを決定することができます。
ソケットが接続型ソケットであり、リモート側が接続をgracefulシャットダウンを行い、すべてのデータの受信を完了した場合には、recv関数は受信バイト数ゼロで直ちに完了します。接続がリセットされると、recv関数はWSAECONNRESETエラーで失敗します。
Note: recvなどのブロッキングWinsock関数を呼び出す場合、Winsockは呼び出しが完了する前にネットワークイベントの待機を必要とする場合があります。そのような状況ではWinsockはアラート可能な待機を行いますが、この待機中に、同じスレッドでスケジューリングされている非同期プロシージャコール(APC)による割り込み処理が行われる可能性があります。あるブロッキングWinsock呼び出し中にAPC割り込みが発生し、その中で別のブロッキングWinsock呼び出しを行うと未定義の動作を引き起こします。そのため、Winsockクライアントはこのような呼び出しをしようとしてはいけません。
flagsパラメータを使用することにより、関連付けられたソケットに対して指定されているソケットオプションに優先して、関数の振る舞いに作用させることができます。この関数のセマンティックスは、sパラメータに指定されたソケットに対して以前にセットされたオプションとflagsパラメータによって決定されます。