2011-01-23 13 views
3

私は、バックグラウンドで実行してタスクを処理し、フロントエンドから直接入力を受け取る必要があるデーモンを作成しています。私はソケットを使用してこのタスクを処理しようとしていましたが、ソケットが接続を待っている間にプログラムを一時停止するため、正しく動作するようにはできません。これを回避する方法はありますか?C++のデーモンとソケットとのインタフェース

私はhttp://linuxgazette.net/issue74/tougher.html

に設けられたソケットラッパーを使用していますが、この問題に対処するためのいくつかの方法があります

答えて

2

を助け、あらゆるいただきありがとうございます。この最も一般的なのは、イベントループなどを使用して、libeventのようなものです。次に、非ブロッキングソケットを使用します。

イベントドリブン方式でこれを行うには、プログラムロジックを大きく変更する必要があります。しかしスレッドでそれを行うことは、それ自身の複雑さを持ち、明らかに良い選択ではありません。

+0

1イベントループ内のオプションです、それを強くお勧めまたはイベントループの下のepoll/kqueueの呼び出しを使用してのような特定の状況では必要ですが、あなたはまだすることができpoll/select呼び出しでブロッキングソケットを使用します。私は非ブロッキングソケットがopensslのようなライブラリでいくつかの問題を引き起こす可能性があることをコメントしています。 – KitsuneYMG

+0

ノンブロッキングソケット用

while (!done) { bool workDone = false; // Loop over each event source or internal worker for each module { // If it has work to do, do some. if (module.hasWorkDoTo()) { // Generally, do as little work as possible; e.g. process a single event for this module. // But tinker with this to manage priorities if need be. // E.g. Maybe allow the GUI to flush its queue. module.doSomeWork(); workDone = true; } } if (!workDone) { // System idle. No Sleep for a bit so we have benign idle baheviour. nanosleep(...); } } 

3

スレッドを使用して、ソケット操作を非同期にする必要があります。または、既に実装しているライブラリを使用してください。先頭のライブラリの1つはBoost Asioです。

+0

+1非同期通信のBoost.Asioはここに行く方法です。 –

+1

+1。ああ、こんにちはサム、私はいつもこのスレッドの周りにあなたを見... :) –

+0

私はブーストAsioを見てきました。私は特定の批判を思いつくためにそれをもう一度見なければならないだろうが、それは私が使いたいと思う非同期IOライブラリのようではなかった。問題にどのように近づいたかについて、何かが不足しているか正しくない。私はBoostが全般的に好きですが、この部分だけではありません。 – Omnifarious

2

通常、デーモンはイベントループを使用して、イベントを待つという問題を回避します。

これは、存在する問題(非同期イベントまで待つ必要はありません)に対する最もスマートな解決策です。通常、デーモン全体はイベントループを介してビルドされ、コールバックアーキテクチャであり、部分的な書き換えを引き起こす可能性があります。通常、迅速で汚れたソリューションは、通常はより多くのバグを生成するイベントを処理するための別個のスレッドを作成しています。それが解決するよりも。したがって、イベントループを使用してください:

  • libevent。
  • glibイベントループ。
  • libev。
  • ブースト::
  • ASIO ...あなたの説明から、
1

は、すでにフロントエンド(受信入力)およびバックエンド(ソケットハンドリングとタスク)にアプリケーションを分割しています。フロントエンドからの入力が(バックエンド経由で)ソケットを介して送信され、ソケットからの入力を受け取る場合、クライアントではなくサーバーであると思われます。クライアントプログラムは、通常、デーモンとして実装されていません。

ブロッキングソケットを作成しました。別のスレッドでスレッドを実行するか、別のプロセスで実行するか監視する必要があります)、または非ブロッキングソケットを作成し、頻繁に更新をポーリングします。

LinuxGazetteへのリンクは、ネットワークプログラミングの基本的なイントロです。もう少し深めたいのであれば、Beej's Guide to Network Programmingを見てください。さまざまなAPI呼び出しが少し詳しく説明されています。おそらく、Boost :: ASIOなどのラッパーライブラリを評価してくれるでしょう。

0

イベントループの制御を自分自身で保持する価値があります - 複雑でなく、柔軟性があります。

イベントループの "C++擬似コード"。

、非ブロッキングソケット
関連する問題