標準/拡張機能 | 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);
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() コマンドを参照してください。
この呼び出しは、着信メッセージまたはデータの長さを戻します。データグラム・パケットが長すぎて、提供されたバッファーに収まらない場合には、データグラム・ソケットは、余分なバイトを廃棄します。ソケット socket のデータが使用できず、さらに socket が ブロック・モードになっている場合には、データが到着するまで、recv() 呼び出しは呼び出し元をブロックします。データが使用できず、さらに socket が非ブロック・モードになっている 場合には、recv() は -1 を戻し、エラー・コードを EWOULDBLOCK に 設定します。非ブロッキング・モードの設定方法の説明については、fcntl() - オープン・ファイル記述子の制御または ioctl() - 装置の制御を参照してください。
データグラム・ソケットの場合には、このデータグラムの大きさが指定のバッファー に収まるならば、この呼び出しは、送信されたデータグラム全体を戻します。ストリーム・ソケットは、データを分離する境界のない情報ストリームのように動作します。例えば、アプリケーション A および B がストリーム・ソケットと接続され、アプリケーション A が 1000 バイトを送信した場合には、この関数のそれぞれの 呼び出しは、1 バイト、または 10 バイト、あるいは 1000 バイト全体を戻すこと ができます。したがって、ストリーム・ソケットを使用するアプリケーションは、この呼び出しをループに入れて、すべてのデータを受信するまで、この関数を呼び出す必要があります。
C++ の特殊な動作: C++ でこの関数を使用するには、_XOPEN_SOURCE_EXTENDED 1 フィーチャー・テスト・マクロを 使用する必要があります。
正常に実行された場合は、recv() は、メッセージまたはデータグラムの長さ (バイト単位) を戻します。値 0 は、接続がクローズされていることを示します。