5

私の単純なサーバー (Linux) に非同期ソケットを実装することを決定する際に、問題が発生しました。継続的に poll() を実行し、コール間でクリーンアップとキャッシュを行うつもりでした。これは無駄に思えるので、さらに掘り下げて、I / Oでいくつかのコールバックを実装する方法を見つけました。

O_NONBLOCK を使用してソケットを作成し、SIOCSPGRP ioctl() を使用して i/o で SIGIO を送信し、sigaction() を使用して i/o 中にコールバック関数を定義すると、パフォーマンスが低下しますか? .

さらに、ソケットごとに異なる関数を定義できますか?

4

1 に答える 1

3

「私は継続的に 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ドル。

于 2012-05-01T15:50:37.973 に答える