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 は無視されます。
データグラム ソケットでは、指定されたバッファのサイズ以内で、キューの先頭のデータグラムからデータを取り出します。指定したバッファよりデータグラムが大きいときは、メッセージの先頭部分からバッファにデータを格納し、あふれたデータは失われます。ReceiveFrom は SOCKET_ERROR 値を返し、エラー コードに WSAEMSGSIZE が設定されます。
lpSockAddr が 0 以外で、ソケットが SOCK_DGRAM 型のときは、データを送信したソケットのネットワーク アドレスが、対応する SOCKADDR 構造体にコピーされます。lpSockAddrLen の指す変数には、構造体のサイズを設定しておきます。戻り時に構造体に格納された実際のアドレス長に更新されます。ソケットに利用できる受信データがないときは、ソケットが非ブロッキングでない限り、ReceiveFrom の呼び出しは受信データを待ちます。非ブロッキングのときは、エラー コードに WSAEWOULDBLOCK を設定し、SOCKET_ERROR 値を返します。到着しているデータがあるかどうかを調べるには、OnReceive コールバック関数を使います。
ソケットが SOCK_STREAM 型で、リモート側が接続をシャットダウンしたときは、ReceiveFrom はすぐに完了し、0 バイトを受信します。
必要条件
ヘッダー : afxsock.h