other versions
other languages
other sections
ACCEPT(2) | Linux Programmer's Manual | ACCEPT(2) |
名前¶
accept - ソケットへの接続を受ける書式¶
#include <sys/types.h> /* 「注意」参照 */ #include <sys/socket.h> int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen); #define _GNU_SOURCE /* feature_test_macros(7) 参照 */ #include <sys/socket.h> int accept4(int sockfd, struct sockaddr *addr, socklen_t *addrlen, int flags);
説明¶
accept() システムコールは、接続指向のソケット型 ( SOCK_STREAM, SOCK_SEQPACKET) で用いられる。 この関数は、接続待ちソケット socket 宛ての保留状態の接続要求が入っているキューから 先頭の接続要求を取り出し、接続済みソケットを新規に生成し、 そのソケットを参照する新しいファイル・ディスクリプタを返す。 新規に生成されたソケットは、接続待ち (listen) 状態ではない。 もともとのソケット sockfd はこの呼び出しによって影響を受けない。 引き数 sockfd は、 socket(2) によって生成され、 bind(2) によってローカルアドレスにバインドされ、 listen(2) を経て接続を待っているソケットである。- SOCK_NONBLOCK
- 新しく生成されるオープンファイル記述 (open file description) の O_NONBLOCK ファイルステータスフラグをセットする。 このフラグを使うことで、 O_NONBLOCK をセットするために fcntl(2) を追加で呼び出す必要がなくなる。
- SOCK_CLOEXEC
- 新しいファイルディスクリプタに対して close-on-exec ( FD_CLOEXEC) フラグをセットする。 このフラグが役に立つ理由については、 open(2) の O_CLOEXEC フラグの説明を参照のこと。
返り値¶
成功した場合、これらのシステムコールは 受け付けたソケットのディスクリプタである非負の整数値を返す。 エラーが発生した場合は -1 を返し、 errno を適切に設定する。エラー処理¶
Linux の accept() (と accept4()) は、新しいソケットにおける、発生済みのネットワークエラーを accept() からのエラーコードとして渡す。 この振舞いは BSD ソケットの実装とは異なる。 信頼性の高い動作を行うためには、 アプリケーションはプロトコルで定義されているネットワークエラーの検知を accept() のあとに行い、それらのエラーを EAGAIN と同じように扱い、再試行 (retry) を行うべきである。 TCP/IP では、以下のエラーが該当する: ENETDOWN, EPROTO, ENOPROTOOPT, EHOSTDOWN, ENONET, EHOSTUNREACH, EOPNOTSUPP, ENETUNREACHエラー¶
- EAGAIN または EWOULDBLOCK
- ソケットが非停止になっていて、 かつ受付け対象の接続が存在しない。 POSIX.1-2001 は、この場合にどちらのエラーを返すことも認めており、 これら 2 つの定数が同じ値を持つことも求めていない。 したがって、移植性が必要なアプリケーションでは、両方の可能性を 確認すべきである。
- EBADF
- ディスクリプタが不正。
- ECONNABORTED
- 接続が中止された。
- EFAULT
- addr 引き数がユーザアドレス空間の書き込み可能領域にない。
- EINTR
- 有効な接続が到着する前に捕捉されたシグナルによって システムコールが中断された。 signal(7) 参照。
- EINVAL
- ソケットが接続待ち状態ではない。もしくは、 addrlen が不正である (例えば、負の場合など)。
- EINVAL
- (accept4()) flags に不正な値が指定されている。
- EMFILE
- 1プロセスがオープンできるファイル・ディスクリプタ数の上限に達した。
- ENFILE
- オープンされたファイルの総数がシステム全体の上限に達していた。
- ENOBUFS, ENOMEM
- メモリが足りない。 多くの場合は、システムメモリが足りないわけではなく、 ソケットバッファの大きさによるメモリ割り当ての制限である。
- ENOTSOCK
- ディスクリプタはソケットではなくファイルを参照している。
- EOPNOTSUPP
- 参照しているソケットの型が SOCK_STREAM でない。
- EPROTO
- プロトコル・エラー。
- EPERM
- ファイアウォールのルールにより接続が禁止された。
バージョン¶
accept4() システムコールは Linux 2.6.28 以降で利用可能である。 glibc でのサポートはバージョン 2.10 以降で利用可能である。準拠¶
accept(): POSIX.1-2001, SVr4, 4.4BSD, (accept() は 4.2BSD で初めて実装された).注意¶
POSIX.1-2001 では <sys/types.h> のインクルードは必須とされておらず、 Linux ではこのヘッダファイルは必要ではない。 しかし、歴史的には、いくつかの実装 (BSD 系) でこのヘッダファイルが 必要であり、移植性が必要なアプリケーションではこのファイルを インクルードするのが賢明であろう。socklen_t 型¶
accept() の第 3 引き数は、もともと int * と宣言されていた (libc4 や libc5, 4.x BSD, SunOS 4, SGI など多くのシステムではそうなっている)。 POSIX.1g draft 標準は、 これを size_t * に変更しようとし、SunOS 5 ではそう宣言されている。 後に POSIX drafts には socklen_t * が含まれるようになり、 Single UNIX Specification や glibc2 ではこのように宣言されるようになった。 Linus Torvald の発言を引用する:例¶
bind(2) 参照。関連項目¶
bind(2), connect(2), listen(2), select(2), socket(2), socket(7)この文書について¶
この man ページは Linux man-pages プロジェクトのリリース 3.41 の一部 である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。2010-09-10 | Linux |