Definition
用來通知OS/network socketfd的socket已經可以接受建立連線。Listen()並未開始接收連線,只是設置socket為listen模式,真正接收client端連線的是accept()。通常listen()會在socket(),bind()之後調用,接着才調用accept()。listen()並不會block住等待client的request。
#include <sys/socket.h>
Prototype
int listen(int socketfd, int backlog);
Arguments
- sockfd - socket的描述符
- backlog - 同時能處理的最大連接要求,如果連接數目達此上限則client端將收到ECONNREFUSED的錯誤,listen()只適用SOCK_STREAM或SOCK_SEQPACKET的socket類型。如果socket為AF_INET則參數backlog最大值可設至128。
Return value
- 0表示綁定成功
- -1則表失敗
error message
EBADF:參數sockfd非合法socket處理代碼
EACCESS:權限不足
EOPNOTSUPP:指定的socket並未支援listen模式。
補充
Linux系統可限制在佇列裏的數量,在未真正完成連接前,可接受的等待連接要求的數量。內核要維護兩個佇列:已完成連接佇列和未完成連接佇列。未完成佇列中存放的是TCP連接的三路握手未完成的連接,accept函數是從以連接佇列中取連接返回給進程;當以連接佇列為空時,進程將進入睡眠狀態。
但是man listen裏有句話
NOTES
The behaviour of the backlog parameter on TCP sockets changed with
Linux 2.2. Now it specifies the queue length for completely estab-
lished sockets waiting to be accepted, instead of the number of incom-
plete connection requests. The maximum length of the queue for incom-
plete sockets can be set using the tcp_max_syn_backlog sysctl. When
syncookies are enabled there is no logical maximum length and this
sysctl setting is ignored. See tcp(7) for more information.
沒有留言:
張貼留言