在調用socket的時候,我們會使用到listen()函數,里面有個參數叫backlog, 例如:socket.listen(5). 那么這個數字5到底代表什么意思呢?
解答
下面使用具體的代碼片段來講解:
- 這是一個電腦本機模擬客服端及服務端的程序,主要功能是建立socket連接后,客戶端輸入關鍵字查詢對應的段子,服務器端返回結果。
- 服務器可以滿足同時服務兩個客戶的查詢操作
- 此程序中還包含了信號量和多線程
以listen(1),參數設置為1進行講解,是不是將參數設置為1后,開啟3個客服連接就會報錯呢?
並不是!如下圖所示:
那么問題來了!
問題1:
如上例代碼中,有listen(1),這個1是指什么?只能與1個socket建立鏈接嗎? 為什么我用上面的代碼可以創建大於1個的tcp連接卻沒報錯,如果用網上其他人的說法理論上大於1個連接應該報錯的!
因為:listen(n)傳入的值, n表示的是服務器拒絕(超過限制數量的)連接之前,操作系統可以掛起的最大連接數量。n也可以看作是"排隊的數量"
問題2:
既然沒有報錯,為什么沒有打印用戶3的地址?
因為:服務器正在處理用戶1和用戶2,沒有空閑去接待用戶3,所以用戶3去排隊了。
問題3:
為什么服務器能同時處理用戶1和用戶2?
因為:
這里用到了多線程和信號量,信號量設置為2,也就是允許並發數為2,服務器開啟了兩個線程,能同時分別處理用戶1和用戶2。
總結
socket.listen(n)
簡單來說,這里的nt表示socket的”排隊個數“
一般情況下,一個進程只有一個主線程(也就是單線程),那么socket允許的最大連接數為: n + 1
如果服務器是多線程,比如上面的代碼例子是開了2個線程,那么socket允許的最大連接數就是: n + 2
換句話說:排隊的人數(就是那個n) + 正在就餐的人數(服務器正在處理的socket連接數) = 允許接待的總人數(socket允許的最大連接數)