LISTEN(2)

名称
listen - ソケット上の接続をリスンする

ライブラリ
libc

書式
<sys/types.h> <sys/socket.h> int listen(int s, int backlog)

解説
socket(2) で最初にソケットが作成され、 着信接続を受け入れる意思および着信接続用の待ち行列限界が listen() で指定された後、接続が accept(2) で受け入れられます。 listen() システムコールは、タイプが SOCK_STREAM または SOCK_SEQPACKET のソケットにだけ適用されます。

backlog 引数は、延期中の接続の待ち行列を伸ばす際の最大長を定義します。 待ち行列が満杯のときに接続要求が到着すると、クライアントは ECONNREFUSED を示すエラーを受信する可能性があります。 TCP の場合は、接続は黙って落とされます。

FreeBSD 4.5 以前で syncache が導入されるまでは、 backlog 引数は不完全な接続の待ち行列の長さも定義していました。 この待ち行列には、TCP の 3 ウェイハンドシェークを完了させるべく処理中の TCP ソケットが保持されています。 これらの不完全な接続は、現在すべて syncache に保持され、 これは待ち行列の長さに影響されません。 backlog 値を増やすことによりサービス不能攻撃に対処する必要は、もはやありません。

sysctl(3) MIB 変数 “kern.ipc.somaxconn” は backlog のハードリミットを指定します。 kern.ipc.somaxconn より大きい値、または 0 より小さい値が指定されている場合、 backlog の指定は無視されて kern.ipc.somaxconn の値にされます。

ACCEPT フィルタとの相互作用
ソケットに対して accept フィルタを使用すると、 接続済みであるものの accept フィルタの基準にまだ合致しないソケットを 保持するための第 2 の待ち行列が使用されます。 ひとたび基準に合致すれば、これらのソケットは接続完了済の待ち行列に移動され、 accept(2) の対象になります。 第 2 の待ち行列が満杯のときに新規接続が到着すると、 accept フィルタの基準にまだ合致しない最古のソケットが終了されます。

この第 2 の待ち行列は、第 1 の listen 待ち行列のように、 backlog 引数に従って大きさが変わります。

戻り値

エラー
listen() システムコールは次の場合に処理を失敗します:

[EBADF]
    引数 s が有効な記述子ではありません。

[EINVAL]
    そのソケットはすでに接続されているか、接続確立中です。

[ENOTSOCK]
    引数 s がソケットではありません。

[EOPNOTSUPP]
    ソケットが、 listen() をサポートするタイプではありません。

関連項目
accept(2), connect(2), socket(2), sysctl(3), sysctl(8), accept_filter(9)

歴史
listen() システムコールは 4.2BSD で登場しました。 実行時に最大 backlog を設定できる機能、および許容できる最大値を指定する場合に負の backlog を使用する機能は FreeBSD 2.2 で登場しました。