CSocket関連_複数の同時クラサバ通信

[戻る]
とこまん 2003/02/28(金) 17:50:48
はじめまして。
ソケット関係が初めての経験なので・・・

例えば、A画面よりBダイアログ画面、Cダイアログ画面をそれぞれモードレスで
表示し、B画面でもサーバとの通信を行い、C画面でもサーバとの
通信を行なうといった事をやろうとしています。
※ちなみにB画面、C画面は同時に起動は可能です。

このようなケースの場合、どのようにすればソケットの制御が可能でしょうか?

B画面、C画面は同時に起動といった事がなければA画面で制御しようかと
考えたのですが・・・

まるで検討がつかないので 是非、お知恵を拝借したいです。
よろしくお願いします。

dairygoods 2003/02/28(金) 18:02:13
A,B,Cがそれぞれ独自にサーバーに接続して通信するのであれば、
同時に動くことは気にせずにA,B,CのそれぞれがCSocketを使って
通信すれば問題無いと思います。

接続が一つで、A,B,Cがその接続を使って通信するのであれば、
一つのCSocketをグローバル変数として定義して、
A,B,Cはその一つのソケットを使えば良いでしょう。
スレッドを使わない限り、画面が同時に表示されていても、
一つ一つの関数は同時に動くわけではないので、
特に他を意識して通信する必要も無いと思います。

とこまん 2003/02/28(金) 18:16:23
dairygoods さん、有難うございます。

>接続が一つで、A,B,Cがその接続を使って通信するのであれば、
>一つのCSocketをグローバル変数として定義して、
>A,B,Cはその一つのソケットを使えば良いでしょう。

この場合、send,recieve をどこに定義?(実行?)するのが正しいのでしょうか?
A,B,C それぞれに 定義しても問題ないのでしょうか?

例えば、今回やろうとしている事は・・・
B画面では、ある要求をサーバにし、サーバから応答が帰ってくると
あるボタンを有効にする。
C画面も同じような事をやる必要があります。

申し訳ありません、もう少しお助けください。

dairygoods 2003/02/28(金) 19:33:57
>この場合、send,recieve をどこに定義?(実行?)するのが正しいのでしょうか?
>A,B,C それぞれに 定義しても問題ないのでしょうか?

どこでも問題ありません。

とこまん 2003/03/03(月) 11:18:33
dairygoods さん、有難うございます。

すみません、まだ頭の中が整理できてません。

このreciveのイベントを画面(クラス)で取得するにはどうすればいいのでしょうか?

拾ったサンプルに固執してしまっているようでなかなかうまくいきません。
ちなみにサンプルは
CSocket派生クラスにCWnd*のメンバ変数を持ち、サーバへsendしたタイミングで
呼び側のCWnd*をそこに設定しいます。
CSocket派生クラスでは OnReceiveの時にそのCWnd*にSendMessage()を
投げ、その画面でメッセージを受け取り、recieveを実行しています。
この方法だと 複数起動での処理がうまくいかないです
(CWnd*の管理が・・・)
やり方としてすごくシンプルだったのでなんとかなりそうかなと思ったのですが・・・

またアドバイスがあればご教授ください。
お願いします。

επιστημη 2003/03/03(月) 11:31:22
> このreciveのイベントを画面(クラス)で取得するにはどうすればいいのでしょうか?

受け取りたい CWnd にメッセージハンドラを用意するだけではないかと。
...そんな答が欲しいんじゃなさそうですね^^;

あなたが何をしたいのか、まだ明確になっていないと思われます。
サーバから受信した電文をいくつかの画面に振り分けたい。ってことですか?

とこまん 2003/03/03(月) 11:35:23
επιστημηさん、どうも。

>あなたが何をしたいのか、まだ明確になっていないと思われます。
自分でもコーディングレベルではまだ明確になってません・・・

>サーバから受信した電文をいくつかの画面に振り分けたい。ってことですか?
電文を画面に振り分けるといいますか、
各画面(クラス)で電文の送受信を行ないたいと考えてます。
あくまでも制御は各画面(クラス)でできればと・・・

επιστημη 2003/03/03(月) 11:40:36
どうであれ、電文の送信元(サーバ)は'ひとつ'なんですよね?
だったらなんらかの手段で振り分けないといけないんですよね?

とこまん 2003/03/03(月) 11:51:18
>επιστημηさん
はい、送信元は1ツです。

そのなんらかの手段で というところをアドバイスして頂ければと
思ってます。

1ツ考えたのが
・サーバからの電文受信は全てメインで行う。
・メインでは、電文受信後、振り分けを行い、各画面にメッセージ(SendMessage)
  を送る。
 ↑
  この場合、メインで、メッセージを送信した画面(CWnd*)を管理する。
・各画面ではメッセージを受け取った後、自分が送信した電文に対しての
 応答か判断し、そうであれば、それに応じた処理を行なう。

このロジック(考え方)って一般的なんでしょうか?

επιστημη 2003/03/03(月) 11:57:59
> そのなんらかの手段で というところをアドバイスして頂ければと
> 思ってます。

電文どこ(どっち)に投げるかを判別する方法はあなたしかわかりません。

> サーバからの電文受信は全てメインで行う。
> メインでは、電文受信後、振り分けを行い、各画面にメッセージ(SendMessage)
  を送る。

それでいいんじゃないかしら。
メインがどの画面に投げればいいのか判断できるのなら。
なにが問題なのですか?

dairygoods 2003/03/03(月) 12:01:29
各画面が完全に独立している(Aで送信してBで受けるとかがない)
のであれば、A,B,Cの各メンバに別々のCSocket派生クラスを持たせます。

で、
AはAのソケットを使って送信し、
Aソケットは、OnReceiveでAにメッセージを投げ、
Aが受信する。
とすれば、振り分ける必要はないですよね。

επιστημη 2003/03/03(月) 12:08:20
> 各画面が完全に独立している(Aで送信してBで受けるとかがない)
> のであれば、A,B,Cの各メンバに別々のCSocket派生クラスを持たせます。

はァ? '送信元は1ツ'つまりソケット(接続)は一本でも、
そんなことできるんですか? どうやって?

とこまん 2003/03/03(月) 12:09:44
>dairygoodsさん

この場合、サーバへの接続(Connection)はそれぞれの
画面で行なう事になるのでしょうか?

>επιστημηさん
これでいいんですか〜。
でも ちょっとdairygoodsさんの回答次第で考えさせてもらいます。

επιστημη 2003/03/03(月) 12:13:43
> この場合、サーバへの接続(Connection)はそれぞれの
> 画面で行なう事になるのでしょうか?

そんなのはあなたの実装次第です。
複数の接続を用意し、それぞれの受け持ちとなる画面と
1対1に対応がつけばいいのだから。

複数の接続を確立していいのですか? それとも一本?

dairygoods 2003/03/03(月) 12:39:53
>はァ? '送信元は1ツ'つまりソケット(接続)は一本でも、
>そんなことできるんですか? どうやって?

ソケット一本ではできません。

送信元(サーバー)は一つでも、
A,B,Cそれぞれがサーバーに接続する方法が考えられます。
(つまりソケットは三本)

あるいは、繋ぎっぱなしでなく、
A,B,Cがそれぞれ自分の仕事をする間だけ、
サーバーに接続するようにすれば、
同時に接続する数は一本にできます。
(A,B,Cが同時に通信しないとして)

もちろん、ソケットを一つだけ繋ぎっぱなしにして
応答を振り分ける方法でも可能です。

どれを選ぶべきかは、
リソースを節約しなければならないかとか、
通信頻度がどれくらいあるかとか、
Aで応答を待っている最中にBに切り替えてBでも通信する必要があるとか、
サーバーで1クライアント1接続のような制限があるとか、
によります。

επιστημη 2003/03/03(月) 12:44:58
> ソケット一本ではできません。

よね。

とこまんさん、どうなんです?

とこまん 2003/03/03(月) 13:04:31
[[解決]]
dairygoods さん、επιστημη さん

現状、サーバーで1クライアント1接続(つなぎっぱなし)と
考えておりますので メイン側で振り分ける事で実装する方向
でいきたいと思います。

いろいろ勉強になりました。
有難うございました。

古いスレッドには追加発言できません。