listen -
ソケット(socket)上の接続を待つ
#include <sys/types.h> /* 「注意」参照 */
#include <sys/socket.h>
int listen(int sockfd, int backlog);
listen() は
sockfd
が参照するソケットを接続待ちソケット
(passive socket)
として印をつける。
接続待ちソケットとは、
accept(2)
を使って到着した接続要求を受け付けるのに使用されるソケットである。
sockfd 引数は、
SOCK_STREAM
型か
SOCK_SEQPACKET
型のソケットを参照するファイルディスクリプターである。
backlog 引数は、
sockfd
についての保留中の接続のキューの最大長を指定する。
キューがいっぱいの状態で接続要求が到着すると、クライアントは
ECONNREFUSED
というエラーを受け取る。下位層のプロトコルが再送信をサポート
していれば、要求は無視され、これ以降の接続要求の再送信が成功するかもしれない。
成功した場合にはゼロが返される。エラー時には
-1 が返され、
errno
が適切に設定される。
- EADDRINUSE
- 別のソケットが既に同じポートを
listen している。
- EADDRINUSE
- (インターネットドメインソケットの場合)
sockfd
が参照するソケットがそれ以前にアドレスにバインドされておらず、
そのソケットに一時ポートをバインドしようとした際に、
一時ポートとして使用する範囲のポート番号がすべて使用中であった。
ip(7) の /proc/sys/net/ipv4/ip_local_port_range
の議論を参照のこと。
- EBADF
- 引数 sockfd
は有効なファイルディスクリプターでない。
- ENOTSOCK
- ファイルディスクリプター
sockfd
がソケットを参照していない。
- EOPNOTSUPP
- ソケットは listen()
がサポートしている型ではない。
POSIX.1-2001, POSIX.1-2008, SVr4, 4.4BSD (
listen() は 4.2BSD
で初めて実装された)
接続を受け付けるには、以下の処理が実行される。
POSIX.1 では
<sys/types.h>
のインクルードは必須とされておらず、
Linux
ではこのヘッダーファイルは必要ではない。
しかし、歴史的には、いくつかの実装
(BSD 系)
でこのヘッダーファイルが
必要であり、移植性が必要なアプリケーションではこのファイルを
インクルードするのが賢明であろう。
TCP ソケットでの
backlog
引数の振る舞いは Linux 2.2
で変更された。
現在ではこの引数は、
受け付けられるのを待っている、
完全に
確立されたソケットのキューの長さを指定する。
以前は不完全な接続要求の数であったが、これを置き換えた。
不完全なソケットのキューの最大長は
/proc/sys/net/ipv4/tcp_max_syn_backlog
を用いて設定できる。
syncookie
が有効になっている場合、
論理的な最大長は存在せず、この設定は無視される。
If the
backlog argument is greater than the value in
/proc/sys/net/core/somaxconn, then it is silently truncated to that
value. Since Linux 5.4, the default in this file is 4096; in earlier kernels,
the default value is 128. In kernels before 2.4.25, this limit was a hard
coded value,
SOMAXCONN, with the value 128.
bind(2) 参照。
accept(2),
bind(2),
connect(2),
socket(2),
socket(7)
この man ページは Linux
man-pages
プロジェクトのリリース
5.10
の一部である。プロジェクトの説明とバグ報告に関する情報は
https://www.kernel.org/doc/man-pages/
に書かれている。