2012-02-17 13 views
1

複数のストリームをバッファリングするにはどうすればよいですか(各ストリームには独自のバッファが必要です)。複数のバッファ管理をCで

I私の頭の中で解決策を一緒に置くの並べ替え:

{ 
    stream_id 
    buff_ptr 
} 

これは理論である "擬似コード"

[ptr, ptr, ptr, ptr ... ] 

ptrは、構造体へのポインタであります

stream_idはストリームのIDです(私はその情報を持っていますrmation)、buff_ptrは、一部のデータへのポインタです。また、バッファは、おそらく柔軟でなければならないであろうと、それは柔軟にするためにmallocfree多くを呼び出す必要があるだろう(少なくとも私は思うそれがでしょうか?

私は基本的に繰り返すことによって、私は必要なバッファを見つけるだろうptrの配列によって。だから、


、私は「娘は彼女が?!という必要もないのはなぜ」誰もが疑問に思っている場合は、「アーキテクチャ」の良い、またはより良いがある?

ということですRuby/EventMachineでサーバーを作ったが、プロトコルは本当に腐っている(控えめに言って)と私はそれを扱う他の方法を知らない... EventMachineを強制的に私のためにそれをバッファする方法がない限り、それは最高のソリューションと思われる。

ありがとうございました。

P.S:レイヴに申し訳ありません! 〜

+0

'stream_id'が' 0'から 'N'までの整数だった場合、' buff_ptr'の配列を使うことができ、 'struct'のリストを検索して必要なストリームを見つける必要がありません。 – hmjd

+0

@hmjdああ、そうではありません。私はそれも最初であると思った。時にはそうであり、時にはそうではありません。本当に少しランダムです。そして、それは0で始まることはほとんどありません。実際には今、私はそれを考えています。 – omninonsense

+0

'stream_id'のあらかじめ定義された範囲はありますか?もしあなたがスパース配列を使用することができたならば。 – hmjd

答えて

1

まあ、唯一の選択肢だが、あなたはいくつかのことを変更することができます。

  • はないmallocfreeを行います。 realloc代わり
  • リストを反復を使用して、OKかもしれないが、バッファ

    • が多い場合は、発信者があなたにバッファへのポインタを渡すことはできますか?
    • リストの代わりにハッシュを使用してstream_idで検索できますか?たとえば、(たとえば、ファイルディスクリプタ用)glib2 provides such a hash

多くのAPIを使用すると、ID(ファイルディスクリプタの場合の記述子)とのポインタを関連付けることができます。何か面白いことが起きると、APIは4〜8バイトのメモリを犠牲にしてポインタをゼロに戻します。

+0

Cにハッシュのようなことはありますか?私はそこにいたのか知​​らなかった! * c初心者はこちら〜* – omninonsense

+1

@withadot。標準的なものはありません。自分で実装することも、既成のものを使用することもできます(例:[glib2 hash](http://developer.gnome.org/glib/2.28/glib-Hash-Tables.html))。 – cnicutar

+0

それを見てください。簡単にインストールできますか? – omninonsense

0

単純なイベントループを作成し、ファイル記述子のポーリングを処理させるには、libevを使用します。そこに多くの例があり、マニュアルページ(man 3 libev)は私が読んだ最高のものの1つです。

コールバックをいくつか定義し、読み書きプールにいくつかのバッファを作成するだけです。これらのプールのサイズは、バッファがいっぱいになったときに読み書きをブロックしたり、スキップしたりする限り、静的なままです。

関連する問題