LISTEN(2) FreeBSD システムコールマニュアル LISTEN(2)
名称
listen − ソケット上の接続をリスンする |
ライブラリ
標準 C ライブラリ (libc, −lc) |
書式
#include <sys/types.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() は、処理が成功すると値 0 を返します。そうでない場合、値 -1 が返され、グローバル変数 errno が設定されてエラーを示します。 |
エラー
listen() システムコールは次の場合に処理を失敗します: |
[EBADF]
引数 s が有効な記述子ではありません。 [EINVAL] [ENOTSOCK] [EOPNOTSUPP] 関連項目 |
accept(2), connect(2), socket(2), sysctl(3), sysctl(8), accept_filter(9) |
歴史
listen() システムコールは 4.2BSD で登場しました。実行時に最大 backlog を 設定できる機能、および許容できる最大値を指定する場合に負の backlog を使用 する機能は FreeBSD 2.2 で登場しました。 FreeBSD 10.0 May 8, 2002 FreeBSD 10.0 |