2008年8月7日 星期四

SOCKET listen() 函式

Listen函式

#include <sys/socket.h>

int listen(int socketfd,int backlog);

函式說明:listen()用來通知OS/network socketfdsocket已經可以接受建立連線。參數backlog指定同時能處理的最大連接要求,如果連接數目達此上限則client端將收到ECONNREFUSED的錯誤。Listen()未開始接收連線,只是設置socketlisten模式,真正接收client端連線的是accept()。通常listen()會在socket()bind()之後調用,接着才調用accept()。listen()並不會block住等待client的request。

回傳值

成功傳回0,錯誤傳回-1,再由errno判斷錯誤情況

errno

EBADF:參數sockfd非合法socket處理代碼

EACCESS:權限不足

EOPNOTSUPP指定的socket未支援listen模式。

參數:

參數1socketfdsocket()回傳之socket descriptor

參數2backlog還未完成連線請求的最大數量。

listen()只適用SOCK_STREAMSOCK_SEQPACKETsocket類型。如果socketAF_INET則參數backlog最大值可設至128


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.

  1. Synchronous:表示有一個thread處於blocked狀態專門負責等待網絡事件的到來 (including blocking,select, poll, WSAAsyncSelect, WSAEventSelect, Overlapped with Event Notification, Completion Port); WSAAsyncSelect 其實比較特殊,用户本身不用專門創建一個thread來等待,但是Windows窗口本身有一個消息循環,在等待網絡事件的時候,這個消息循環實際上幫助實現了 blocked thread的工作,所以還是把它放在這個類別下。

  2. Asynchronous:表示只是提供一個callback function,issue 網絡動作後,不需要專門的thread進行等待,網絡事件發生後,kernel會自動調用callback function (including signal-driven I/O, Asynchronous I/O,Overlapped with Completion Routine)。

沒有留言:

一個小故事讓我們明白資金流通的意義

“又是炎熱小鎮慵懶的一天。太陽高掛,街道無人,每個人都債台高築,靠信用度日。這時,從外地來了一位有錢的旅客,他進了一家旅館,拿出一張1000 元鈔票放在櫃檯,說想先看看房間,挑一間合適的過夜,就在此人上樓的時候---- 店主抓了這張1000 元鈔,跑到隔壁屠戶那裡支付了他欠的肉錢...