CAsyncSocket::ReceiveFrom
データグラムを受信し、送信側のアドレスを 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) に設定され、読み込んでいない帯域外データがあるときは、帯域外データのみを返します。 読み込む帯域外データが残っているかどうかを判断するには、アプリケーションで IOCtl SIOCATMARK オプションか 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