EN JA
ACCEPT(2)
ACCEPT(2) FreeBSD System Calls Manual ACCEPT(2)

名称

acceptソケットで接続を受け付ける

ライブラリ

Standard C Library (libc, -lc)

書式

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

int
accept( int s, struct sockaddr * restrict addr, socklen_t * restrict addrlen);

int
accept4( int s, struct sockaddr * restrict addr, socklen_t * restrict addrlen, int flags);

解説

引数 s は、 socket(2) で作成されたソケットで、 bind(2) でアドレスにバインドされ、 listen(2) の後に接続を listen (接続を受け付け) しています。 accept() システムコールは、保留中の接続のキューで最初の接続要求を抽出し、新しいソケットを作成し、 O_NONBLOCKO_ASYNC プロパティの状態とオリジナルのソケット s からの SIGIOSIGURG シグナルの宛先を継承するソケットのための新しいファイル記述子を割り付けます。

accept4() システムコールも似ていますが、新しいソケットの O_NONBLOCK プロパティは、代りに、 flags 引数の SOCK_NONBLOCK フラグによって決定され、 O_ASYNC プロパティは、クリアされ、シグナルの宛先は、クリアされ、新しいファイル記述子の close-on-exec フラグを flags 引数の SOCK_CLOEXEC フラグによって設定することができます。

保留中の接続がキューに存在せず、オリジナルのソケットが非ブロッキングとマークされていないなら、 accept() は、接続が完成するまで、呼び出し側をブロックします。オリジナルのソケットが非ブロッキングとマークされ、保留中の接続がキューに存在しないなら、 accept() は、下記に記述されているようにエラーを返します。受け付けられたソケットは、より多くの接続を受け付けるためには使用されません。オリジナルのソケット s は、オープンしたままです。

引数 addr は、通信レイヤ (層) に知られている、接続している実体 (entity) のアドレスで埋められる結果の引数です。 addr 引数の正確な形式は、通信が生じているドメインによって決定されます。アドレス情報が要求されていないなら、NULL ポインタが、 addr のために指定されます。この場合、 addrlen は、使用されず、また、NULL であるべきです。そうでなければ、 addrlen 引数は、値と結果 (value-result) の引数です。最初に addr によって指される空間の合計を含んでいるべきです。返り時に、返されるアドレスの実際の長さ (バイト単位で) を含んでいます。この呼び出しは、現在 SOCK_STREAM とともに接続に基づいたソケットタイプで使用されます。

読み込みのためにそれを選択することによって、 accept() を行う目的のためのソケットを select(2) することができます。

ISO または DATAKIT のような明白な確認を要求する特定のプロトコルに関して、 accept() は、次の接続要求のキューをただ解除し、確認の意味がないと考えることができます。確認は、新しいファイル記述子で通常の読み込みまたは書き込みによって、意味をなし、拒絶は、新しいソケットをクローズすることによって、意味をなします。

いくつかのアプリケーションについて、着信接続を前処理 (pre-process) するために accept_filter(9) を使用することによって性能が増強されます。

accept() を使用するとき、 O_NONBLOCKO_ASYNC プロパティと継承されているシグナルの宛先に依存するべきではありませんが、明示的に fcntl(2) を使用して、それらを設定するべきです。 accept4() は、一貫して、これらのプロパティを設定しますが、 UNIX プラットフォームに渡って完全に移植性があるこは限りません。

戻り値

これらの呼び出しは、エラーのとき、-1 を返します。成功するなら、それらは、受け付けされたソケットのための記述子である負でない整数を返します。

エラー

accept() と accept4() システムコールは、次の場合に失敗します:
[ EBADF]
記述子が無効です。
[ EINTR]
accept() 操作が割り込まれました。
[ EMFILE]
プロセスごとの記述子のテーブルが満杯です。
[ ENFILE]
システムファイルテーブルが満杯です。
[ ENOTSOCK]
ファイルを参照している記述子が、ソケットではありません。
[ EINVAL]
listen(2) がソケット記述子で呼び出されていません。
[ EFAULT]
addr 引数がユーザアドレス空間の書み込み可能な部分ではありません。
[ EWOULDBLOCK]
ソケットが非ブロッキングとマークされ、受け付けられる接続が、存在しません。
[ ECONNABORTED]
接続が到着しましたが、listen (接続を受け付け) するキューで待っている間にクローズされました。

また、 accept4() システムコールは、次の場合に失敗します:

[ EINVAL]
flags 引数が不正です。

歴史

accept() システムコールは、 4.2BSD で登場しました。

accept4() システムコールは、 FreeBSD 10.0 で登場しました。

October 1, 2013 FreeBSD