LISTEN(2) | FreeBSD System Calls Manual | LISTEN(2) |
名称
listen — ソケット上の接続を listen (接続を受け付け) するライブラリ
Standard C Library (libc, -lc)解説
socket(2) で最初にソケットが作成され、着信接続を受け入れる意思および着信接続用のキュー限界が listen() で指定された後、接続が accept(2) で受け入れられます。 listen() システムコールは、タイプが SOCK_STREAM または SOCK_SEQPACKET のソケットにだけ適用されます。backlog 引数は、延期中の接続のキューを伸ばす際の最大長を定義します。実際の最大のキューの長さは、 backlog 引数で指定された値の 1.5 倍となります。その後の、 listen (接続を受け付ける) するソケットで listen() システムコールによって呼び出し側は、新しい backlog 引数を使用して最大のキューの長さを変更することができます。キューが満杯のときに接続要求が到着すると、クライアントは ECONNREFUSED を示すエラーを受信する可能性があります。 TCP の場合は、接続は黙って落とされます。
listen (接続を受け付け) ソケットの現在のキューの長さは netstat(1) コマンドを使用して問い合わせすることができます。
FreeBSD 4.5 以前で syncache が導入されるまでは、 backlog 引数は不完全な接続のキューの長さも定義していました。このキューには、TCP の 3 ウェイハンドシェークを完了させるべく処理中の TCP ソケットが保持されています。これらの不完全な接続は、現在すべて syncache に保持され、これはキューの長さに影響されません。 backlog 値を増やすことによりサービス不能攻撃に対処する必要は、もはやありません。
sysctl(3) MIB 変数 kern.ipc.soacceptqueue は、 backlog のハードリミットを指定します。 kern.ipc.soacceptqueue より大きい値、または 0 より小さい値が指定されているなら、 backlog は、黙って強制的に kern.ipc.soacceptqueue となります。
ACCEPT フィルタとの相互作用
ソケットに対して accept フィルタを使用すると、接続済みであるものの accept フィルタの基準にまだ合致しないソケットを保持するための第 2 のキューが使用されます。ひとたび基準に合致すれば、これらのソケットは接続完了済のキューに移動され、 accept(2) の対象になります。第 2 のキューが満杯のときに新規接続が到着すると、 accept フィルタの基準にまだ合致しない最古のソケットが終了されます。この第 2 のキューは、第 1 の listen (接続を受け付け) キューのように、 backlog 引数に従って大きさが変わります。
戻り値
The listen() function returns the value 0 if successful; otherwise the value -1 is returned and the global variable errno is set to indicate the error.エラー
listen() システムコールは次の場合に処理を失敗します:- [ EBADF]
- 引数 s が有効な記述子ではありません。
- [ EINVAL]
- そのソケットはすでに接続されているか、接続確立中です。
- [ ENOTSOCK]
- 引数 s がソケットではありません。
- [ EOPNOTSUPP]
- ソケットが、 listen() をサポートするタイプではありません。
歴史
listen() システムコールは、 4.2BSD で登場しました。実行時に最大 backlog を設定できる機能、および許容できる最大値を指定する場合に負の backlog を使用する機能は、 FreeBSD 2.2 で登場しました。 kern.ipc.somaxconn sysctl(3) は、その実際の機能に関するの混乱を防ぐために FreeBSD 10.0 の kern.ipc.soacceptqueue に置き換えられました。オリジナルの sysctl(3) kern.ipc.somaxconn は、まだ利用可能ですが、既存のアプリケーションとスクリプトが動作し続けることができるように、 sysctl(3) -a の出力から隠されます。October 20, 2012 | FreeBSD |