recvfrom サブルーチン

目的

ソケットからメッセージを受信します。

ライブラリー

標準 C ライブラリー (libc.a)

構文

#include <sys/socket.h>

ssize_t recvfrom
(Socket, Buffer, Length, Flags, From, FromLength)
int  Socket;
void * Buffer;
size_t  Length,
int  Flags;
struct sockaddr * From;
socklen_t * FromLength;

説明

recvfrom サブルーチンを使用すると、アプリケーション・プログラムは、接続されていないソケットからメッセージを受け取ることができます。 recvfrom サブルーチンは、通常、受信するデータのソース・ポイントを呼び出し側プログラムが指定できるようにするパラメーターを含んでいるため、接続されていないソケットに適用されます。

メッセージのソース・アドレスを返すには、 From パラメーターに非ヌル値を指定します。 FromLength パラメーターは値-結果パラメーターで、 From パラメーターに関連付けられたバッファーのサイズに初期化されます。 戻り時に、 recvfrom サブルーチンは、保管されているアドレスの実際のサイズを示すように FromLength パラメーターを変更します。 recvfrom サブルーチンは、メッセージの長さを戻します。 メッセージが長すぎて提供されたバッファーに収まらない場合は、メッセージを発行したソケットのタイプによっては、余分のバイトが切り捨てられることがあります。

ソケットに使用可能なメッセージがない場合、 recvfrom サブルーチンは、ソケットが非ブロッキングでない限り、メッセージの到着を待ちます。 ソケットが非ブロッキングの場合、システムはエラーを戻します。

ソケット・アプリケーションは、 COMPAT_43 を定義してコンパイルすることができます。 これにより、 sockaddr 構造体は BSD 4.3 と互換性を持ちます。 詳しくは、 socket.hを参照してください。

パラメーター

項目 説明
ソケット ソケット記述子を指定します。
buffer メッセージを入れるアドレスを指定します。
長さ Buffer パラメーターのサイズを指定します。
flags メッセージ受信を制御する値を指します。 呼び出しを受け取る引数は、以下のリストに示す 1 つ以上の値を論理 OR 演算することによって形成されます。
MSG_OOB
アウト・オブ・バンド・データを処理します。 アウト・オブ・バンド・データの重要性はプロトコルに依存します。
MSG_PEEK
着信データをピークします。 データは引き続き未読として扱われ、次回の recv () または同様の関数の呼び出しで読み取られます。
MSG_WAITALL
要求されたバイト数が読み取られるまで関数が戻らないように要求します。 この関数は、シグナルがキャッチされた場合、接続が終了した場合、またはソケットに対してエラーが保留中の場合にのみ、要求されたバイト数より少ないバイト数を戻すことができます。
送信元 ソースのアドレスで埋められたソケット構造体を指します。
FromLength 送信側またはソースのアドレスの長さを指定します。

戻り値

recvfrom サブルーチンが正常に実行されると、このサブルーチンはメッセージの長さをバイト単位で戻します。

呼び出しが失敗すると、サブルーチン・ハンドラーは以下の関数を実行します。

  • 呼び出したプログラムに-11を返す。
  • 特定のエラーを示すエラー・コードを errno グローバル変数に移動します。

エラー・コード

以下のいずれかのエラーが発生すると、 recvfrom サブルーチンは失敗します。

エラー 説明
EBADF Socket パラメーターが有効ではありません。
ECONNRESET リモート・ピアは、接続を強制的にクローズします。
EFAULT データは、プロセス・アドレス・スペースの存在しない部分または保護された部分に受信されるように指示されました。 バッファーが無効です。
EINTR 受信は、データが使用可能になる前にシグナル送達によって割り込まれます。
EINVAL MSG_OOB フラグが設定されていますが、使用可能なアウト・オブ・バンド・データがありません。
ENOBUF (ENOBUF) 操作を実行するための十分なリソースがシステムにありません。
ENOPROTOOPT プロトコルが 64 ビット対応ではありません。
ENOTCONN 接続されていない SOCK_STREAM ソケットで受信が試行されました。
ENOTSOCK Socket パラメーターは、ソケットではなくファイルを参照します。
EOPNOTSUPP SOCK_DGRAM ソケットの場合は MSG_OOB フラグが設定され、 AF_UNIX ソケットの場合は MSG_OOB フラグが設定されます。
ETIMEDOUT 接続の確立中に接続がタイムアウトになったか、アクティブな接続で送信タイムアウトが発生しました。
EWOULDBLOCK ソケットは非ブロッキングとしてマークされ、受け入れられる接続は存在しません。