2016-04-28 33 views
1

我正在研究TCP/IP項目(服務器和許多客戶端)。我用C完全編寫了代碼。我觀察到,無論何時一個新的客戶端連接到服務器,函數accept()都會爲該特定連接返回一個數字。重新分配C連接值的TCP/IP

newton = accept(mysocket, (struct sockaddr *)&dest, &socksize) 

在上面的代碼newcon爲不同的客戶端不同。每當客戶端斷開連接時,分配給該斷開連接的客戶端的連接號碼就會消失。這個號碼根本不會被分配給另一個客戶端。如果服務器有許多用戶,則客戶端連接並斷開很多次。所以數量繼續增加(從0到更大的數字)。如果服務器連接了數百萬個客戶端,我應該如何處理這個問題?有什麼方法可以重新使用連接號碼嗎?

+2

'這個號碼根本不會被分配給另一個客戶端.'錯誤。accept()系統調用返回新連接的最低可用文件描述符。所以fd(數字)被回收。 – joop

回答

4

您誤解了accept的返回值。它不是多個連接,而是一個套接字描述符。 (這恰好是* nix平臺上的文件描述符,它是整數)。

如果先前分配的某個套接字已關閉,則可以再次返回相同的編號 - 因此,爲了保持您的可擴展性,請確保在不再需要時關閉套接字 - 這是一件正確的事情無論如何。

+1

我知道這不是連接的數量。每當新客戶端連接到服務器時,我都會獲得新的價值。我得到的每一個數字都不是一個小於該數字的以前的數字。問題可能不是關閉斷開連接的客戶端。謝謝 – sandesh

-1

accept返回描述符。你可以實現一個數據結構,在那裏你可以存儲描述符並操縱它們。但這取決於用例和實現,以及你將如何處理它們。

1

測試它。

創建一個整數數組,比如10000個大小。當您接受連接時,將返回的fd值推入該數組中。然後在最後對數組進行排序並查找重複項。正如其他人所暗指的,您應該看到重複的內容。

+1

好想法測試。 – sandesh

0

TCP連接的服務器端實現旨在支持多個併發連接。這種行爲是通過使用accept()系統調用來實現的,該調用通過服務器套接字作爲參數進行調用。當一個新的連接請求到達時,系統創建一個新的套接字來處理這個新的連接,這個套接字描述符由accept系統調用返回。隨後,使用由accept返回的此套接字描述符處理此新連接上的通信。當與客戶端的通信完成時,連接關閉,並且此套接字描述符返回給系統。系統可以再次使用相同的描述符來再次處理新的客戶端請求。

應該注意的是,一旦連接關閉,在某些情況下,連接將移至TIME_WAIT狀態,並且當連接狀態爲TIME_WAIT時,套接字不會重新使用。在TIME_WAIT狀態後,套接字變爲空閒狀態。所以這是很有可能的,當一個連接被假定爲關閉時,它實際上可能處於TIME_WAIT狀態。這可以使用'netstat -anp'命令進行驗證。

套接字描述符是系統資源,每個系統在打開描述符的最大數量上有一個上限。一旦達到此限制,系統不會接受新的連接。因此,如果一個客戶端 - 服務器系統的實現方式沒有大量的併發TCP連接,打開描述符的最大數量限制就不會受到影響,服務器將繼續爲客戶端提供服務。如果客戶端 - 服務器系統需要大量的持久連接,那麼明確描述符的限制是一個問題,需要增加。

+0

「套接字描述符是系統資源,每個系統在打開的描述符的最大數量上有一個上限」,我們如何知道可能的連接的最大數目? – sandesh

+0

可以使用命令「cat/proc/sys/fs/file-max」來檢查Linux上打開文件描述符的系統範圍限制。可以使用參數fs.file-max上的sysctl命令修改此限制。 –