2017-02-28 8 views
2

Linuxマルチユーザサーバーをプログラミングしており、受け入れられた各接続はその接続のソケットファイル記述子を含むintを返します。私はまた、それぞれの接続に対応する1つのUserConnectionオブジェクトを持っています。ソケットファイル記述子(キー)とオブジェクト(値)のキーと値のペアを格納するためにハッシュテーブル(C++ STL unordered_map<int, UserConnection>)を使用しています。Linuxソケットファイルディスクリプタは、一般にハッシュに適していますか?

ソケットファイルディスクリプタをキーとしてハッシュテーブルに置いても安全ですか? Linuxのソケット番号の割り当てにハッシュ関数がうまく機能しないパターンがありますか?

+1

ソケットが閉じたときにキーを削除すると仮定します(理想的には、ソケットを閉じると競合状態を回避する直前で、別のスレッドが同じfdでソケットをオープンするのが理想です)。 – ShadowRanger

+0

よろしくお願いします。ありがとう!私はUserConnectionを変更し、Destructorへのソケットのクローズを移動して、ConnectionManagerクラスのキーに対してunordered_map :: eraseを呼び出すときにのみ終了するようにしました。 – Anton

+1

ディスクリプタに使用される整数値のテーブルをハッシュにあらかじめ作成することもできます。その場ですべてをハッシュする必要はありません。単純なスパースベクトルもうまくいくように思えます。より興味深いアプリケーションは、次のようなものかもしれません。一意的な接続は、{ソースIP、ソースポート、宛先IP、宛先ポート}の4つのタプルです。ハッシュテーブルを使用し、4タプルを消化する方がおそらくより適しています。最後に、潜在的なDoSを回避するためにハッシュをキーする必要があります。このようなアプリケーションでは[カーネルはSipHashに切り替える](https://lwn.net/Articles/711167/)と思う。 – jww

答えて

3

manual page for open(2)は、明示的に最低の未使用のファイルディスクリプタは新しいファイル・ディスクリプタに割り当てられていると述べている:

成功した呼び出しによって返されたファイルディスクリプタはのために現在開いていない 最も小さい番号のファイルディスクリプタになりますプロセス。

類似の言葉遣いはsocket(2)にはありませんが、これはかなり安全な前提であると考えています。これもソケットにも当てはまります。

その後、ソケットを作成すると、最初の機会に再利用される新しいソケットのファイル記述子が単調に増加します。このように、これはハッシュの理想的な使用例です。

関連する問題