職場では、Modbus スレーブ デバイスの一部として TCP サーバーを実装する任務を負っています。ここでスタック交換とインターネット全般 (優れたhttp://beej.us/guide/bgnet/を含む) の両方で多くのことを読みましたが、設計上の問題に苦しんでいます。要約すると、私のデバイスは 2 つの接続のみを受け入れることができ、各接続で着信 modbus 要求が発生します。これをメイン コントローラー ループで処理し、成功または失敗の状態で応答する必要があります。これを実装する方法について、次のアイデアがあります。
接続の作成、バインド、リッスン、受け入れを行うリスナー スレッドを作成し、新しい pthread を生成して着信データをリッスンし、アイドル タイムアウト期間後に接続を閉じます。アクティブなスレッドの数が現在 2 の場合、新しい接続は即座に閉じられ、2 つだけが許可されるようになります。
リスナー スレッドから新しいスレッドを生成しないでください。代わりに select() を使用して、アクティブな接続で着信接続要求と着信 modbus 接続を検出します (Beejs ガイドのアプローチと同様)。
- 2 つのリスナー スレッドを作成し、それぞれが accept() 呼び出しでブロックできるソケット (同じ IP とポート番号) を作成し、ソケット fd を閉じて接続を処理します。ここで、ブロック読み取りを使用して処理できる最大 2 つの接続のみが許可されると (おそらく単純に) 想定しています。
私は長い間 C++ を使用してきましたが、Linux 開発に関してはかなりの初心者です。上記のアプローチのどれが最適か (もしあれば)、また、私の Linux の経験が浅いために、それらのいずれかが本当に悪いアイデアであるという提案があれば、本当に歓迎します。私は fork() を避けて pthreads に固執することに熱心です。着信 modbus 要求はキューに入れられ、定期的にメイン コントローラー ループから読み取られるからです。アドバイスをよろしくお願いします。