EN JA
LISTEN(2)
LISTEN(2) FreeBSD System Calls Manual LISTEN(2)

名称

listenソケット上の接続を listen (接続を受け付け) する

ライブラリ

Standard C Library (libc, -lc)

書式

#include < sys/types.h>
#include < sys/socket.h>

int
listen( int s, int backlog);

解説

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.0kern.ipc.soacceptqueue に置き換えられました。オリジナルの sysctl(3) kern.ipc.somaxconn は、まだ利用可能ですが、既存のアプリケーションとスクリプトが動作し続けることができるように、 sysctl(3) -a の出力から隠されます。
October 20, 2012 FreeBSD