RECV(2) — NEWS-OS Programmer’s Manual
名称
recv, recvfrom, recvmsg − ソケットからメッセージを受け取る
形式
#include <sys/types.h>
#include <sys/socket.h>
cc = recv(s, buf, len, flags)
int cc, s;
char ∗buf;
int len, flags;
cc = recvfrom(s, buf, len, flags, from, fromlen)
int cc, s;
char ∗buf;
int len, flags;
struct sockaddr ∗from;
int ∗fromlen;
cc = recvmsg(s, msg, flags)
int cc, s;
struct msghdr msg[];
int flags;
解説
recv、 および recvfrom、 recvmsg は、ソケットからメッセージを受け取るために使用されます。
recv コールは、 通常、 connect されたソケット (connect(2) 参照)だけに対して使用されます。 一方、 recvfrom と recvmsg は、 ソケットが connect された状態にあるなしにかかわらず、ソケットのデータを 受け取るために使用することができます。
from がゼロ以外である場合には、メッセージのソースアドレスが満たされます。 fromlen は、そこに値が返される、 from に関するバッファのサイズに初期設定され、リターン時に、そのバッファへ収められた アドレスの実際の長さを示すように修正されます。メッセージの長さは cc 内へ返されます。 メッセージが長すぎて与えられたバッファに収まらない場合には、 メッセージが受け取られるソケットのタイプ (socket(2) 参照)によっては、 過剰なバイトが切り捨てられることもあります。
ソケットに受信できるメッセージがない場合には、 そのソケットが非ブロッキングでない限り (ioctl(2) 参照)、 コールはメッセージが到着するのを 待ちます。 そのソケットが非ブロッキングであると、 cc には −1 が返され、 外部変数 errno が EWOULDBLOCK にセットされます。
select(2) コールを使用すると、ソケットの状態を判定することができます。
recv コールへの flags 引数は、次の値の 1つ以上の 論理和 をとることによって作られます。
#defineMSG_OOB0x1/∗ process out-of-band data ∗/
#defineMSG_PEEK0x2/∗ peek at incoming message ∗/
recvmsg コールは、直接与えられるパラメタの数を最小限にとどめるために、 msghdr 構造体を使用しています。この構造体は、次の形式で、 <sys/socket.h> の中で定義されています。
struct msghdr {
caddr_tmsg_name;/∗ optional address ∗/
intmsg_namelen;/∗ size of address ∗/
structiovec ∗msg_iov;/∗ scatter/gather array ∗/
intmsg_iovlen;/∗ # elements in msg_iov ∗/
caddr_tmsg_accrights;/∗ access rights sent/received ∗/
intmsg_accrightslen;
};
ここで、 msg_name と msg_namelen は、 ソケットが connect されていない場合にデスティネーションのアドレスを 指定します。これが要らない場合には、 msg_name はナルポインタとして与えることができます。 msg_iov と msg_iovlen は、 read(2) で述べられている、入力の分散に使用されるエントリです。 メッセージと共に送られてくるアクセス権を受け取るためのバッファは、 msg_accrights 内で指定されます。 このバッファの長さは、 msg_accrightslen になります。アクセス権は、現在のところ、ファイルディスクリプタだけに 制限されていて、それらの各々は int のサイズを占めます。
リターン値
これらのコールは、受け取ったバイトの数を返しますが、 エラーが発生した場合には −1 を返します。
エラー
次の場合には、コールは失敗します。
[EBADF] 引数 s が有効なディスクリプタではない。
[ENOTSOCK] 引数 s がソケットではない。
[EWOULDBLOCK] ソケットが非ブロッキングとしてマークされていて、 受信処理がブロックする可能性がある。
[EINTR] データが受け取れるようになる前に、 受信がシグナルによって割り込まれた。
[EFAULT] データが、 プロセスのアドレススペースの存在していないまたは保護されている部分へ 受け取られるように指定された。
関連事項
fcntl(2), read(2), send(2), select(2), getsockopt(2), socket(2)
NEWS-OSRelease 4.1C