recv() - ソケット上のデータの受信

標準

標準/拡張機能 C/C++ 依存項目

XPG4.2
Single UNIX Specification、バージョン 3

両方  

形式

X/Open
#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);

機能説明

recv() 関数は、記述子 socket を用いてソケット上のデータを受信し、バッファーに保管します。recv() 呼び出しは、接続されたソケットだけに適用されます。
パラメーター
説明
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 は、接続がクローズされていることを示します。

正常に実行されなかった場合、recv() は -1 を戻して、errno を次のいずれかの値に設定します。
エラー・コード
説明
EBADF
socket が無効ソケット記述子です。
ECONNRESET
接続はピアによって強制的にクローズされました。
EFAULT
buf および len パラメーターを使用すると、呼び出し元のアドレス・スペースの外側のストレージにアクセスすることになります。
EINTR
recv() 呼び出しは、データが使用可能になる前にキャッチされたシグナルによって割り込まれました。
EINVAL
要求が無効か、またはサポートされていません。MSG_OOB フラグが設定され、アウト・オブ・バンドのデータが使用できません。
EIO
ネットワークまたはトランスポートで障害が発生しました。
ENOBUFS
使用可能なシステム・リソースが不十分で、呼び出しを完了させることができません。
ENOTCONN
接続されていない接続指向ソケットに対する受信を試みています。
ENOTSOCK
記述子はファイル用であり、ソケット用ではありません。
EOPNOTSUPP
指定したフラグは、このソケット・タイプまたはプロトコルの場合は サポートされていません。
ETIMEDOUT
接続の設定中またはアクティブな接続での伝送のタイムアウトのために、接続がタイムアウトになりました。
EWOULDBLOCK
socket は、非ブロック・モードになっているため、データの読み取りはできません。または、SO_RCVTIMEO タイムアウト 値に達したためデータを使用できませんでした。