2009-01-22 58 views
3

假設一個監聽套接字在本地主機:80和一個客戶端連接使用:telnet localhost 80未接受連接會發生什麼?

問題是,我只想接受有限數量的併發客戶端,假設只有一個。 之後,我根本不接受任何。

我看到使用的問題:netstat -a是下一個客戶端連接已建立。是的,我不處理它,但是在系統級別,它顯示爲ESTABLISHED,客戶端可以發送數據並可能給系統帶來額外的開銷。

我看到的唯一方法是繼續接受客戶端,但斷開連接。 我對不對?

回答

4

listen()函數具有backlog參數,該參數指定允許在操作系統內核中等待服務器等待的服務器數量爲多少個未完成的套接字。

在我的Linux系統上,listen()的手冊頁說大多數時候客戶端都會得到connection refused錯誤 - 就像套接字根本沒有在聽。

如果您只想處理一個連接,那也沒關係,你可以這樣做:

listen(s, 0); 
while ((new_fd = accept(s)) >= 0) { 
    process(new_fd); 
} 

,如果你想處理一個以上這將是稍硬。您不能僅將backlog參數設置爲併發連接數,因爲該參數未考慮已連接的連接數。

1

如果您停止在該端口上收聽,則不應允許任何更多傳入連接。確保監聽器在接受第一個連接後關閉。

另外兩個選項:

使用原始套接字(如果您的操作系統支持它們)。並手動處理TCP連接。這將涉及很多額外的代碼和處理。

使用UDP。他們是無狀態的連接,但你必須接受/拒絕基於其他東西的數據包。這雖然沒有TCP連接的開銷。你也將無法使用諸如telnet之類的東西進行測試。

+0

這樣做,但它會達到性能,因爲每當併發客戶端數量超過閾值時我們將開始/停止監聽。 – Arthur 2009-01-22 00:10:26

0

當您不希望接受更多連接並在您希望接受連接時再打開它時,您應該簡單地關閉監聽套接字。 Listen backlog不會幫助你,因爲它僅僅是TCP/IP協議棧已經接受但是應用程序尚未接受的'半開'連接。

相關問題