• ベストアンサー

ソケットの共有について

プロセスA, プロセスBがあります。 プロセスAの中でスレッドa, スレッドbを作成します。 スレッドaの中でソケットを作成します。 このソケットでプロセスBと通信します。 スレッドbは作成済みのソケットを使ってプロセスBと 通信できますか? ソケットディスクリプタさえ分かれば、実現できるのかな? ちなみに実現可能な場合には何か注意点があったら 教えて下さい。(mutexが必要とか・・・)

質問者が選んだベストアンサー

  • ベストアンサー
  • buriburi3
  • ベストアンサー率44% (353/792)
回答No.1

>スレッドbは作成済みのソケットを使ってプロセスBと通信できますか? 出来ます。 言語もOSも不明なので詳細は割愛しますが、ソケットはWindowsではIOとして、UnixとLinuxではストリームとして実装されています。 IOもストリームもディスクプリタがa,bのスレッドから参照可能な位置にあれば共有できます。 基本的にはファイルと同じような動作をしますのでa,bどちらかのスレッドもしくはソケットを独占的に扱うスレッドcを設けた方が実装は簡単です。 両方がバラバラにソケットにアクセスした場合、aが受け取るべきデータをbが受け取ったり、プロセスBにa,bのスレッドの両方から同時にデータ送信を行った場合、データが混信(?)します。 送信時の混信(?)はmutexで防げますがプロセスA側の受信はバッファをpeepして自分宛でなければ書き戻すとか面倒な操作が必要になってしまいます。 ※シングルCPU/シングルコアでは送信時の混信(?)は発生しにくいですが、マルチCPU/マルチコアでは高確率で発生します。 ※ソケットのpeepはOSによってはサポートしていない場合があります。

upanepa
質問者

お礼

ご回答ありがとうございます。 通信を専門で扱うスレッドを設けるtips、 参考にさせていただきます。

関連するQ&A

  • VC++ 6.0 のソケット通信について

    VC++6.0にてソケット通信プログラムを作成中(学習中)なのですが 以下のようなソケットのやり取りを想定しています。 A→B→C A←B←C 分かりづらいかもしれませんが、A,B,C三つのプログラムがあり まず、AはBに向けて電文を送信、Bはそれを受信し、Cに電文を送信 Cはそれに対してBへ電文を送信、BはCからの電文を受信しAへ電文を送信 こんな感じになっています。いうなればA,C間の中継器のような役割をBに持たせたいのです。 http://blog.livedoor.jp/akf0/archives/51585502.html ここのソースなどを参考にしてBのプログラムを組んでいるのですが サーバとクライアントでソースが分かれています。 Bはサーバもクライアントも兼ねるような仕様なのですが、この場合に使用するソケットは (1)Aからの受信を行う(待つ)ソケット (2)Cへ送信を行うソケット (3)Cからの受信を行う(待つ)ソケット (4)Aへ送信を行うソケット の4つのソケットが必要になるのでしょうか? ソケットの仕組みがうまく理解できていないので頓珍漢な質問かもしれませんが 回答よろしくお願いします。

  • ソケット通信

    現在プロセス間通信について学んでおり、 今はソケットを使ったプロセス間通信のプログラムを書いています。 そのソケット通信での質問なのですが、 2台のパソコンでINETドメインのソケットを使って プログラムを書いているのですが、 サーバーを実行した後、 別のパソコンでサーバー側のパソコンのIPアドレスを指定して クライアントを実行しようとすると、 connect:Connection timedout と表示されて実行できません。 同じプログラムをUNIXドメインで 1台のパソコンで実行すると正しく実行できます。 これは、プログラムに問題があるのでしょうか? それとも、ソケット通信を行う際には 何かパソコン等の設定が必要なのでしょうか? 教えてください。お願いします。 あと、セマフォを用いたプロセス間通信のサンプルプログラムが のっているホームページなどご存知でしたら、 教えていただけるとありがたいです。

  • サーバの機能とソケット

    パイプとソケットについてですが、 パイプ:プロセス間のコネクションを設定して行う通信 ソケット:ネットワーク上でコネクションを設定して行う通信 という認識なのですが、これはあってますか? あと、サーバの機能とソケット番号はどのような対応付けが必要なのか教えて下さい。

  • サーバプロセスとクライアントプロセスの通信

    サーバプロセスとクライアントプロセスの通信がどのように行われているのか確認させてください。 現在、以下の認識でいます。 (1)TCPコネクション  サーバ側ポート番号【23】と、それぞれのクライアント側ポート番号【****】との間に確立する。   (2)通信処理  クライアント側のプロセスAは、サーバ側のプロセスA(子)  クライアント側のプロセスBは、サーバ側のプロセスB(子)  クライアント側のプロセスCは、サーバ側のプロセスC(子)  との間で通信を行う。 ※添付の図も参照ください。 認識に相違ないでしょうか。 サーバプロセスとクライアントプロセスの通信を行う際、プロセス間(ポート間?)の通信には、IPアドレスとポート番号を組み合わせたソケットを用いるため、サーバ側ではソケット【192.168.0.1:23】を1個作成し、クライアント側ではソケット【192.168.0.2:****】をプロセス分作成すると考えています。 このとき、クライアントプロセスAはサーバプロセスA(子)と通信を行いますが、サーバ側で作成されているソケットは1つであるため、どの子プロセスに対してデータをせばいいのか判別できないのではないかと考えています。 ※クライアントプロセス(A、B、C)はソケット(サーバ側)【192.168.0.1:23】に対して送信されるため。 上記について、何らかの仕組みがあるのでしょうか。 よろしくお願いします。

  • c# スレッド間でのデータの共有

    C#でメインプロセスと生成されたスレッド間でデータの共有をさせたいのですがどのようにすればいいのでしょうか。ご教授お願い致します。 ・メインプロセス(A) ・Aから生成されたスレッド(B) 例えば、AとBで変数の値をそれぞれ読み書きさせたい場合 どのようにすればよいのでしょうか。 class TEST { public int flag; // メインプロセス(A) public static void Main() { Thread t = new Thread(new ThreadStart(abc)); t.IsBackground = true; t.Start(); while(ture) { Thread.Sleep(10); Console.WriteLine("A:{0}",flag); } } // Aから生成されたスレッド(B) public void abc() { Console.WriteLine("B:{0}",flag); flag++; } }

  • pthread_mutex_lock の応答時間

    HP-UX上でCを使ってpthreadプログラムを記述しています。 mutexを競合するスレッドが2つあり、  A) pthread_mutex_lock(&mutex)  B) pthread_mutex_lock(&mutex)  A) pthread_mutex_unlock(&mutex) の流れで処理が流れています。 この時、A)がlockを解放してからB)がlockを獲得できるまで(=pthread_mutex_lockの応答が返ってくるまで)に多少の時間がかかってしまうことはありうるのでしょうか。(現在発生している事象では、0.002秒程度) マシン性能にも拠ると思いますし、B)スレッドが再開するときのCPU割り当てに時間がかかった等も考えられるのかとは思いますが、スレッドライブラリとしての動きが知りたいです。

  • ソケット通信について

    VC++6.0MFCでソケット通信のプログラムを作成しようとしています。勉強始めたばかりなので、やっと普通に通信するプログラムは理解できたところです。 そこで応用していろいろ考えているのですが、方法がわからないところがありますので教えていただければと思ってます。 サーバ側の接続待ちはいつでも受けれるようにして、接続してきたクライアントに対して送信したいと考えております。ソケットの接続情報を保持しておいて、別プロセスの送信プログラムが接続クライアントに対して送信したいと考えてます。その送信プログラムが複数ある場合も同じ接続情報を利用したいと考えてるのですが、可能でしょうか。 説明が下手で申し訳ありません。補足はいたしますので、アドバイスお願いいたします。

  • プロセス間通信について

    こんばんは、皆さん。 自分の意識の中では、プロセス間通信とは「ソケット通信」の事を指していると 思っており、その上でC言語で作成する必要があって、それについての参考になるような サイトや本を検索しているのですが、これ!という決め手なものが見つかっていません。 またプロセス間通信には「パイプインタフェース」!?というのもあるようで、 ソケット通信とどう違うのか、ちょっと混乱してきております。 プロセス間通信について分かりやすいお勧め本を教えていただけませんか。 よろしくお願いします。

  • javaによるソケット通信

    こんばんわ. 現在悩んでいる事があります. あるプログラムと別のプログラム同士で通信を行い互いに影響を与えるようなプログラムは作成可能でしょうか. 例えば,一元的に全体を管理するコントローラがあり,コントローラからの命令で別のプログラムが動作する,コントローラはそのプログラムが動作中であることを知ることができる,といったプログラムを作成したいと思っています. これらを別のプロセス(hello.javaとworld.javaのように)で行いたいと考えています. こういったことはjavaによるソケット通信で行えるのでしょうか. 行えるのならどのように行えばいいのでしょうか?私の考えでは.ソケット通信でやるなら,コントローラがクライアントでその下に位置するプログラムがサーバということになると思いますが・・いまいちよくわかりません. ご存知の方がおられましたらご教授お願いいたします.

  • UDPソケットを利用した送受信プログラムについて

    VC++.NETを用いて、UDPソケットの送受信プログラムを作成しようとしています。 3台のPCを用いて、A→B→Cと言うふうにAからCへBをはさんだ形でパケットを送りたいのですが、この場合B端末は送受信する必要があります。この場合、マルチスレッドプログラミングの知識が必要となってくるのでしょうか? よろしくお願いします。