recv() - ソケット上のデータの受信
標準
標準/拡張機能 | C/C++ | 依存項目 |
---|---|---|
XPG4.2 |
両方 |
形式
#define _XOPEN_SOURCE_EXTENDED 1
#include <sys/socket.h>
ssize_t recv(int socket, void *buffer, size_t length, int flags);
#define _OE_SOCKETS
#include <sys/socket.h>
int recv(int socket, char *buffer, int length, int flags);
機能説明
- パラメーター
- 説明
- socket
- ソケット記述子。
- buf
- データを受け取るバッファーへのポインター。
- len
- buf パラメーターが指すバッファーの 長さ (バイト単位)。MSG_CONNTERM フラグが設定されている場合、バッファーの長さはゼロでなければなりません。
- flags
- flags パラメーターは、次のフラグを 1 つ以上指定することによって設定されます。複数のフラグを指定する場合は、論理 OR 演算子 (|) を使用してフラグを分離する必要があります。MSG_CONNTERM フラグは、他のフラグと相互に排他的です。
- MSG_CONNTERM
- TCP 接続が終了された場合にのみ、関数が完了するよう要求します。これは、TCP ソケットでのみ有効です。その他の通常の受信要求も完了します。アプリケーションは、通常の受信、およびこの特殊接続の終了受信が並行して実行される可能性がある状況を処理可能である必要があります。AT-TLS の考慮事項: AT-TLS を使用して、TCP ソケット、および MSG_CONNTERM が未解決の受信要求に対して透過的な TLS/SSL サポートを提供している場合、AT-TLS は直ちに、ピアによって送信された TLS/SSL のクローズ通知アラートを受け入れ、TLS/SSL セッションのシャットダウンを開始します。AT-TLS、および TCP 接続が AT-TLS を使用しているかどうかの判別について詳しくは、「z/OS Communications Server: IP Programmer's Guide and Reference」を参照してください。
- MSG_OOB
- ソケット上のアウト・オブ・バンドのデータを読み取ります。アウト・オブ・バンドのデータは、send()、sendto()、または sendmsg() の場合に MSG_OOB フラグ
がオンのときに送信されます。
F_SETOWN を指定して fcntl() コマンドを使用して、アウト・オブ・バンドのデータが送信される ときに送信される SIGURG シグナルの受信側として、ページ ID またはグループ ID の どちらかを指定する必要があります。受信側が設定されていないと、シグナルは送信されないことになります。詳しくは、fcntl() コマンドを参照してください。データの受信側は、アウト・オブ・バンドのデータをインラインで受け取るか、あるいは setsockopt() の SO_OOBINLINE オプションの設定により、インラインで受け取らないかどうかを判別します。SO_OOBINLINE をオフにして、MSG_OOB フラグをオンにすると、アウト・オブ・バンドのデータ・ バイトは行の外側を読み取られることになります。SO_OOBINLINE がオンに設定されているときに、MSG_OOB フラグをオンに設定する ことは無効です。アウト・オブ・バンドのデータが使用可能で、MSG_OOB フラグが設定されていない (SO_OOBINLINE はオンまたはオフにできる) 場合には、アウト・オブ・バンドのデータに達するまで (しかしこれをインクルードしていない) データが読み取られることになります。読み取りカーソルがアウト・オブ・バンドのデータ・バイトに達した場合には、アウト・オブ・バンドのデータだけ を次の読み取りで読み取ることができます。ioctl() の SIOCATMARK オプションを使用して、読み取りカーソルが、現在、アウト・オブ・バンドのデータ・バイトにあるかどうかを判別できます。詳しくは、setsockopt() および ioctl() コマンドを参照してください。
- MSG_PEEK
- ソケット上に存在しているデータをピークします。データは戻されますが、消費されないので、後続の受信操作で同じデータが参照されます。
- MSG_WAITALL
- 要求したデータ全部が戻されるまで、関数がブロックするように要求します。シグナルがキャッチされるか、接続が終了するか、 エラーが保留されているか、あるいは、SO_RCVTIMEO が設定されていて、ソケットでタイマーが満了している場合、 この関数はデータを全部は戻さないことがあります。
この呼び出しは、着信メッセージまたはデータの長さを戻します。データグラム・パケットが長すぎて、提供されたバッファーに収まらない場合には、データグラム・ソケットは、余分なバイトを廃棄します。ソケット socket のデータが使用できず、さらに socket が ブロック・モードになっている場合には、データが到着するまで、recv() 呼び出しは呼び出し元をブロックします。データが使用できず、さらに socket が非ブロック・モードになっている 場合には、recv() は -1 を戻し、エラー・コードを EWOULDBLOCK に 設定します。非ブロッキング・モードの設定方法の説明については、fcntl() - オープン・ファイル記述子の制御または ioctl() - 装置の制御を参照してください。
データグラム・ソケットの場合には、このデータグラムの大きさが指定のバッファー に収まるならば、この呼び出しは、送信されたデータグラム全体を戻します。ストリーム・ソケットは、データを分離する境界のない情報ストリームのように動作します。例えば、アプリケーション A および B がストリーム・ソケットと接続され、アプリケーション A が 1000 バイトを送信した場合には、この関数のそれぞれの 呼び出しは、1 バイト、または 10 バイト、あるいは 1000 バイト全体を戻すこと ができます。したがって、ストリーム・ソケットを使用するアプリケーションは、この呼び出しをループに入れて、すべてのデータを受信するまで、この関数を呼び出す必要があります。
C++ の特殊な動作: この関数を C++ で使用するには、_XOPEN_SOURCE_EXTENDED 1 フィーチャー・テスト・マクロを使用する必要があります。
戻り値
正常に実行された場合は、recv() は、メッセージまたはデータグラムの長さ (バイト単位) を戻します。値 0 は、接続がクローズされていることを示します。
- エラー・コード
- 説明
- EBADF
- socket が無効ソケット記述子です。
- ECONNRESET
- 接続はピアによって強制的にクローズされました。
- EFAULT
- buf および len パラメーターを使用すると、呼び出し元のアドレス・スペースの外側のストレージにアクセスすることになります。
- EINTR
- recv() 呼び出しは、データが使用可能になる前にキャッチされたシグナルによって割り込まれました。
- EINVAL
- 要求が無効か、またはサポートされていません。MSG_OOB フラグが設定され、アウト・オブ・バンドのデータが使用できません。
- EIO
- ネットワークまたはトランスポートで障害が発生しました。
- ENOBUFS
- 使用可能なシステム・リソースが不十分で、呼び出しを完了させることができません。
- ENOTCONN
- 接続されていない接続指向ソケットに対する受信を試みています。
- ENOTSOCK
- 記述子はファイル用であり、ソケット用ではありません。
- EOPNOTSUPP
- 指定したフラグは、このソケット・タイプまたはプロトコルの場合は サポートされていません。
- ETIMEDOUT
- 接続の設定中またはアクティブな接続での伝送のタイムアウトのために、接続がタイムアウトになりました。
- EWOULDBLOCK
- socket は、非ブロック・モードになっているため、データの読み取りはできません。または、SO_RCVTIMEO タイムアウト 値に達したためデータを使用できませんでした。
関連情報
- sys/socket.h — ソケット定義
- connect() - ソケットの接続
- fcntl() - オープン・ファイル記述子の制御
- getsockopt() - ソケットに関連したオプションの取得
- ioctl() - 装置の制御
- read() - ファイルまたはソケットからの読み取り
- readv() - ファイルまたはソケットのデータの読み取りとバッファー・セットへの保管
- recvfrom() - ソケット上のメッセージの受信
- recvmsg() - ソケット上のメッセージの受信およびメッセージ・ヘッダーの配列への保管
- select()、pselect() - ファイルまたはソケットおよびメッセージ・キューに関するアクティビティーのモニター
- selectex() - ファイルまたはソケットおよびメッセージ・キューに関するアクティビティーのモニター
- send() - ソケットに関するデータの送信
- sendmsg() - ソケットに関するメッセージの送信
- sendto() - ソケットに関するデータの送信
- setsockopt() - ソケットに関連したオプションの設定
- socket() - ソケットの作成
- write() - ファイルまたはソケットへのデータの書き込み
- writev() - 配列からファイルまたはソケットへのデータの書き込み