0

Linux上のCで簡単なインスタントメッセンジャープログラムを書いています。

現在、ローカルマシンのポートにソケットをバインドし、ローカルマシンのIPとポートに接続されている別のプログラムから送信されるテキストデータをリッスンするプログラムがあります。

このクライアントにテキストデータをプログラムに送信させstdout、ローカルマシンで使用して表示させることができます。ただし、私のプログラムはクライアントマシンから送信されたテキストを聞いて表示するのに忙しいため、クライアントマシンにデータを送り返す方法をプログラムすることはできません。

新しいプロセスを作成するにはどうすればよいですか(クライアントマシンから送信されたテキストをリッスンして表示し、そのテキストを取得して他のプログラムに送信し、stdout他のプログラムがstdinクライアントマシンへの送信を処理します) )または、別々のジョブ(送信、受信、表示)を実行し、適切なデータを相互に送信する2つのプログラムを作成しますか?

それが奇妙な言葉で書かれている場合は申し訳ありませんが、必要に応じて明確にします。exec、、などを調べましたがexecveforkこれが調べるのに適切なパスであるかどうか、または私が見逃しているより簡単な方法があるかどうかについて混乱しています。

どんな助けでも大歓迎です、ありがとう。

編集:振り返ってみると、これは2つの別々のプログラムではるかに簡単に達成できると思いました。1つはIMサーバーで、もう1つはIMクライアントです。

IMクライアントはIMサーバープログラムに接続し、必要なテキストをIMサーバーに送信します。次に、IMサーバーは、送信されたデータをバッファー/ファイルに記録し、各クライアントから送信されたテキストにクライアントの名前/ IPを追加して、そのテキストを(name:textの形式で)に送信します。接続されている各クライアント。

これにより、との複雑なプロセス間/プログラム通信の必要がなくなり、代わりに、stdinを介してサーバーから送信されたテキストをクライアントプログラムが表示し、を使用して任意のテキストをに送信する、単純なクライアント/サーバー通信方法を使用します。サーバ。 stdoutstdoutstdin

そうは言っても、私はまだ私の最初の質問に答える誰かに興味があります:科学のために。読んでくれてありがとう。誰かが私のメンタルブレーンストーミングやコミュニティからの回答から恩恵を受けることを願っています。

4

3 に答える 3

3

ただし、プログラムがクライアント マシンから送信されたテキストをリッスンして表示するのに忙しいため、データをクライアント マシンに送り返す方法をプログラムすることはできません。

listen-socket から返された同じソケットは、accept()データの送信と受信の両方に使用できます。したがって、ソケットから読み取っているという理由だけで、ソケットが「ビジー」になることはありません...同じソケットに書き戻すことができます。

読み取りと書き込みの両方を同時に行う必要がある場合は、accept()2 つの異なるスレッドから返されたソケットを共有します。ネットワーク スタックはソケットでの送受信に 2 つの異なるバッファーを使用しているため、ソケットへの読み取り専用スレッドと書き込み専用スレッドは、ミューテックスを使用しなくてもスレッドセーフになります。

于 2012-01-15T06:24:40.363 に答える
0

コメントで@bdonlanが述べたように、selectまたはできればpoll(またはpselectppoll...などの関連するsyscall)のような多重化呼び出しが絶対に必要です。これらの多重化呼び出しは、一度に複数のチャネルを待機するためのプリミティブです ( I/O イベントpselectppollシグナルの両方をアトミックに待機することができます)。select チュートリアルの man ページもお読みください。もちろん、複数のファイル記述子を待機することも、読み取りと書き込みの両方の機能を待機することもできます (必要に応じて、同じソケットでも)、同じシステムコールselectまたはpollsyscall で。

すべてのイベントベースのループとフレームワークは、これらの多重化呼び出し (pollまたは などselect) を使用しています。また、 libeventを使用することも、(特にグラフィカル ユーザー インターフェイス アプリケーションをコーディングする場合) Gtk や Qt などの GUI ツールキットを使用することもできます。これらはすべて、中央のイベント ループに基づいています。

あなたの場合、マルチプロセスまたはマルチスレッドのアプリケーションが役立つとは思いません。イベントループが必要なだけです。

fcntl withSIGIOを使用してソケットにデータが到着したときにシグナルを取得するように要求することもできますが、これはあまり役に立ちません。次に、ソケットを非ブロックにしたいことがよくあります。F_SETOWN

于 2012-01-15T08:35:03.653 に答える
0

私は fork() を使用します - 子プロセスを作成すると、2 つの異なるソケットで 2 つの異なる処理を実行できる 2 つの異なるプロセスが作成されます。1 つは受信可能で、もう 1 つは送信可能です。このようなクライアント/サーバーのコーディングに関する個人的な経験はまだありませんが、それがあなたの問題を解決する最初の試みです...

于 2012-01-15T06:11:40.253 に答える