CAsyncSocket::Receive
更新 : 2007 年 11 月
ソケットからデータを受信します。
virtual int Receive(
void* lpBuf,
int nBufLen,
int nFlags = 0
);
パラメータ
lpBuf
受信データ バッファ。nBufLen
lpBuf の長さ。バイト単位です。nFlags
呼び出し方法を指定します。この関数の意味は、ソケット オプションとパラメータ nFlags によって決まります。パラメータには C++ の OR 演算子を使って次の値の任意の組み合わせを指定できます。MSG_PEEK 受信データをピークします。データはバッファにコピーされますが、入力キューからは削除されません。
MSG_OOB 帯域外データをプロセスします。
戻り値
エラーが発生しなかった場合は、Receive で受信したバイト数を返します。既に接続が閉じられている場合は、0 を返します。それ以外の場合は SOCKET_ERROR 値を返します。固有のエラー コードは GetLastError を呼び出して取得できます。このメンバ関数では、次のエラーが発生します。
WSANOTINITIALISED この API を使う前に AfxSocketInit の呼び出しが正常終了していることが必要です。
WSAENETDOWN Windows ソケットの実装が、ネットワーク サブシステムの異常を検出しました。
WSAENOTCONN ソケットが接続されていません。
WSAEINPROGRESS 実行中の Windows ソケット呼び出しがブロッキングされています。
WSAENOTSOCK 記述子がソケットではありません。
WSAEOPNOTSUPP MSG_OOB が指定されましたが、SOCK_STREAM 型のソケットではありません。
WSAESHUTDOWN ソケットはシャット ダウンしています。nHow に 0 または 2 を指定して ShutDown を起動した後では、ソケットで Receive を呼び出すことはできません。
WSAEWOULDBLOCK ソケットは非ブロッキングになっていて、Receive 操作がブロックされました。
WSAEMSGSIZE データグラムが長すぎて、指定したバッファに入りきらないため、切り詰められました。
WSAEINVAL ソケットが Bind を使用してバインドされていません。
WSAECONNABORTED タイムアウトまたはその他の障害により、仮想回路はアボートされました。
WSAECONNRESET リモート側から仮想回路がリセットされました。
解説
この関数は、接続されているストリーム ソケット、またはデータグラム ソケットに対して使用し、受信データを読み込みます。
SOCK_STREAM 型のソケットでは、指定したバッファのサイズ内で利用できる量の情報を返します。ソケットが帯域外データのインライン受信 (ソケット オプション SO_OOBINLINE) に設定され、読み込んでいない帯域外データがあるときは、帯域外データのみを返します。読み込む帯域外データが残っているかどうかを判断するには、アプリケーションで IOCtlSIOCATMARK オプションか OnOutOfBandData を使います。
データグラム ソケットでは、指定されたバッファのサイズ以内で、キューの先頭のデータグラムからデータを取り出します。指定したバッファよりデータグラムが大きいときは、データグラムの先頭部分からバッファにデータを格納し、あふれたデータは失われます。Receive は SOCKET_ERROR 値を返し、エラー コードに WSAEMSGSIZE が設定されます。ソケットで利用できる受信データがないときは、SOCKET_ERROR 値が返され、エラー コードに WSAEWOULDBLOCK が設定されます。到着しているデータがあるかどうかを判断するには、OnReceive コールバック関数を使います。
ソケットが SOCK_STREAM 型で、リモート側が接続をシャット ダウンしたときは、Receive はすぐに完了し、0 バイトを受信します。接続がリセットされているときは、Receive はエラー コード WSAECONNRESET となり、失敗します。
Receive は、CAsyncSocket::OnReceive が呼び出されるたびに 1 度だけ呼び出される必要があります。
使用例
「CAsyncSocket::OnReceive」の例を参照してください。
必要条件
ヘッダー : afxsock.h