スポンサーリンク

LISTEN(2) FreeBSD システムコールマニュアル LISTEN(2)

名称

listen − ソケット上の接続をリスンする

ライブラリ

標準 C ライブラリ (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 引数は、延期中の接続の待ち行列を伸ばす際の最大長を定義します。待 ち行列が満杯のときに接続要求が到着すると、クライアントは 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]
引数 s がソケットではありません。

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

関連項目

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

スポンサーリンク