2016-09-07 8 views
0

これは非常に基本的な質問/デザインですが、私はここで定義しようとしているシステムを扱う正しい方法に苦労しています。LinuxのTCPクライアント/サーバ

私は、TCP/IPプロトコルを介して組み込みLinuxボード(Raspberry Pi)に接続する単一のクライアント(PC)を持つシステムを持っています。これは、PCが何かを尋ねるコマンド/レスポンスシステムとなり、ラズベリーのPIが結果に応答します。例については


CMD =>読む/リターンADCチャンネルX

RSP => ADCチャンネルXデータ

私はすでにこれを許可するパケットプロトコルを定義しているこのタイプのシステムのためにインタラクション。私の問題は、これをRaspberry PIで処理する方法です。私は、TCP接続を扱う単一のスレッドを持つことを想定しています。取り込みデータをスレッドセーフ待ち行列に入れ、スレッドセーフ待ち行列から引き出すデータを引き出すこと。メインスレッドは定期的にキューをポーリングしてデータを探します。データが見つかると、コマンドが処理され、応答が生成されます。すべてのコマンドには応答があります。

メインスレッドは、他のタイムクリティカルなタスク(PID制御ループ)も実行し、受信データまたは送信データを待つことはできません。

私の推測では、このタイプのシステムはかなり一般的です。このタイプのシステムを実装するには、おそらく良いアプローチがあります。私はLinuxプログラミングにとって非常に新しいですが、私は高度に組み込みシステム(OSなし)を永遠にプログラミングしてきました。このタイプのデザインには正しいアプローチで苦労しています。

注意障害が発生した場合の再試行を処理するため、TCP/IPを選択しました。私の場合、すべてのコマンドには応答がありますので、設計をより簡単に/より柔軟にするためにUDPを使用することができます。

ご協力いただきまして誠にありがとうございます。

+0

また、コマンドの数とパケットのサイズが大きく異なることにも言及しておきます。したがって、このシステムは、アプリケーションが実行されている時間全体を実行する必要があります。常にクライアントが接続されているとは限りません。 –

+0

重要なスレッドは、このデータをとにかく持っていますか?それとも、リクエストに反応するためにそれを取得/計算する必要がありますか?データがすでに利用可能になっている場合、クライアントを処理するスレッドは単純な読み取り/処理/書き込みループを実行でき、キューは必要ありません。 「プロセス」部分は、スレッドセーフなストレージからデータにアクセスするだけです。 –

+0

質問はそれほど広くありません。あなたが試みると、より質の高い回答が得られ、それが不満足な理由についての投稿を書いてください。 – jxh

答えて

2

私はスレッドを避ける傾向があります。もし私ができるならばスレッドを避ける傾向があります。なぜなら、プログラムのデバッグをより困難にするからです。決定的問題を非決定論的問題に変えます。だから、私の最初のアプローチは、スレッドなしでこれを行うことができ、それでも並行性を達成できるかどうかを確認することです。これは、selectを使用することで可能です。これは、読み込みが必要なソケット上に何かがあるときにメインプログラムに通知します。ソケット上に何かがあると、データを読み取り、処理して、次のイベントを待つことができます。このアプローチの問題は、受信データの計算がデータの次の要素を処理するのに必要な許容時間よりも長くかかる場合、ソケット上の未処理データのバックログに終わる可能性があるということです。これが起こる場合は、スレッドでreceiveループを実行し、別のスレッドでwork関数を実行するか、新しいプロセスをforkして、新しいプロセスからのデータのコピーを処理できます。

+0

私はこのアプローチが好きです。深く組み込まれた開発者であるため、決してスレッドを使用しません。私は選択されたアプローチを知らなかった。これは、selectがブロックしない場合に機能します。私は今すぐ再開します。 –

+0

OPがlinuxを参照していたので、私は 'epoll'が良い選択肢かもしれないと感じました...あなたはどう思いますか? – Myst

+0

@Myst:はいカーネルがサポートしている場合、epollは動作します。私はepollを直接使用したことはありませんが、epollをラップするlibeventを使用しています。 – sashang

1

非常に古典的なLinuxのアプローチは、新しいクライアントごとに新しいコピーを作成するリスナープログラムを用意することです。 Linuxには、あなたのためにそれを行うdemonが組み込まれています(initd - これはすべてのsystemdのもので変更されているかもしれませんが)。 sshd、telnetd、ftpdはどのように動作するのですか?いいえスレッド

+0

申し訳ありませんが、クライアントが1人しかいないことを述べておきます。私の問題は、実際に着信データを処理することともっと関係しているため、時間のかかる重要なタスクでメインスレッドに影響を与えません。希望は意味があります:) –

関連する問題