ACCEPT(2)

名前
accept - ソケット(socket)への接続を受け付ける(accept)

書式
#include <sys/types.h>

#include <sys/socket.h>

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

説明
引き数 s は、 socket(2) によって生成されたソケットで、 bind(2) によってアドレスに結び付け(bind)られる。 また、 listen(2) を発行した後に接続を待つ(listen)ようになる。 accept 関数は、保留となっている接続要求のキュー(queue)から最初の接続要求を取り出し、 s と同じ属性を持ったソケットを新規に生成して、このソケットに新しい ファイル・ディスクリプター(file descriptor)を割り当てる。 キューに保留となっている接続要求がなく、非ブロック(non-blocking) 化されていない場合、 accept は接続が発生するまで呼び出し元をブロックする。 ソケットが非ブロック化されていて、保留中の 接続要求がキューに無い場合、 accept は下記に示すようなエラーを返す。受け付けたソケットは それ以上の接続要求を受け入れることは許されない。 元のソケット s はオープンしたままとなる。 引き数 addr は、通信層(communication layer)としても知られているように、 接続実体のアドレスが入っている結果用引き数である。 addr 引き数の正確なフォーマットは通信が行われているドメインによって 決定される。 addrlen は、値・結果両用引き数(value-result parameter)である。初期状態では、 addr によって指される領域の大きさが入っている。 リターン時には、返されたアドレスの実際の長さ(byte単位)が入る。 この呼び出しは、接続指向(connection-based)のソケット型 において使用される。現在では、 SOCK_STREAM とともに使用される。 accept を使用する目的で、ソケットを読み取り用として選択 select(2) することが可能である。 ISO や DATAKIT のように、明示的な接続確認(confirmation)を要求するようなプロトコルにおいては、 accept で行う処理は、単に次の接続要求をキューから取り出す(dequeue)だけで、 そこに接続確認は含まれない。接続確認は、新規のファイル・ディスクリプター 上での通常の読み取り、書き込みの際に行われる。 接続拒否(rejection)は新規ファイル・ディスクリプターを閉じることによって 行われる。 msg_iovlen を0、 msg_controllen を非0に設定して recvmsg(2) コールを発行するか、 getsockopt(2) を発行することによって、 接続を認証せずにユーザ接続要求データを取得することができる。 同様に、 コントロール情報のみを与えて sendmsg(2) を呼び出すか、 setsockopt(2) を呼び出すことによってユーザ接続拒否情報を提供することができる。

返り値
このコールはエラー時に -1を返す。成功した時は受け付けられた ソケットのディスクリプターである非負の整数値を返す。

エラー
BSD のman pageでは以下に示す 5 つのエラーを返すことができる。

EBADF
    ディスクリプターが無効である。

ENOTSOCK
    ディスクリプターはソケットではなくファイルを参照している。

EOPNOTSUPP
    参照しているソケットの型が SOCK_STREAM ではない。

EFAULT
    addr 引き数がユーザアドレス空間の書き込み可能領域を参照していない。

EWOULDBLOCK
    ソケットは非ブロック化されていて、受け付ける接続要求がない。

この他に、多くのLinuxカーネルでは以下に示すようなエラーを返すことができる。 EMFILE, EINVAL, ENOSR, ENOBUFS, EAGAIN, EPERM, ECONNABORTED, ESOCKTNOSUPPORT, EPROTONOSUPPORT, ETIMEDOUT, ERESTARTSYS.

準拠
SVr4, 4.4BSD ( accept 関数はBSD 4.2で初めて実装された)。 IRIX では EMFILE と ENFILE が追加エラーとして記述されている。 Solaris では EINTR, ENODEV, ENOMEM, ENOSR, EPROTO が追加エラーとして 記述されている。

関連項目
bind(2), connect(2), listen(2), select(2), socket(2)