次の方法で共有


CAsyncSocket::ReceiveFrom

更新 : 2007 年 11 月

データグラムを受信し、送信側のアドレスを SOCKADDR 構造体または rSocketAddress に格納します。

int ReceiveFrom(
   void* lpBuf,
   int nBufLen,
   CString& rSocketAddress,
   UINT& rSocketPort,
   int nFlags = 0 
);
int ReceiveFrom(
   void* lpBuf,
   int nBufLen,
   SOCKADDR* lpSockAddr,
   int* lpSockAddrLen,
   int nFlags = 0 
);

パラメータ

  • lpBuf
    受信データ バッファ。

  • nBufLen
    lpBuf の長さ。バイト単位です。

  • rSocketAddress
    ドットで区切られた数字列の IP アドレスを受け取る CString オブジェクトへの参照。

  • rSocketPort
    ポートを格納する UINT 型変数への参照。

  • lpSockAddr
    関数が返す送信側のアドレスを保持する SOCKADDR 構造体へのポインタ。

  • lpSockAddrLen
    lpSockAddr 内の送信側アドレスのバイト単位の長さへのポインタ。

  • nFlags
    呼び出し方法を指定します。この関数の意味は、ソケット オプションとパラメータ nFlags によって決まります。パラメータには C++ の OR 演算子を使って次の値の任意の組み合わせを指定できます。

    • MSG_PEEK   受信データをピークします。データはバッファにコピーされますが、入力キューからは削除されません。

    • MSG_OOB   帯域外データをプロセスします。

戻り値

エラーが発生しなかった場合、ReceiveFrom は受信したバイト数を返します。既に接続が閉じられている場合は 0 を返します。それ以外の場合は SOCKET_ERROR 値を返します。固有のエラー コードは GetLastError を呼び出して取得できます。このメンバ関数では、次のエラーが発生します。

  • WSANOTINITIALISED   この API を使う前に AfxSocketInit の呼び出しが正常終了していることが必要です。

  • WSAENETDOWN   Windows ソケットの実装が、ネットワーク サブシステムの異常を検出しました。

  • WSAEFAULT   引数 lpSockAddrLen が無効です。ピア アドレスを格納するには、lpSockAddr バッファが小さすぎます。

  • WSAEINPROGRESS   実行中の Windows ソケット呼び出しがブロッキングされています。

  • WSAEINVAL   ソケットが Bind を使用してバインドされていません。

  • WSAENOTCONN   ソケットが接続されていません (SOCK_STREAM 型だけ)。

  • WSAENOTSOCK   記述子がソケットではありません。

  • WSAEOPNOTSUPP   MSG_OOB が指定されましたが、SOCK_STREAM 型のソケットではありません。

  • WSAESHUTDOWN   ソケットはシャットダウンしています。nHow に 0 または 2 を指定して ShutDown を起動した後では、ソケットで ReceiveFrom を呼び出すことはできません。

  • WSAEWOULDBLOCK   ソケットは非ブロッキングになっていて、ReceiveFrom 操作がブロックされました。

  • WSAEMSGSIZE   データグラムが長すぎて、指定したバッファに入りきらないため、切り詰められました。

  • WSAECONNABORTED   タイムアウトまたはその他の障害により、仮想回路はアボートされました。

  • WSAECONNRESET   リモート側から仮想回路がリセットされました。

解説

この関数は、(接続されている可能性がある) ソケットから受信したデータを読み込み、そのデータの送信側のアドレスをキャプチャします。

IPv6 アドレスを処理するには、CAsyncSocket::ReceiveFromEx を使用します。

SOCK_STREAM 型のソケットでは、指定したバッファのサイズ内で利用できる量の情報を返します。ソケットが帯域外データのインライン受信 (ソケット オプション SO_OOBINLINE) に設定され、読み込んでいない帯域外データがあるときは、帯域外データのみを返します。読み込む帯域外データが残っているかどうかを判断するには、アプリケーションで IOCtlSIOCATMARK オプションか OnOutOfBandData を使います。SOCK_STREAM 型のソケットでは、パラメータ lpSockAddr と lpSockAddrLen は無視されます。

データグラム ソケットでは、指定されたバッファのサイズ以内で、キューの先頭のデータグラムからデータを取り出します。指定したバッファよりデータグラムが大きいときは、メッセージの先頭部分からバッファにデータを格納し、あふれたデータは失われます。ReceiveFromSOCKET_ERROR 値を返し、エラー コードに WSAEMSGSIZE が設定されます。

lpSockAddr が 0 以外で、ソケットが SOCK_DGRAM 型のときは、データを送信したソケットのネットワーク アドレスが、対応する SOCKADDR 構造体にコピーされます。lpSockAddrLen の指す変数には、構造体のサイズを設定しておきます。戻り時に構造体に格納された実際のアドレス長に更新されます。ソケットに利用できる受信データがないときは、ソケットが非ブロッキングでない限り、ReceiveFrom の呼び出しは受信データを待ちます。非ブロッキングのときは、エラー コードに WSAEWOULDBLOCK を設定し、SOCKET_ERROR 値を返します。到着しているデータがあるかどうかを調べるには、OnReceive コールバック関数を使います。

ソケットが SOCK_STREAM 型で、リモート側が接続をシャットダウンしたときは、ReceiveFrom はすぐに完了し、0 バイトを受信します。

必要条件

ヘッダー : afxsock.h

参照

参照

CAsyncSocket クラス

階層図

CAsyncSocket::AsyncSelect

CAsyncSocket::Create

CAsyncSocket::Receive

CAsyncSocket::Send

その他の技術情報

CAsyncSocket のメンバ