2
我正在編程一個Linux多用戶服務器,並且每個接受的連接返回一個包含該連接的套接字文件描述符的int
。我還有一個對應於每個連接的對象UserConnection
。我使用散列表(C++ STL unordered_map<int, UserConnection>
)來存儲套接字文件描述符(鍵)和對象(值)的鍵值對。Linux套接字文件描述符通常適用於散列
把套接字文件描述符作爲關鍵字放在散列表中是否安全? Linux的套接字號分配有沒有任何模式可能不適用於散列函數?
假設您在套接字關閉時移除了鍵(理想情況下,就在之前,爲了避免競爭條件,如果關閉套接字並且另一個線程使用相同的fd打開套接字),我沒有看到任何明顯的問題。 – ShadowRanger
良好的電話:謝謝!我更改了UserConnection,並將套接字移到了析構函數中,這樣只有在ConnectionManager類的關鍵字上調用unordered_map :: erase時才能完成。 – Anton
您也可以預先將用於描述符的整數值表格構建爲散列。沒有必要在飛行中對所有這些進行哈希。它也好像一個簡單的稀疏矢量也能很好地工作。一個更有趣的應用可能是......一個獨特的連接是4元組{源IP,源端口,目的IP,目的端口}。使用散列表並消化4元組可能更適合參與。最後,您可能需要鍵入哈希以避免潛在的DoS。我相信[內核切換到SipHash](https://lwn.net/Articles/711167/)這樣的應用程序。 – jww