Linuxマルチユーザサーバーをプログラミングしており、受け入れられた各接続はその接続のソケットファイル記述子を含むint
を返します。私はまた、それぞれの接続に対応する1つのUserConnection
オブジェクトを持っています。ソケットファイル記述子(キー)とオブジェクト(値)のキーと値のペアを格納するためにハッシュテーブル(C++ STL unordered_map<int, UserConnection>
)を使用しています。Linuxソケットファイルディスクリプタは、一般にハッシュに適していますか?
ソケットファイルディスクリプタをキーとしてハッシュテーブルに置いても安全ですか? Linuxのソケット番号の割り当てにハッシュ関数がうまく機能しないパターンがありますか?
ソケットが閉じたときにキーを削除すると仮定します(理想的には、ソケットを閉じると競合状態を回避する直前で、別のスレッドが同じfdでソケットをオープンするのが理想です)。 – ShadowRanger
よろしくお願いします。ありがとう!私はUserConnectionを変更し、Destructorへのソケットのクローズを移動して、ConnectionManagerクラスのキーに対してunordered_map :: eraseを呼び出すときにのみ終了するようにしました。 – Anton
ディスクリプタに使用される整数値のテーブルをハッシュにあらかじめ作成することもできます。その場ですべてをハッシュする必要はありません。単純なスパースベクトルもうまくいくように思えます。より興味深いアプリケーションは、次のようなものかもしれません。一意的な接続は、{ソースIP、ソースポート、宛先IP、宛先ポート}の4つのタプルです。ハッシュテーブルを使用し、4タプルを消化する方がおそらくより適しています。最後に、潜在的なDoSを回避するためにハッシュをキーする必要があります。このようなアプリケーションでは[カーネルはSipHashに切り替える](https://lwn.net/Articles/711167/)と思う。 – jww