少し前から作っていた有名カードゲームウノをDXライブラリで作成することができました。
次のステップとしてオンラインで数人(だいたい5人前後を想定しています)の対戦を実装しようと思っています。
練習としてDXライブラリのネットワーク関連の関数を用いて小さなプログラ厶を書いている中で、疑問に思った点を質問させて欲しいと思い、書き込ませていただきました。
1.ループバックアドレスを使うと接続が成功するプログラムを使って友人に接続してもらおうとしたのですが、接続できませんでした。自分のプログラムに相手のプログラムが接続する形です。自分側のポートは開放している(ポートフォワーディングを設定している)のですが、この原因は何が考えられるでしょうか?
2.DXライブラリを使って通信する時に、使用するポートの開放は必須でしょうか?ユーザーにルーターやファイアーウォールの設定をしてもらわなくてはいけないのでしょうか?もしくはHamachiなどの仮想LANを使い接続するべきでしょうか?
3.接続するルーターのうち片方のみがポートを開放しているとき、接続された2つのプログラムはデータを送り合えますか?それとも開放している側のみがデータを受信できる、という形になるのでしょうか?
以上の点です。よろしくお願いします。
DXライブラリを使ったプログラムのオンライン通信について
- Dixq (管理人)
- 管理人
- 記事: 1662
- 登録日時: 14年前
- 住所: 北海道札幌市
- 連絡を取る:
Re: DXライブラリを使ったプログラムのオンライン通信について
5人対戦をfully connectedで接続して計算するのは難しくないですか?
VPS等のサーバーにゲームの状態を管理するプログラムを置いてそこで計算させる方が良いと思います。
そうすればルーター越えの問題もなくなります。
サーバーがポートを解放しておき、クライアントはそこに接続にいきます。これであれば個人PCのポート開放の必要はありません。
VPS等のサーバーにゲームの状態を管理するプログラムを置いてそこで計算させる方が良いと思います。
そうすればルーター越えの問題もなくなります。
サーバーがポートを解放しておき、クライアントはそこに接続にいきます。これであれば個人PCのポート開放の必要はありません。
-
- 記事: 7
- 登録日時: 9年前
Re: DXライブラリを使ったプログラムのオンライン通信について
つまりその場合クライアントは入力と描画のみを行うという形になるということでしょうか?
また、サーバー側がポートを解放しておけばサーバーからクライアントへの通信も問題なくできるのでしょうか?
また、サーバー側がポートを解放しておけばサーバーからクライアントへの通信も問題なくできるのでしょうか?
- Dixq (管理人)
- 管理人
- 記事: 1662
- 登録日時: 14年前
- 住所: 北海道札幌市
- 連絡を取る:
Re: DXライブラリを使ったプログラムのオンライン通信について
> つまりその場合クライアントは入力と描画のみを行うという形になるということでしょうか?
そうです。
極論から言えば入力情報をそのまんまサーバーに送りサーバーが全ての計算をして、どのように描画するかの命令を受けてクライアントが描画する形もあるでしょう。
俗にいうチーターがチートするのを避けるには極力計算をサーバーでやる必要があります。
そこは次第に精査して独自のプロトコルを作っていけばよいでしょう。
オンラインゲームはかなりの部分サーバーの計算に任せています。
一例としてこんな流れが考えられるでしょう。
1. Aさんが敵Xに攻撃コマンド入力
2. AさんのPCからサーバーに敵Xへの攻撃コマンド送信
3. サーバーがAさんの攻撃コマンドを受諾
4. サーバーからAさんのPCに敵Xへの攻撃コマンド許可を送信
5. コマンド許可を得て攻撃開始
これは同時にBさんが同じ敵をめがけて攻撃してAさんのPCとBさんのPCで不整合が生じないようにするためですね。
ほぼ同時にBさんが攻撃しても不整合が起きない例は以下のようなものです。
1. Aさんが敵Xに攻撃コマンド
2. 直後にBさんが敵Xに攻撃コマンド
3. AさんのPCからサーバーに敵Xへの攻撃コマンド送信
4. BさんのPCからサーバーに敵Xへの攻撃コマンド送信
5. サーバーが攻撃コマンドを計算。Aさんが早かったのでAさんの攻撃コマンドのみ受諾
6. サーバーからAさんのPCに敵Xへの攻撃コマンド許可を送信
7. サーバーからBさんのPCに敵Xへの攻撃コマンド却下を送信
8. コマンド許可を得てAさん攻撃開始
9. コマンド却下を得てBさんは何もおきなかった・・。
こんな感じです。
ちなみにファイナルファンタジー11では、
歩行時の壁の当たり判定はクライアントがやっているので、チートできる(どんな険しい道も壁すり抜けで直進できる)ということ等が有名でした。
こればっかりはレスポンスの問題があるのでどうしようもなかったんでしょうね。
もちろんお金の譲渡等の計算はサーバーがやっているので、そういうチートはできないようになっています。
どこまでクライアントでやってどこからサーバーでやるかは計算量と通信量とレスポンスの3つを天秤にかけて考える必要があります。
> サーバー側がポートを解放しておけばサーバーからクライアントへの通信も問題なくできるのでしょうか?
ソケットは繋いでしまえば送信も受信もどちらも可能です。
最初にどちらがつなぎに行くかが問題なだけですから、全てのクライアントがサーバーに接続すればルーター越え問題は考えなくて良くなります。
そうです。
極論から言えば入力情報をそのまんまサーバーに送りサーバーが全ての計算をして、どのように描画するかの命令を受けてクライアントが描画する形もあるでしょう。
俗にいうチーターがチートするのを避けるには極力計算をサーバーでやる必要があります。
そこは次第に精査して独自のプロトコルを作っていけばよいでしょう。
オンラインゲームはかなりの部分サーバーの計算に任せています。
一例としてこんな流れが考えられるでしょう。
1. Aさんが敵Xに攻撃コマンド入力
2. AさんのPCからサーバーに敵Xへの攻撃コマンド送信
3. サーバーがAさんの攻撃コマンドを受諾
4. サーバーからAさんのPCに敵Xへの攻撃コマンド許可を送信
5. コマンド許可を得て攻撃開始
これは同時にBさんが同じ敵をめがけて攻撃してAさんのPCとBさんのPCで不整合が生じないようにするためですね。
ほぼ同時にBさんが攻撃しても不整合が起きない例は以下のようなものです。
1. Aさんが敵Xに攻撃コマンド
2. 直後にBさんが敵Xに攻撃コマンド
3. AさんのPCからサーバーに敵Xへの攻撃コマンド送信
4. BさんのPCからサーバーに敵Xへの攻撃コマンド送信
5. サーバーが攻撃コマンドを計算。Aさんが早かったのでAさんの攻撃コマンドのみ受諾
6. サーバーからAさんのPCに敵Xへの攻撃コマンド許可を送信
7. サーバーからBさんのPCに敵Xへの攻撃コマンド却下を送信
8. コマンド許可を得てAさん攻撃開始
9. コマンド却下を得てBさんは何もおきなかった・・。
こんな感じです。
ちなみにファイナルファンタジー11では、
歩行時の壁の当たり判定はクライアントがやっているので、チートできる(どんな険しい道も壁すり抜けで直進できる)ということ等が有名でした。
こればっかりはレスポンスの問題があるのでどうしようもなかったんでしょうね。
もちろんお金の譲渡等の計算はサーバーがやっているので、そういうチートはできないようになっています。
どこまでクライアントでやってどこからサーバーでやるかは計算量と通信量とレスポンスの3つを天秤にかけて考える必要があります。
> サーバー側がポートを解放しておけばサーバーからクライアントへの通信も問題なくできるのでしょうか?
ソケットは繋いでしまえば送信も受信もどちらも可能です。
最初にどちらがつなぎに行くかが問題なだけですから、全てのクライアントがサーバーに接続すればルーター越え問題は考えなくて良くなります。
-
- 記事: 7
- 登録日時: 9年前
Re: DXライブラリを使ったプログラムのオンライン通信について
なるほど!オンライン対戦はそのような実装がされているのですね。
ポート関連の回答もありがとうございました。
少し道筋が立ちそうです。
ありがとうございました。
ポート関連の回答もありがとうございました。
少し道筋が立ちそうです。
ありがとうございました。