recvmsg(2) FreeBSD 一般コマンドマニュアル

recvmsg

前のページ 上に戻る 次のページ

recvmsg




書式

     #include <sys/types.h>
     #include <sys/socket.h>

     ssize_t
     recv(int s, void *buf, size_t len, int flags);

     ssize_t
     recvfrom(int s, void *buf, size_t len, int flags, struct sockaddr *from,
             socklen_t *fromlen);

     ssize_t
     recvmsg(int s, struct msghdr *msg, int flags);


解説

     recvfrom() と recvmsg() は、ソケットからのメッセージを受信するのに使用さ
     れます。ソケットが接続指向であるかどうかにかかわらず、ソケット上のデータ
     を受信するのに使用できます。

     from が nil でなく、ソケットが接続指向でない場合、ここにはメッセージのソ
     ースアドレスが保存されます。 fromlen は「値 - 結果」パラメータであり、
     from に対応するバッファのサイズに初期化され、戻り時には保存されたアドレス
     の実際のサイズを示すように変更されます。

     recv() 呼び出しは、通常 接続されたソケット上だけで使用され (connect(2) を
     参照)、 from パラメータに nil を指定した recvfrom() と同一です。これは冗
     長なので、将来のリリースではサポートされない可能性があります。

     これら 3 つのルーチンは正常に完了するとメッセージの長さを返します。メッセ
     ージが長すぎて指定のバッファに収まらない場合、メッセージを受信したソケッ
     トのタイプによっては超過分のバイトが破棄されることがあります (socket(2)
     を参照)。

     ソケットにメッセージが無い場合は、ソケットが非ブロッキング (fcntl(2) を参
     照) の場合を除き、呼び出しはメッセージが到着するのを待ちます。ソケットが
     非ブロッキングの場合、値 -1 が返され、外部変数 errno が EAGAIN に設定され
     ます。通常、受信呼び出しは要求された量を受信するまで待たずに、要求された
     量を上限として得られたデータを返します。この動作は、 getsockopt(2) で解説
     されているソケットレベルのオプション SO_RCVLOWAT および SO_RCVTIMEO に
     よって影響を受けます。

     次のデータがいつ到着するかを判定するには select(2) 呼び出しを使うことがで
     きます。

     recv 呼び出しへの flags 引数は、次の値の 1 つまたは複数の論理和 (or) から
     成ります。

           MSG_OOB        プロセス帯域外データ
           MSG_PEEK       着信メッセージの覗き見 (peek)
           MSG_WAITALL    要求の完全な実行、またはエラーを待つ

     struct msghdr {
             caddr_t msg_name;       /* アドレス(オプション) */
             u_int   msg_namelen;    /* アドレスのサイズ */
             struct  iovec *msg_iov; /* スキャッタ/ギャザー配列 */
             u_int   msg_iovlen;     /* msg_iov の要素数 */
             caddr_t msg_control;    /* 補助データ、後述 */
             u_int   msg_controllen; /* 補助データのバッファ長 */
             int     msg_flags;      /* 受信されたメッセージ上のフラグ */
     };

     ここで msg_namemsg_namelen は、ソケットが接続されていない場合に、宛先
     アドレスを指定します。名前を要求しない場合や必要でない場合、 msg_name は
     NULL ポインタとして指定できます。 msg_iovmsg_iovlenread(2) で説明
     されているようにスキャッタ/ギャザーの場所を記述します。 msg_control は、
     長さが msg_controllen の、他のプロトコル制御に関連するメッセージまたはそ
     の他の各種補助データ用のバッファを指しています。メッセージは次の形式で
     す。

     struct cmsghdr {
             u_int   cmsg_len;       /* データバイトカウント、hdr を含む */
             int     cmsg_level;     /* メッセージを生成したプロトコル */
             int     cmsg_type;      /* プロトコルに固有のタイプ */
     /*      u_char  cmsg_data[]; が後に続く */
     };

     たとえば、これを使用して XNS/SPP においてデータストリームの変化を知ること
     ができます。また、ISO において accept() 呼び出しの直後に、データバッファ
     を伴わずに recvmsg を要求して、ユーザ接続要求データを得ることができるで
     しょう。

     オープンされたファイル記述子はこれで AF_UNIX ドメインソケット用の補助デー
     タとして引き渡され、その際、 cmsg_level が SOL_SOCKET に設定され、
     cmsg_type が SCM_RIGHTS に設定されます。

     SCM_CREDS の cmsg_type を使用して、プロセスの認証情報を AF_UNIX ドメイン
     ソケット用の補助データとして渡すこともできます。このケースでは、
     cmsg_data は、構造体 cmsgcred である必要があります。これは次のように
     <sys/socket.h> 内で定義されています。

     struct cmsgcred {
             pid_t   cmcred_pid;             /* 送信プロセスの PID */
             uid_t   cmcred_uid;             /* 送信プロセスの実 UID */
             uid_t   cmcred_euid;            /* 送信プロセスの実効 UID */
             gid_t   cmcred_gid;             /* 送信プロセスの実 GID */
             short   cmcred_ngroups;         /* グループの数 */
             gid_t   cmcred_groups[CMGROUP_MAX];     /* グループ */
     };

     カーネルは送信プロセスの認証情報を記入し、それを受信側へ配信します。

     msg_flags フィールドは受信済みメッセージに従って戻り時に設定されます。
     MSG_EOR は end-of-record、つまり返されたデータでレコードが完結しているこ
     [EBADF]            引数 s が有効な記述子ではありません。

     [ENOTCONN]         ソケットは接続指向プロトコルと結び付けられていますが、
                        接続されていません (connect(2)accept(2) を参照)。

     [ENOTSOCK]         引数 s はソケットを参照していません。

     [EAGAIN]           ソケットが非ブロッキングとマークされているとき、受信操
                        作でブロックしました。あるいは、受信タイムアウトが設定
                        されていて、データが受信される前にタイムアウトになりま
                        した。

     [EINTR]            データが受信可能になる前に、受信がシグナルによって割込
                        まれました。

     [EFAULT]           受信バッファポインタが、プロセスに割り当てられたアドレ
                        ス空間の範囲外を指しています。


関連項目

     fcntl(2), getsockopt(2), read(2), select(2), socket(2)


歴史

     recv() 関数は 4.2BSD で登場しました。

FreeBSD 4.4                    February 21, 1994                   FreeBSD 4.4

ABELNET VPSサービス