2

ソケットを使用した C++ プログラム フローに関して、ややこしい問題があります。

基本的に私が持っているのはこれです: ソケットをリッスンし、一度に 1 つの接続を受け入れる単純なコマンドライン ソケット サーバー プログラム。その接続が失われると、さらなる接続のために開かれます。

そのソケット通信システムはクラスに含まれています。このクラスは、接続を受信し、受信したデータをクライアントにミラーリングすることができます。ただし、クラスはオブジェクト指向ではない UNIX ソケットを使用します。

私の問題は、私の main() 関数に、そのオブジェクトのインスタンスを作成する行が 1 行あることです。その後、オブジェクトは初期化されて待機します。しかし、接続が得られるとすぐに、オブジェクトの初期化関数が戻り、それが起こると、プログラムは終了します。プログラムが終了する前に、このオブジェクトが削除されるまでどうにかして待つにはどうすればよいですか?

概要:

  1. main() オブジェクトのインスタンスを作成する
  2. オブジェクトがリッスンする
  3. 接続を受信しました
  4. オブジェクトの初期化関数が返す
  5. main() 終了 (!)

私が望むのは、そのオブジェクトが終了する前に、そのオブジェクトが行っていることを完了するまで (別名、それ自体を削除する)、 main() が何らかの形で遅延することです。

何かご意見は?

4

5 に答える 5

0

考えられる解決策はいくつかありますが、詳細な情報がなければ、状況に最適な解決策を判断するのは困難です。

私の最初のアイデアは、通信部分を別のスレッドに入れることです。これにより、プログラミングが少し複雑になりますが、接続が閉じると、スレッドだけが終了します。

2 番目のアイデアは、while ループを使用した Jeremy Friesner のアイデアのバリエーションです。あなたは効率のためにそれに反対しているようです。私のアドバイスは、最初に機能するものを構築し、後で効率性に対処することです。リソースを節約するには、コンストラクターの後に sleep() 呼び出しを入れます。

于 2010-06-09T05:10:59.923 に答える
0

オブジェクトがスレッドを開始している場合、API にある種の .wait() メソッドがある可能性があります。または、内部のスレッド オブジェクトにアクセスして join() を作成できますか?

存在せず、API を変更できない場合は、内部で while(1) とスリープを実行する必要があり、見栄えがよくない可能性があります。

あなたの Network クラスは、知らないうちに、またはそれを待つ能力がなくても、スレッドを開始しているようです。Network クラスが必要なすべてを実行する場合、同時にクライアントが 1 つしかないため、その内部でスレッドを使用する意味は何ですか?

于 2010-06-09T07:57:24.537 に答える
0

私が望むのは、そのオブジェクトが終了する前に、そのオブジェクトが行っていることを完了するまで (別名、それ自体を削除する)、 main() が何らかの形で遅延することです。

オブジェクトがスレッドを開始しているように思えます。

その場合、いくつかの選択肢があります。

  1. pthread_joinオブジェクトによって開始されたスレッドが終了するまで待機するために呼び出します。
  2. メインコールがありますpthread_exit。これにより、プロセス全体ではなくスレッドが終了します。
于 2010-06-09T05:31:37.533 に答える
0

コードを投稿すると自信を持って答えるのが簡単になりますが、それは十分に簡単に思えます.... main() の内容の周りに while(1) ループを追加します。

int main(int, char **)
{
   while(1)
   {
      [...]
   }
}
于 2010-06-09T04:34:55.063 に答える
0

従来、サーバーにはリッスン ソケットがあり、クライアント接続を受け入れてループし、個別のスレッドで実行される各接続に対して新しい接続処理クラスを作成します。

于 2010-06-09T08:14:37.803 に答える