2011-03-25 95 views
0

多線程TCP服務器中監聽隊列(監聽調用中的第二個參數)的意義是什麼?多線程TCP服務器的監聽隊列

這有點令人困惑,因爲當我們有多個線程來處理不同的客戶端時,爲什麼我們需要一個隊列呢?

回答

1

從MSDN:http://msdn.microsoft.com/en-us/library/ms739168(v=vs.85).aspx

一種用於SOMAXCONN積壓值是指示負責套接字s的基礎服務提供給設置掛起到最大合理值連接的隊列的長度的特殊恆定。

在Windows套接字2上,此最大值默認爲較大值(通常爲幾百或更多)。在藍牙應用程序中調用listen函數時,強烈建議將backlog參數(通常爲2至4)的值用得更低,因爲只有少數客戶端連接被接受。這會減少分配給偵聽套接字使用的系統資源。同樣的建議適用於只有少數客戶端連接的其他網絡應用程序。

監聽功能通常由一次可以有多個連接請求的服務器使用。如果連接請求到達並且隊列已滿,則客戶端將收到錯誤並顯示WSAECONNREFUSED。

由於此隊列位於應用程序空間之外,即OS和應用程序之間,TCP服務器是多線程的事實並不相關。

0

瞭解這個概念;請考慮以下示例:

您知道TCP執行三方握手進行連接。當遠程客戶端連接到您的TCP服務器時,它發送SYN數據包,並且您的服務器使用SYN-ACK數據包進行回覆,然後該遠程客戶端再次發送ACK數據包,然後建立連接。因此,您的應用程序在完全建立時即可獲得連接。 因此,直到您的連接完成了一半(我的意思是您已經從遠程客戶端收到SYN,並且您已發送SYN-ACK並且您正在等待最後的ACK),那麼您的應用程序將不會接受連接。因此,可能有許多遠程客戶端嘗試連接到您的服務器,並且您的監聽隊列中可能會有很多半連接的連接。

我希望它解釋了監聽隊列。

+0

謝謝拉爾夫和Tayyab ... – footloose 2011-03-27 21:07:03

+0

如果我錯了,糾正我。 (示例)如果我有一個5的偵聽隊列,並且有9個客戶端試圖連接(併發)到服務器,則4個將被拒絕。所以,這個隊列指定了多少監聽操作可以排隊。線程的數量與這個隊列無關。 – footloose 2011-03-27 21:16:41

+0

是的你是對的。如果您的隊列限制爲5,並且在服務器端有5個或更多連接正在進行握手,則下一次連接將被拒絕。線程數量僅在應用程序級別上,而此隊列在TCP驅動程序中。隊列函數在應用程序/線程開始知道該傳入連接之前進行。 – Tayyab 2011-03-31 11:40:28