次の方法で共有


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 を使います。

データグラム ソケットでは、指定されたバッファのサイズ以内で、キューの先頭のデータグラムからデータを取り出します。指定したバッファよりデータグラムが大きいときは、データグラムの先頭部分からバッファにデータを格納し、あふれたデータは失われます。ReceiveSOCKET_ERROR 値を返し、エラー コードに WSAEMSGSIZE が設定されます。ソケットで利用できる受信データがないときは、SOCKET_ERROR 値が返され、エラー コードに WSAEWOULDBLOCK が設定されます。到着しているデータがあるかどうかを判断するには、OnReceive コールバック関数を使います。

ソケットが SOCK_STREAM 型で、リモート側が接続をシャット ダウンしたときは、Receive はすぐに完了し、0 バイトを受信します。接続がリセットされているときは、Receive はエラー コード WSAECONNRESET となり、失敗します。

Receive は、CAsyncSocket::OnReceive が呼び出されるたびに 1 度だけ呼び出される必要があります。

使用例

CAsyncSocket::OnReceive」の例を参照してください。

必要条件

ヘッダー : afxsock.h

参照

参照

CAsyncSocket クラス

階層図

CAsyncSocket::AsyncSelect

CAsyncSocket::Create

CAsyncSocket::ReceiveFrom

CAsyncSocket::Send

その他の技術情報

CAsyncSocket のメンバ