2017-12-11 23 views
1

私はクライアントがチャットできる非常に基本的なCサーバを実装しています。今私はfork()を使用していますが、クライアントにお互いのメッセージを見せてもらうのが難しいです。フォークベースのサーバーでクライアントとクライアントの通信は可能ですか?

また、すべてのクライアントがaccept()から同じファイル記述子を取得したようです。基本的には、誰かがselect()、accept()、connection()、fork()を使って接続したい場合にテストするwhileループがあります。その後、私は入力を読んで、リストに入れているすべてのユーザーにそれらを渡そうとします。必要に応じて私のコードをコピー/ペーストすることができます。

クライアントとプロセスとの通信が可能か、pthreadを使用する必要がありますか?

答えて

2

Inter-process communication -IPC-(一般的に)クライアントとサーバーは関係ありません(connect段階を除く)。特定のプロセスは、クライアントとサーバーの役割(ソケットが異なる)を持つことができ、event loopのいくつかのソケットでpoll(2)または古いソケットselectを使用します。 threads同じ仮想アドレス空間(その含むプロセスの1)を共有しながらprocessesは、それぞれ独自のvirtual address spaceを持っていることを

は注意してください。 pthread tutorialとPOSIXプログラミングに関する書籍(おそらく古いもの:ALP)を読んでください。プロセスに関する多くの情報は、Linuxで/proc/(詳細はproc(5)を参照)を介して問い合わせることができます。具体的には、PID 1234のプロセスの仮想アドレス空間は/proc/1234/fd//proc/1234/fdinfo/等スルー/proc/1234/mapsそのオープンされたファイル記述子....

を通して得ることができるが、共有状態を維持する共通のサーバを符号化する簡単で、メッセージをクライアントにディスパッチします。

クライアントがそのIPCを開始するための何らかの方法を持つプロトコルを設計できます。たとえば、すべてのプロセスが同じマシン上にある場合、unix(7)ソケットアドレス、またはfifo(7)として使用されるファイルパスを送信するプロトコルを持つことができ、各クライアントプロセスは後で(一部ではconnect)別の "クライアント"。そうすることは賢明ではないかもしれません。

0mqのようなライブラリも見てください。彼らはしばしばfree softwareですので、あなたはそのソースコードを勉強することができます。

+0

ええ、サーバー上のすべてのクライアントのリストを既に持っている間は、クライアントとクライアント間の直接通信という考えはまったく嫌いです。私はそれがpthreadsだと思います... – Novice

+0

いいえ、pthreadsは共通の仮想アドレス空間を共有します。 –

+0

私はそれがpthreadsで行うことができることを知っていますが、可能であればプロセスでも疑問に思っていました。それはちょうど地元のチャットサーバーです。 – Novice

関連する問題