Re: 複数人数の接続 ( No.1 ) |
- 名前:管理人 日時:2008/06/26 00:25
サンプルは1対1が前提なので、接続される側のプログラムを大幅に書き換える
必要があります。大雑把で申し訳ありませんが以下の様なプログラムとなります。
---------------------------
PreparationListenNetWork 関数で待ち状態にしたらプログラムが終了するまで
StopListenNetWork は使用しない
接続されたネットハンドルを格納する為の変数 NetHandle を配列にして
サンプルでいうところの「// チャットループ」の中で GetNewAcceptNetWork を
使用して、新しい接続があったら 0番から順に格納していく(何個格納したかを
別の変数に保存しておく)
文字列が送信されてきたかどうかを接続されている数分だけループして調べる
文字列が送信されてきたら送信してきた接続以外の接続先に送信されてきた文字列を送信する
----------------------------
接続される側がホストとなって、接続する側(クライアント)は、常に
接続される側(ホスト)とだけ通信を行います。クライアントから見ると他の
クライアントのメッセージは全てホストからのメッセージのように見えるようにします。
こうすることで接続される側(ホスト)のプログラムだけを変更するだけで複数人数の
接続が可能になります。
|
Re: 複数人数の接続 ( No.2 ) |
- 名前:プログラム使用者 日時:2008/06/26 00:30
>先に接続した方としかやり取りができませんでした。
推測ですが、ネットワークハンドルを1つしか確保していないとかではないでしょうか?
基本的にDXライブラリの通信は1:1の関係です。
複数参加の場合、通信形態はクライアント‐サーバー型、P2P型がオーソドックスでしょうか。
3台で通信を行う場合、(A、B、Cとする)
クライアント‐サーバー形式では、
1:ハンドルA-B
2:ハンドルA-C
つまり、サーバー(A)では、接続する人数分のハンドルを確保する必要があります。
クライアントではサーバとの通信用に1つ確保。
※Bのチャット内容を、Aに送信しさらにCに転送する
P2Pでは、
1:ハンドルA-B
2:ハンドルA-C
3:ハンドルB-C
この場合は、各クライアントが(接続人数-1)分(自分除く)のハンドルをそれぞれ確保し、それぞれに対してデータも送信する必要があります。
※Bのチャット内容を、Aに送信し、さらにCにも送信する
|
Re: 複数人数の接続 ( No.3 ) |
- 名前:ライブラリ使用者 日時:2008/06/26 00:46
プログラム使用者→ライブラリ使用者(前に使用した名前を間違えました。。
続き書こうとして、管理人様と被ったので簡略しよっと。
クライアント式の方は管理人様の方で説明されたので、P2Pのほうだけもうちょい補足。
DXライブラリでは(?)、この方式は処理がメンドイと思います。
基本的にはソフトを作成してる立場のsyeさんがサーバー側のソフトを立ち上げることになると思いますので、クライアントに対して接続IPを教えるという手順がかなり簡素化できるますが、P2Pでは他の人のIPを取得しそれを接続PC全員に通知しなければなりません。
ここでいくつか問題が
・接続IPなどの情報を知られたくない人がいないか
・クライアント側の処理の重さ
・どこに記載あったか忘れたのですが、使用ポートの問題もあります。デフォルトだと通信用に10000番を使用してるらしいのですが、これはルータなどの設定でいじってやらないといけません。
(これを他人に強制させるようなソフトはあまり感心しないでしょう
|
Re: 複数人数の接続 ( No.4 ) |
- 名前:sye 日時:2008/06/26 02:11
なるほど、それぞれハンドルを分ける必要があるのですね。形にしていくのは大変そうですが、方向性が分かったのでなんとかなりそうです。
サーバー/クライアント型を前提に進めるつもりでいますが、
P2P型の仕組みはよくわかっていなかったので勉強になりました。
大変参考になりました。有難う御座いました。
|