2017-02-28 99 views
2

我正在編程一個Linux多用戶服務器,並且每個接受的連接返回一個包含該連接的套接字文件描述符的int。我還有一個對應於每個連接的對象UserConnection。我使用散列表(C++ STL unordered_map<int, UserConnection>)來存儲套接字文件描述符(鍵)和對象(值)的鍵值對。Linux套接字文件描述符通常適用於散列

把套接字文件描述符作爲關鍵字放在散列表中是否安全? Linux的套接字號分配有沒有任何模式可能不適用於散列函數?

+1

假設您在套接字關閉時移除了鍵(理想情況下,就在之前,爲了避免競爭條件,如果關閉套接字並且另一個線程使用相同的fd打開套接字),我沒有看到任何明顯的問題。 – ShadowRanger

+0

良好的電話:謝謝!我更改了UserConnection,並將套接字移到了析構函數中,這樣只有在ConnectionManager類的關鍵字上調用unordered_map :: erase時才能完成。 – Anton

+1

您也可以預先將用於描述符的整數值表格構建爲散列。沒有必要在飛行中對所有這些進行哈希。它也好像一個簡單的稀疏矢量也能很好地工作。一個更有趣的應用可能是......一個獨特的連接是4元組{源IP,源端口,目的IP,目的端口}。使用散列表並消化4元組可能更適合參與。最後,您可能需要鍵入哈希以避免潛在的DoS。我相信[內核切換到SipHash](https://lwn.net/Articles/711167/)這樣的應用程序。 – jww

回答

3

manual page for open(2)顯式地規定,最低未使用的文件描述符被分配到新的文件描述符:

成功調用返回的文件描述符將成爲 編號最低的文件描述符目前沒有開放的處理。

似乎從socket(2)錯過了類似的措詞,但我認爲這是一個相當安全的假設 - 這同樣適用於套接字。

然後,創建套接字將導致單調增加文件描述符,爲新的套接字,這將在第一次機會將被重用。因此,這是哈希的理想用例。

相關問題