2012-01-01 9 views
0

ローカルのシリアルポートを複数のネットワーク接続クライアントに接続するだけのサーバーアプリケーションを作成しています。私はプログラムのための機器が限られたメモリを持つルータであるため、サーバアプリケーションのためにlinuxとCを使用しています。同じ情報を複数のスレッド/ソケットに送りますか?

私は、接続ごとにfork()プロセスを使用して、複数のクライアントがシリアルポートにデータを接続して送信するためのすべての設定を行っています。

私の問題は、シリアルポートに入ってくるデータを複数の(大量の)クライアント接続に送り出すことにあります。私の問題は、各アクティブなソケットがすべての着信データを取得し、一度だけ取得する方法を設計することにあります。どんな助け?

+0

複数のネットワーククライアントが1つの共通シリアルインターフェイスに読み書きしているとしますか?それはそれのように聞こえるものですが、それはまた奇妙なパターンです。 – purpleamy

+0

それはまさにそれです。もしそれが奇妙ではなかったなら、それはもっと簡単だろう。悲しいことにシリアルインネットワークアウトは重要な方向です。必要に応じて各スレッドがシリアルポートに直接書き込むので、もう一方の方が簡単でした。 – scoutjoe

+0

あなたのデザインや要件が正しいかどうかわかりません。シリアルポートには注意が必要です。いくつかのスレッドの代わりに 'poll'や' select'のような多重化システムコールを使うかもしれません。 –

答えて

0

おそらく、情報の各ビットごとにそれをループして、それらのすべてに送信するのではなく、接続されたクライアントのリストまたはその他の参照を保持していますか?

+0

おかげさまで、私が現在取り組んでいるアプローチは、私はいくつかの "組み込みパイプ(built-in-pipes)"やそれに類する方法があることを期待していました。 – scoutjoe

1

接続されたクライアントごとにデータキュー(バッファ)が必要なようです。データがポートに到着するたびに、それを各クライアントのキューの背面にポストします。その後、クライアントはそれぞれのキューの先頭からデータを読み取ります。すべてのクライアントはおそらく異なるレート/時間で読み込まれるため、すべてのクライアントがデータのコピーを1回だけ取得できるようになり、より多くのデータが入ってくるうちにクライアントを待つことはありません。もちろん、接続されているクライアントのキューごとに一定量のメモリを割り当てる必要があります(クライアントの数が不明で、使用可能なメモリが限られていると思います)。クライアントがすべてを読み取る前にキューがいっぱいになります。

0

ソケットごとのスレッド設計は、これを解決する最善の方法ではないかもしれません。イベント駆動の非同期アプローチは、はるかに良く適合するはずです。ただし、スレッドで行う必要があり、シリアルポートが遅いと仮定すると、シリアルポートをリッスンするスレッドとネットワーククライアントと通信するすべてのスレッドの間にパイプを構築するのが最も実用的です。あなたはrwlocksを使ってデータを移動させることができますが、ネットワークスレッドがソケットとシリアルポートの両方のデータを待つ方法が必要なので、両方のファイル記述子を使用する必要があります。投票。

真剣に言えば、これははるかに簡単で、スレッドなしでうまくいくでしょう。ネットワークとシリアルポートを監視しているポーリングを待ち、発生したイベントを判別してそれに応じてデータを配信するメインループと考えてください。それは一度あなたがアイデアを取得したらすべての周りに簡単にする必要があります。

+0

標準のPOSIX機能を持っていない可能性があるため、環境を指定し直してください。パイプはオプションではないかもしれません。代わりに、ネットワークソケット上の読み取り待機を中断するシグナルがあります。しかし、あなたが比較的安全な仮定であるべきである何らかの形式の投票を前提としているなら、私はまだ彼らが追加したものを見ないのでスレッドを完全にあきらめようとします。 – purpleamy

+0

ありがとうございます。このタイプのサーバープログラミングは私には新しく、私の道を這うようにしようとしていて、スレッド/フォークは複数の接続を処理するための最初の方法でした。代わりにfork()の代わりに、新しいソケットのfdを配列のある時間に追加してから、配列の各メンバーを読み書きして戻ってくるでしょう。 – scoutjoe

+0

接続の配列が必要です。ポールインターフェイスについて理解しておく必要があります。一度それを取得すると、あなたのイベントループは、どのFDが発生したかをテストするために提供された機能を使用するだけで、イベントを処理する必要があります(イベントをルーティングするロジックを作成する方法は、ハンドラー)のうち、私はあなたが4つ持っていると思う:接続、切断、シリアルからの受信、ネットワーククライアントからの受信。 – purpleamy

関連する問題