2021年6月18日 星期五

【SOCKET】Listen函式

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.

沒有留言:

張貼留言