「私は継続的に poll() を実行し、コール間でクリーンアップとキャッシュを行うつもりでしたが、今では無駄に思えます」
無駄な方法?実際にこれを実装しようとしましたか?
fd リストがあります。poll または (より良い)epoll()
リストを呼び出します。トリガーされたら、fd リストを調べて、それぞれを適切に処理します。受信データと送信データをキャッシュする必要があるため、各 fd には何らかの構造体が必要です。これを行ったとき、fd構造体にハッシュテーブルを使用しました(fdからキーを生成します)が、少なくとも最初は、固定長配列を使用してOSの問題が発生した場合にチェックするだけで、おそらく問題ありませんあなたは奇妙に高いfdです(nb、私はそれが起こるのを見たことがなく、数え切れないほど多くのログを目を細めました)。構造体は、着信および発信バッファーへのポインターを保持します。おそらく、状態変数です。たとえば、次のようになります。
struct connection {
int fd; // mandatory for the hash table version
unsigned char *dataOut;
unsigned char *dataIn;
int state; // probably from an enum
};
struct connection connected[1000]; // your array, or...
...おそらく、リンクされたリストは実際にはfdに最適です。ハッシュテーブルには無関係の要件がありました。
そこから始めて、段階的に改良します。あなたは簡単な方法を見つけようとしているだけだと思います-後で他のことを難しくすることで代償を払うことができます;) 0.02ドル。