「私は継続的に()をポーリングしよう、と呼び出しの間にいくつかのクリーンアップとキャッシングを行いました。さて、これは無駄なようだ」
は無駄か?実際にこれを試して実装しましたか?
fdリストがあります。あなたはポーリングまたは(より良い)epoll()
をリストに呼び出します。トリガーすると、fdリストを歩き、それぞれを適切に処理します。入力データと出力データをキャッシュする必要があるので、各fdには何らかの構造体が必要です。私がこれを行ったとき、fd構造体(fdからキーを生成する)にハッシュテーブルを使用しましたが、おそらく最初はであり、最初はで、固定長配列を使用し、 OSはあなたに奇妙な高いfdを発行します(nb、私はそれが起こるのを見たことがないと私は数えることができますより多くのログをsquinted)。構造体は、例えば、おそらく、状態変数、着信と発信のバッファへのポインタを保持する:おそらく、リンクリストは、FDさんのために、実際に最善である
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...
...、私はハッシュテーブルの無関係な要件を持っていました。
ここから開始し、段階的に修正してください。あなたは簡単な方法を見つけようとしていると思います。後で他のものを作ってお金を払うかもしれません。難しい;)$ 0.02。
[libevent](http://libevent.org/)や['libev'](https://github.com/brimworks/libev)のようなものを見てみませんか? – c00kiemon5ter
私は可能な限り裸のアセンブリとして使用しようとしています^^ –
私はかつてこれを試しました(そして成功しました!)が、結果のプログラムはsigprocmaskで時間の80%を過ごすのに費やしました。要点は、シグナルハンドラでmalloc()を呼び出すことができないため、SIGIOを無効にして事前に割り当てる必要があることです。単純なselect()やpoll()ループ(おそらくスレッドを持つ)は、管理が簡単です。参考:IIRC NTPはSIGIOを使用しています。恐らくDNS/bindもそうではありません。 – wildplasser