ゲームサーバー構築について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
coco

ゲームサーバー構築について

#1

投稿記事 by coco » 9年前

過去の質問を調べていたのですが、ピンとくるものが無かったため質問させて下さい。

現在コンシューマ向けにオンラインゲームの企画を考えているのですが、そこで用いられるサーバー関連の知識について。
オンラインはP2Pではなくサーバーを介したMMO形式(作るゲームはMMOではないですが)です。
一応C++とDXライブラリを予定しております。

自分の知識としてはスマホゲームでサーバーと通したリアルタイム対戦ゲームをサーバーサイド含めて書きました。
(JavaとPHPとMySQL)
ただ会社の方針としてHttpによる通信しか使用を許されなかったため、リアルタイムといえど同期に時間が掛かるタイプをご想像下さい。

本題のコンシューマオンラインについて。
どういった作り方をすれば良いのか不明瞭なため、今自分が漠然と想定している計画を見てみて下さい


サーバーの用意
さくらVPSをレンタル

ログインサーバー
データベースに顧客テーブルを作成し、ログイン処理(PHPとHTTPによるPOST通信で可?)
IDから受け取ったLvなどのステータスデータは変数なりに入れて保持しておく

マッチングサーバー
後回し
いずれゲームIDを発行し、マッチングしたプレーヤーを紐付ける処理を行う予定

ゲームサーバー
ゲームIDによる部屋毎で座標などの情報を相互通信(何の情報をやり取りした方が良いかについてはいずれ別の質問を立てるかもしれません。
HTTP通信ではなく、しっかり同期させたい。
個人的にWebSocketを使ってみたいなと考えてましたが、何かお勧めの方法が御座いましたら御願いします。
ここはかなりさっぱりな部分。
ひとまずチャットだけ行う予定です。


取り敢えずゲームメインまで来たらチャットを行うだけとして

Q1
これらサーバーを一つのサーバーで動かすとしたらどのくらい容量が掛かるものでしょうか?(3GBのプランがお勧め等)
ゲームの内容によると思いますので、取り敢えずチャットの文章30文字くらいが行き来するものと過程して御願い致します。

Q2
サーバーからも能動的に通信が行える相互通信?でお勧めなもの
将来的に格闘ゲームタイプの極度に同期が必要なゲームになっていくかもしれませんので、それに適したものであると助かります。
(素人プログラムなので同期に関してはある程度妥協する予定です。)

Q3
C++,PHP,MySQLの知識だけで足りるのか、他に必要な知識など。
Q2で扱うものの知識は必要となりそうです。
Linuxに関して完全に未知の領域なため興味あるのですが、果たして必要となるのでしょうか・・・。


宜しく御願い致します。

アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前
住所: 東京
連絡を取る:

Re: ゲームサーバー構築について

#2

投稿記事 by h2so5 » 9年前

coco さんが書きました:過去の質問を調べていたのですが、ピンとくるものが無かったため質問させて下さい。

現在コンシューマ向けにオンラインゲームの企画を考えているのですが、そこで用いられるサーバー関連の知識について。
オンラインはP2Pではなくサーバーを介したMMO形式(作るゲームはMMOではないですが)です。
一応C++とDXライブラリを予定しております。
DXライブラリで開発できるのはWindows用ゲームのみで、家庭用ゲーム機には使えません。
coco さんが書きました: Q1
これらサーバーを一つのサーバーで動かすとしたらどのくらい容量が掛かるものでしょうか?(3GBのプランがお勧め等)
ゲームの内容によると思いますので、取り敢えずチャットの文章30文字くらいが行き来するものと過程して御願い致します。
ユーザー数に依存します。
文章のやりとりだけでもTwitterのような規模だと多くのサーバーが必要です。
coco さんが書きました: Q2
サーバーからも能動的に通信が行える相互通信?でお勧めなもの
将来的に格闘ゲームタイプの極度に同期が必要なゲームになっていくかもしれませんので、それに適したものであると助かります。
(素人プログラムなので同期に関してはある程度妥協する予定です。)
普通にTCPかUDPを使うことになると思います。
ブラウザから接続しないのであればWebsocketを使うメリットはありません。
オンラインゲーム用のツールキットを使う方法もあります。
coco さんが書きました: Q3
C++,PHP,MySQLの知識だけで足りるのか、他に必要な知識など。
Q2で扱うものの知識は必要となりそうです。
Linuxに関して完全に未知の領域なため興味あるのですが、果たして必要となるのでしょうか・・・。
LinuxとTCP/IPに関する知識は必要だと思います。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: ゲームサーバー構築について

#3

投稿記事 by softya(ソフト屋) » 9年前

サーバーに関しては、ApatcheなどのHTTPサーバーを使わず自前のTCP/IPやUDPのサーバーを作ってしまえばなんとでもなります。この場合はC++を使うことになるでしょう。さくらVPSなら運用可能です。MySQLサーバーにはC++で通信するわけですね。それやこれやで、難易度は高くなります。
サーバーを借りる場合、MMOとかは運用をどうするか接続ユーザー数などが問題になるんですが、実験規模程度なら自分のPC上の仮想PCでやっても十分です。と言うか、そこでノウハウを貯めてからサーバーを借りてくださいね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

coco

Re: ゲームサーバー構築について

#4

投稿記事 by coco » 9年前

>>h2so5さん
ご返答有難う御座います。
コンシューマではなくWindows用ゲームです、失礼しました。
ユーザー数は三名以内を想定しております。

まだ知識が無い状態で申し訳ないのですが、UDPの場合ポート開放などはしなくても大丈夫なのでしょうか?
個人的なイメージとしてUDPはホストがポート番号を指定して子がそれに参加するという形だと考えておりました。

UDPを使う場合の全体イメージとしては

クライアントサイドはUDPによる通信部分記述
Linuxでゲームサーバー構築(手法はまだ勉強してないため分かりません・・・。
Linux上でPHP?などによるサーバーサイドの通信部分を記述

この様な形で正しいでしょうか?

coco

Re: ゲームサーバー構築について

#5

投稿記事 by coco » 9年前

>>softyaさん
自前でテストするには専用のサーバー機器を用意しないといけないかと勘違いしておりました。
Apacheは昔触れていた事があるので使ってみたいと思います。

>MySQLサーバーにはC++で通信するわけですね。それやこれやで、難易度は高くなります。

この部分に含みがある様に感じられたのですが、何かお勧めの別の方法はありますか?
特にPHPやMySQLで頑張りたいという訳ではなく、ただ単に今現在知識としてあったので流用出来ないかと考えていただけです。
そのため拘りはありません。

今一番不安な要素はセキュリティ面です・・・。
暗号化通信自体は既に会社でも行ってますが、低レベルなdos攻撃であっても捌けるのかどうか・・・。

アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前
住所: 東京
連絡を取る:

Re: ゲームサーバー構築について

#6

投稿記事 by h2so5 » 9年前

UDPはサーバー側がポートを開放していれば問題ないことが多いです。
一度クライアントからサーバーへパケットを送信すれば、サーバーからクライアントへのパケットはUDPホールパンチングで通過できます。
ただし、ルーティングテーブルを維持するために一定期間ごとにパケットをやりとりする必要があります。

しかし、UDPが利用できないインターネット環境もたまに存在するので、そういう場合はサポート対象外にするか、かわりにTCPで通信する必要があります。

アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前
住所: 東京
連絡を取る:

Re: ゲームサーバー構築について

#7

投稿記事 by h2so5 » 9年前

C++とBoost.Asioでゲームサーバーを書いたことはありますが、C++でゲームサーバーを書くのは結構面倒です。
パフォーマンスを考えるとC++は有利ですが、規模が大きくないのであれば Python, Ruby, Go, C# などの書きやすい言語を試したほうがいいかもしれません。MySQLへの接続もC++に比べると簡単です。

PHPでもUDPは使えるので書けないことはないですが、PHPはデーモンに向いてないと思うのでお勧めはしません。

アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前
住所: 東京
連絡を取る:

Re: ゲームサーバー構築について

#8

投稿記事 by h2so5 » 9年前

あと、ユーザー数3人というのは同時接続数のことでしょうか?
本当にユーザーが3人しかいないならサーバー借りるほどのものでもないと思いますが。

coco

Re: ゲームサーバー構築について

#9

投稿記事 by coco » 9年前

>>h2so5さん
有難う御座います。だいぶ分かってきました。
Apacheサーバーを構築してからサーバー側はC#で書いてみようと思います。

同時接続数は今後増えるかもしれませんが、当面三人で上手く行く様になるまでは考えておりませんでした。
(サーバーや通信関係の勉強という目的が強いため、通信部分が完成した後に作品を世に出すとかはあまり考えてません。
(こうしたのは運営するのも億劫ですし、そもそも遊ぶプレーヤーも居ないでしょうから)
土台さえしっかり作ってあれば同時接続数を増やす事自体は可能だと思いますので、もし公開するとしたらそこで通信量などを見つつ限界を決めようかと思います。

YuO
記事: 947
登録日時: 13年前
住所: 東京都世田谷区

Re: ゲームサーバー構築について

#10

投稿記事 by YuO » 9年前

coco さんが書きました:Apacheサーバーを構築してからサーバー側はC#で書いてみようと思います。
今のタイミングでサーバーがApache + (mod_mono + XSP + mono +) C#はあまりお薦めしませんが……。
ASP.NET 5の進み具合次第で,最適解が変更になる可能性が高い分野ですし。
オフトピック
ちょうど.NET CoreのOSS化,.NET Server FrameworkのLinuxへの提供,kなどの実装が現在進行形で進んでいるところのため
coco さんが書きました:土台さえしっかり作ってあれば同時接続数を増やす事自体は可能だと思いますので、もし公開するとしたらそこで通信量などを見つつ限界を決めようかと思います。
同時接続数を増やすのはそう簡単ではないですよ……。
特にデータベースへの書き込み系はちゃんと考えて作っておかないといけません。
しかも,接続数が少ないと,その作業は単なる無駄になりますし。

coco

Re: ゲームサーバー構築について

#11

投稿記事 by coco » 9年前

>>Yu0さん
ではどの様な手法を用い、サーバー構築には何がお勧めなのでしょうか

サーバー系は知識が無いので、自分でそうした判断が付けれず困惑しております・・・。
駄目出しだけされると八方塞りになってしまい動き出せないため、何か代替案を頂けると助かります。
(今まさにApache環境を整えてた所だったので、間に合って良かったといえば良かったです・・・orz)

同時接続数を増やすのは大変という事も身をもって経験していないため、そこに関しては当たって砕けてみる予定です。
現段階ではかなり先の話に感じます。
仮にサーバー側のプログラムを大幅に書き換える事になっても少人数通信で得た知識が無くなる訳ではないので、まっさらの今よりは
再構築し易いと思います。
(まずはサーバーを介して少人数の通信を目標にして始めたいと思っております)

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: ゲームサーバー構築について

#12

投稿記事 by softya(ソフト屋) » 9年前

要件によってやることが変わってくるので、大規模MMOと小規模MMO?では同列には出来ないと言うことだと思います。
はっきりさせてほしいことは、
・そのまま大規模に移行できないけど、それで良いのか。
・勉強用で時間がかかっても良いのか、それとも出来るだけ早く実装したいのか。
・どこまで自分で実装したいのか。
あたりの情報ではないでしょうか。

それと検討して欲しいのでが、すでにちょろっと出てますが
「Photonとは|Photon Realtime 日本スペシャルサイト」
http://photoncloud.jp/features/
こういうサービスを利用すれば、少人数は無料から始められます。サーバーもあります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

coco

Re: ゲームサーバー構築について

#13

投稿記事 by coco » 9年前

>>softyaさん
最初から大規模を目指しても挫折するだけなので小規模で構わないです。

時間が掛かっても良いかどうかについては、それは早い方が良いですが・・・特に期限はありません。

特にここは独自で実装したいという部分はあまりありません。
通信処理が必要なので頑張って勉強しようという程度です。

今はLinuxをインストールしておりました。

Photonについて調べてみましたが、これは先ほどの話においてどの役割をするのでしょうか・・・?
サーバーもあり、UDPの代わりとなる独自の通信も行える?
Unityとの親和性は高いみたいで関連記事は多いですが、C++で調べてみると全然ヒットせずしっかり理解して扱えるのか自信がないです。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: ゲームサーバー構築について

#14

投稿記事 by softya(ソフト屋) » 9年前

私も使ったことが無いですが、Win32SDKがあるので使えるはずです。
そうですね。ゲームのオンライン(通信)部分のDXライブラリのような物です。
SDKを使ってオンラインの部分のみを記述します。ゲームの部分はDXライブラリで良いはずです。
とりあえずチャットを試してみては?
【訂正】サーバーとリアルタイムはWin32SDKがあるけど、チャットは.Net版しか無いです。
サーバーをちょっと試すわけには行かないのでチャットはRealtimeで出来るか検討する必要があります。


自分でやったら1ヵ月以上かかるものが2から3日で実装できそうな感じですけどね。
ましてやサーバーとなれば年単位で時間がかかると思いますが、1ヶ月とかで出来るかもしれませんよ。

>サーバーもあり、UDPの代わりとなる独自の通信も行える?

UDPに+αのRUDPが使えますね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

coco

Re: ゲームサーバー構築について

#15

投稿記事 by coco » 9年前

今だ理解出来ないのですが、仮にPhotonを使用する場合、RealTimeの方を使う必要はあるのでしょうか?
どうもServerの方で完結出来てしまいそうな?

無料なので一応挑戦はしてみますが、恐らくsoftyaさんが想定している期間ではまず出来ないと思います。
先人が作った道の上を進むのと、未開拓の部分を進むのとでは難易度が違いますし、そもそも本当に実現可能かの保障がないですから・・・。
特に自分の技術不足が原因で実現出来ないのか、仕様上無理なのかの判断が出来ない(技術不足のため)のも開発が難航しそうに思えます。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: ゲームサーバー構築について

#16

投稿記事 by softya(ソフト屋) » 9年前

coco さんが書きました:今だ理解出来ないのですが、仮にPhotonを使用する場合、RealTimeの方を使う必要はあるのでしょうか?
どうもServerの方で完結出来てしまいそうな?

無料なので一応挑戦はしてみますが、恐らくsoftyaさんが想定している期間ではまず出来ないと思います。
先人が作った道の上を進むのと、未開拓の部分を進むのとでは難易度が違いますし、そもそも本当に実現可能かの保障がないですから・・・。
特に自分の技術不足が原因で実現出来ないのか、仕様上無理なのかの判断が出来ない(技術不足のため)のも開発が難航しそうに思えます。
そうですね。私が使っていなんですから保証はできません。
無理してやらなくて良いんですよ。出来るかもって話に過ぎません。
こういうのもあるって話です。手がかりのある方が良いかなと思ったんで。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前
住所: 東京
連絡を取る:

Re: ゲームサーバー構築について

#17

投稿記事 by h2so5 » 9年前

フレームワークは開発の効率を上げるものであって、知識が無くても開発できるというわけではありません。
PhotonはC++のドキュメントがあまり充実していないので入門には不向きかもしれません。

coco

Re: ゲームサーバー構築について

#18

投稿記事 by coco » 9年前

再びごめんなさい。

一体何を勉強したら良いのかを見つけるために色々調べてますが、やはりどうしてもUDPの仕組みを理解出来ませんでした。

PHPとMySQLを用いる場合
クライアントサイド

PostなりGet通信によってHttpリクエストを送る(サーバー上にあるPHPファイルを指定)
これによりPHPに記述してあったMySQLへのコマンドが実行される

そのためサーバー側から能動的に通信が行えない。(WebSocketは別)


UDPの場合

サーバーを介さないのであればDXライブラリのリファレンスより、相手のIPアドレスや開放するポート番号の指定などにより
通信が行える仕組みが分かり、PHPのものより直感的で理解し易かったです。

しかしこれにサーバーが加わる場合どの様な関係となるのでしょうか?

今考えていたのはサーバー上でDXライブラリによって制作した通信のみのプログラムを常時起動しておく
(例えばゲーム開始後であれば毎フレームごとに座標を受信、送信したり?

こんなことは恐らく不可能だと思い、一体何を作れば良いのか、最初の方に出たLinuxは何処で関わってくるものなのかが掴みかねております。
(最初はレンタルサーバー内にサーバースクリプトを置くだけくらいのイメージでした。)
(恐らくDXライブラリのリファレンスを使わず独自の通信プログラムを組み、サーバースクリプトを呼び出せる様に書けそうですが
サーバーから能動的に通信を行うにはどうしたら良いのやら・・・。Photonもクライアントから送る方はわからなくもないですが、
サーバー側の仕組みが分かりません)

上手くこの辺りを説明して頂けると本当に助かります。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: ゲームサーバー構築について

#19

投稿記事 by softya(ソフト屋) » 9年前

通信内容に関しては、こちらを参考にしてプログラムを動かしてもらってWireSharkなどでパケットキャプチャして勉強してもらうのが良いかと思います。
ただし、ローカルパケットはキャプチャできないので、もう一台PCが必要です。 仮想PCでもキャプチャできると思います。
「Geekなぺーじ:winsockプログラミング」
http://www.geekpage.jp/programming/winsock/

サーバーからの能動的な通信は一般的なレンタルwebサーバーの場合cron以外で起動できませんので、外からのトリガが必要です。
vpsサーバーなら自前のサーバプログラムを作れればなんとでもなりますけどね。

例えばチャットなどはクライアントの送信→サーバー受信→関連クライアントへの送信で実現したいことですがUDPだと届く保証がないので、こういう場合には使えません。
チャットなどは接続してるクライアントは常にサーバーにTCP接続してお伺いを立てる事で送受信を実現します。
(1)送信クライアントの送信 → サーバーが受信 → データベースに保存
(2)受信クライアントの問い合わせ → サーバーが受信 → データベースを検索 → サーバーが返信 → 受信クライアントがデータを受け取る。
こうするのが確実です。まぁ必然的にHTTPの仕組みと同じです。

ちなみにLinuxが出てくるのはレンタルサーバーがLinuxが安いというか通常Linuxを使うからです。
LinuxでDXライブラリは動きませんので、別のサーバープログラムを用意する必要があります。
そこでHTTPのサーバーであるApacheサーバーなどを使うか、自作のサーバーを使うか検討する必要が出てくるわけです。

質問の答えになっているか分かりませんが、やらないとイメージわかないと思いますので、とりあえず手を付けられるものから手を付けてみてください。
PCのオンラインゲームのパケットをキャプチャしてみるのも良いかと思います。

>(例えばゲーム開始後であれば毎フレームごとに座標を受信、送信したり?

通信ですので、クライアント→サーバーで最悪100msぐらいを見る必要があります。
P2Pよりもサーバーを介する分だけ通信時間が長くなります。
クライアント→サーバー→クライアントだと最悪200ms程度は覚悟してください。
つまり最悪の場合、5フレーム分の情報しか送れません。
サーバーを介するのはUDPと言う最速を狙ったプロトコルを使う意味が薄れるわけです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

coco

Re: ゲームサーバー構築について

#20

投稿記事 by coco » 9年前

>>softyaさん
ご返事有難う御座います
出先からのためまだあまり確認出来てないですが、少し思いついた事がありましたので


マッチング部分までをサーバー経由した通信にし、この段階で送信してきたクライアントのIPなどを保存しておく

ゲーム部分ではクライアントの誰かをホストに切り替え、サーバーとは通信を行わない
(必要なIPアドレスなどはマッチング通信部分で記憶していく

これならゲーム部分においてクライアント同士が相互に通信する一般的なUDP通信となり、
速度も速いのでは?と思いました


これは可能なものでしょうか?

これが出来ればマッチング部分まではそれこそPHP,MySQLでも問題ないですから(ソケットによるTCP通信で書く予定ですが)
実装難易度がだいぶ下がる様な気がしてかなり良い気がしております

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: ゲームサーバー構築について

#21

投稿記事 by softya(ソフト屋) » 9年前

マッチング部分までをサーバー経由した通信にし、この段階で送信してきたクライアントのIPなどを保存しておく

ゲーム部分ではクライアントの誰かをホストに切り替え、サーバーとは通信を行わない
(必要なIPアドレスなどはマッチング通信部分で記憶していく

これならゲーム部分においてクライアント同士が相互に通信する一般的なUDP通信となり、
速度も速いのでは?と思いました
それが俗に言うマッチングサーバー方式です。
マッチングだけをサーバーで行いあとは、クライント同士で通信します。
対戦格闘系とは、だいたいこれだと思います。
全部をサーバーが受け持つ必要があるのは、MMOでサーバー内にゲーム世界がありますので、これは高負荷のためサーバーをC++で専用に組まれることが多いように思います。

過去ログにあると思いますが、
「オンラインゲームを支える技術 -- 壮大なプレイ空間の舞台裏」
http://gihyo.jp/magazine/wdpress/plus/9 ... 580-8/0002
と言う本にだいたい解説されていると思います。読まれた方が良いと思いますよ。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前
住所: 東京
連絡を取る:

Re: ゲームサーバー構築について

#22

投稿記事 by h2so5 » 9年前

どういったゲームが作りたいのか具体的なところが決まらないとネットワークのデザインはできません。
マッチングだけサーバーで行うという方法は1vs1ならそれほど難しくないとはいえ、複数人に対応しようとすると難易度が上がります。
MMO形式にしたいのであればすべてサーバーを経由させたほうが簡単です。

マッチングにしても、ポーリングで実現するつもりなのかTCPのコネクションを維持して更新をプッシュするつもりなのか方針がよく分かりません。

coco

Re: ゲームサーバー構築について

#23

投稿記事 by coco » 9年前

>>softyaさん
明日買ってみようと思います

>>h2so5
マッチングサーバーの処理なのですが

クライアントが参加リクエストをサーバーへ送る

サーバー側はデータベースを検索し、各部屋の空き状況を作る
(ここでランク毎に入れる部屋を分けたり、同時接続数限界であれば弾く)

空きのある部屋があればそこへ参加、まだ部屋が無ければ新規作成しホストとなる

こんな感じを想定してましたが、違いますか?
これなら似た様なのを組んだ事あります(PHP,MySQLですが)


今完成図のイメージとしては、もうこれは本当理想系で恐らく到達出来ないと思いますが・・・

マッチングサーバーで各部屋8人集まるまで待機
集まったらゲームスタート
ゲーム自体はスマッシュブラザーズの様なタイプのゲーム(そのためリアルタイム性は出来れば欲しいです)

この様な形になっております。
そのため自分がMMOタイプと言ってしまった事がいけなくて、恐らくオンライン格闘ゲームの方が感覚としては近いかもしれません。


マッチングは前述した形で部屋に入れるまではクライアントがサーバーへリクエストを送り続ける

入った後は自分の現在の知識で構築するなら各クライアントがやはりサーバーへリクエストを送り、返り値で他クライアントの情報を頂くという形でしょうか

恐らくTCPのコネクションを維持して更新をプッシュするつもり、に該当するのかな・・・?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: ゲームサーバー構築について

#24

投稿記事 by softya(ソフト屋) » 9年前

coco さんが書きました:>>softyaさん
明日買ってみようと思います

>>h2so5
マッチングサーバーの処理なのですが

クライアントが参加リクエストをサーバーへ送る

サーバー側はデータベースを検索し、各部屋の空き状況を作る
(ここでランク毎に入れる部屋を分けたり、同時接続数限界であれば弾く)

空きのある部屋があればそこへ参加、まだ部屋が無ければ新規作成しホストとなる

こんな感じを想定してましたが、違いますか?
これなら似た様なのを組んだ事あります(PHP,MySQLですが)
大きくは外していないと思いますが、これが正解と言うのは無いと思います。
みんな、自分の趣味で決めているとかノウハウで決めているだけで、これじゃないとダメってのは無いと思うんですけどね。
これは作りながら試行錯誤する部分じゃないでしょうか。
coco さんが書きました: 今完成図のイメージとしては、もうこれは本当理想系で恐らく到達出来ないと思いますが・・・

マッチングサーバーで各部屋8人集まるまで待機
集まったらゲームスタート
ゲーム自体はスマッシュブラザーズの様なタイプのゲーム(そのためリアルタイム性は出来れば欲しいです)

この様な形になっております。
そのため自分がMMOタイプと言ってしまった事がいけなくて、恐らくオンライン格闘ゲームの方が感覚としては近いかもしれません。


マッチングは前述した形で部屋に入れるまではクライアントがサーバーへリクエストを送り続ける

入った後は自分の現在の知識で構築するなら各クライアントがやはりサーバーへリクエストを送り、返り値で他クライアントの情報を頂くという形でしょうか

恐らくTCPのコネクションを維持して更新をプッシュするつもり、に該当するのかな・・・?
メーカー製でも8人の格闘系は余り見たことないような。特にゲーム機。
パケットの相互受信、ロストパケットの補完、現在位置の予想など、かなりやることが多いのでちゃんと制御できないかも知れませんね。
厳密にやり過ぎなければ出来るのかもしれませんけど。

こんなのがあるので。パケットを見て勉強させてもらいましょう。
「ゲットアンプドX[PC] - 4Gamer.net」
http://www.4gamer.net/games/030/G003062/

[更に追記]
「【CEDEC2014】遅延問題を錯覚利用で解決?! 「世界のみんなは4フレーム以内にいる」 - GAME Watch」
http://game.watch.impress.co.jp/docs/ne ... 65316.html
こういう記事は時々あるのでネットを丹念探せば出てきますよ。CEDEC関係で参考になるものは結構あります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

coco

Re: ゲームサーバー構築について

#25

投稿記事 by coco » 9年前

色々試行錯誤をしてサーバーをレンタルし、ログインサーバーとマッチングサーバーは構築出来ました。

(取り敢えずC++とPHPによるHTTP通信で同期通信により実装しております。後で非同期に書き直す予定です。

グローバルIPも取得出来る様にし、自分のローカル内でテストしようと思ったのですが、上手く出来ず再び質問をさせて下さい。


自分のネットワーク環境はルーターによって2PCへと分けているため、グローバルIPは2PCとも同じになります。
(ルーターはUPnPを使用可能にしてます。)

そのためDXライブラリの通信リファレンスを用いるにはこの同じローカル内のPCにおいて受信ポート番号を違うものにする必要があると考えました。
まずこの考えは正しいでしょうか。

次に受信ポート番号を変更してみても上手くいかず、ポート開放がされてないためだと気付き、ポート開放プログラムを
http://dixq.net/forum/viewtopic.php?f=3&t=8488
を参考にさせて頂き組みましたが、

コード:

// ポートマッピング
	int port = portNum;
	IStaticPortMapping *map;
	maps->Add(port, proto, port, localIPBstr, VARIANT_TRUE, description, &map);
この部分でmapsがNULLのままなためエラーで落ちます。
get_StaticPortMappingCollection(&maps);でmapsに正常な値が送られていないためですが、何故ここでエラーが起きるのか分からず困っております。

Windowsファイアーウォールの設定でテストに使うUDPポート番号はブロックしないように設定してあります。

アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前
住所: 東京
連絡を取る:

Re: ゲームサーバー構築について

#26

投稿記事 by h2so5 » 9年前

LAN内でテストするときはグローバルIPアドレスではなくローカルIPアドレスを使用してください。

coco

Re: ゲームサーバー構築について

#27

投稿記事 by coco » 9年前

それで出来るという話は見ていたのですが、今後本稼動をする際にはどうすれば宜しいのでしょうか?
一般的にLAN内で2台のPCがあったとしても同じオンラインゲームでマッチングする事は可能だと思いますので、どうしているのかなぁと。

グローバルIPからプライベートIPへの変換はルーターが行うので、グローバルIPとポート番号さえしっかりしていれば大丈夫だと考えたのですが・・・。

アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前
住所: 東京
連絡を取る:

Re: ゲームサーバー構築について

#28

投稿記事 by h2so5 » 9年前

本稼動の話に飛躍していますが、結局ローカル内でのテストはできたのですか?

ローカル内のPCであってもローカルの受信ポート番号を変える必要はありません。
区別する必要があるのはルータ側のグローバルのポート番号です。

get_StaticPortMappingCollectionが失敗するのはルーター側の問題などいろいろ考えられます。

coco

Re: ゲームサーバー構築について

#29

投稿記事 by coco » 9年前

プライベートIPを使ったローカル内でのテストであれば出来ています。

coco

Re: ゲームサーバー構築について

#30

投稿記事 by coco » 9年前

友人とグローバルIP同士のUDP通信は失敗(友人にもポート開放処理を試してみましたが、自分と同じくmapsにNULLが入る状態)
PHPとMySQLは友人からでも無事に接続出来、グローバルIPは取得出来ました。

DXライブラリ通信リファレンスにあるUDP送信、受信プログラムほぼそのままですが、IPに通信相手のグローバルIPを入れ、ポート番号をサーバーと同じ番号に指定しています。

これで通信が失敗しているのはやはりポート開放が上手くいっていないからでしょうか?
仮にポートを手動で開放しても同一LAN内の問題は残る気がしてますが・・・。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: ゲームサーバー構築について

#31

投稿記事 by softya(ソフト屋) » 9年前

そうですね。テスト手順がおかしいと思います。
こちらから見て確実ではないもの。
1.ルータのポート解放
2.送り先のIPアドレスとポート番号
3.DXライブラリの送信
4.DXライブラリの受信動作

3.4.に関してはローカルテスト済みだと思いますが、3はパケットキャプチャなどで実際に狙ったパケットが送信されていることは確認済みですか?
あとUDPでテストするのではなく、最初はエラーが分かるTCP/IPで接続試験をすべきかと思います。
最終結論に向かって急ぎすぎですので、一歩一歩確実に足場を固めてテストを遂行しないと分けがわからなくなります。

1.2に関しても、自分のプログラムでは無く確実に動作する有名ツールを使って先に検証されるべきかと思います。

>これで通信が失敗しているのはやはりポート開放が上手くいっていないからでしょうか?
>仮にポートを手動で開放しても同一LAN内の問題は残る気がしてますが・・・。

ポートフォワーディングでポート番号と配信ローカルIPアドレスは結びつくので、ローカルに2つ接続するならポート番号は変える必要があると私は思います。
ただ、h2so5 さんほどの知識がないので間違っているかもしれません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前
住所: 東京
連絡を取る:

Re: ゲームサーバー構築について

#32

投稿記事 by h2so5 » 9年前

以前も似たようなことを書いた気がしますが、分かりにくかったようなので説明します。

ローカル内で通信する場合

ローカルIPアドレスで区別できますので、同じ番号のポートを使用できます。
192.168.100.1:3930 <---> 192.168.100.2:3930
ルーター越しに通信する場合

ルーターの外側ではポート番号を分ける必要がありますが(これはポート開放時に指定する)、
ルーターから先はローカルIPアドレスで区別できますので、同じ番号のポートを使用できます。
 
             ---> 98.139.183.24:3930 <---> 192.168.100.1:3930
49.212.156.142:2000 <---|     ルーター
             ---> 98.139.183.24:3931 <---> 192.168.100.2:3930
クライアント側では、他のプログラムがポートを使用しているとか、ポート開放の関係上番号に制限がある場合を除いてポートを変更する必要はありません。

coc

Re: ゲームサーバー構築について

#33

投稿記事 by coc » 9年前

プログラムによるポート開放はルーターの種類によって異なるらしく、諦めました。

大人しくUDPホールパンチングに切り替え、自分でゲームサーバーを作り現在通信テストしております。

手法として
PC_A,_Bとサーバー

【同時に行われる処理】(失敗しない限り、一度のみ行う)
PC_A から サーバーへダミーを送信し、サーバー側でIPと使用されたポート番号を取得 →データベースへ保存
PC_B から サーバーへダミーを送信し、サーバー側でIPと使用されたポート番号を取得 →データベースへ保存

【上の処理が完了次第リクエストを送る】
サーバーへ送信後は互いに相手のIPアドレスとポート番号を取得しにいき、取得出来次第UDP通信に切り替えて相互に通信を行う。

という処理を書きましたが、通信出来ませんでした。
この手順は正しいでしょうか?

グローバルIPは正しいものが取得できている事を確認済。
そのためポート番号が原因だと予想しております。
ただサーバーとソケット通信を行ったポート番号であれば大丈夫なはずなので今いち分り兼ねておりますが・・・。

WireSharkで覗いているのですが、未だに使い方を把握出来ておりません。
ただポート開放検証時には赤色のログが表示されパケットがリジェクトされた旨が表示されていましたが、
今回のUDP通信では赤色ログは一切表示されませんでした。(どれも正常な色のものばかりなため、これも訳が分からない状態です・・・)

全く同じ手法で
サーバーにセットされたグローバルIPが同一のものであった場合、IPデータをローカルIPに切り替えて通信を行う
という例外処理も書きましたが、こちらは正常にデータのやり取りが行われておりました。

coc

Re: ゲームサーバー構築について

#34

投稿記事 by coc » 9年前

あぁもしかして

PC_Aからサーバーへデータを送った後、

PC_BはサーバーからPC_Aの情報を受け取り、

PC_Aが何か別のアクションを起こす前にPC_Bからデータ送信に対する受信を行わないといけないのかな・・・。

もう少し検証してみます。

daive
記事: 11
登録日時: 9年前

Re: ゲームサーバー構築について

#35

投稿記事 by daive » 9年前

【思考実験】
フレッツであれば、プロバイダと、フレッツOCN-サイトと、の接続方法が案内されます。
⇒これは、何を意味しているでしょうか?
 但し、東日本管内、西日本管内、各々同一管内に限る。

光回線、または、ADSL回線、何れか1本、
ブロードバンドモデム+ルーター+VOIPアダプタ(といいつつ、ルータでしたよね)
何をしていたでしょうか?

光2回線の契約を使って、光回線1本で、
どの様な形態の、プロバイダ接続が、可能でしょうか。
東は東、西は西、は仕様が変わらない、プロバイダが規制しなければ○○です。
NTT東西、光2回線以上の契約を使って、
設置場所が異なる、接続は、どうなるのでしょうか。
⇒東の契約を西、西の契約を東では使えません。ざんねーん。
 ドコモ網は、どこで契約しても、全国で使えます。

注意、思考実験です、実際に行なわないでください。

では、契約違反にならないであろう、接続形態は?
ブロードバンドルーター+Wifiルーター:無線スポットとして使う。LAN端子付も可。
この構成で、
ブロードバンドルーター系の、IPアドレス
Wifiスポット系の、IPアドレス
が、独立して設置できるので、
自前で、ルーティングの設定と確認が可能になるかも。
(ダブルルーターにしても良いのですが、動作しない時が面倒なので)

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: ゲームサーバー構築について

#36

投稿記事 by softya(ソフト屋) » 9年前

すいません。私の提案はどこまで確認されたのでしょうか? 
wireSharkを使っているぐらいしか情報がありません。相変わらず情報が不足していると感じております。
追試可能な簡単なサンプルコードやら、実際にやった具体的なことを書かないと情報が錯綜するだけと思われます。
※ まとめられた情報で大事なことが欠落しているようにみえます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

coco

Re: ゲームサーバー構築について

#37

投稿記事 by coco » 9年前

有名ソフト(UPnPやポート開放君)なども試してみましたがダメでした
しかしサーバーの設定を修正した事により、サーバーとクライアント間の通信は行える様になりました。
(そのためサーバーへUDPパケットを送信して、サーバーでパケット解析を行いクライアントのIPとポート番号を取得出来ています。)
recvform関数を用いています。

UDPホールパンチングにおいてポート開放は不要なのでこの手法を選択しています。

一つのクライアントだけで完結出来る処理ではないので実行可能なサンプルコードと言われましても困ってしまいます。
(現在グローバルIPを二つ所持していてレンタルサーバーなどのサーバーを持っている人は居ないと思いますので)

具体的な処理は既に書きましたが、どの様な点が分かりにくかったでしょうか?
何の情報が欠落しているのか指摘して頂ければお答え致しますが、UDPホールパンチング自体について聞かれても自分自身初めての
挑戦なため、正しい答えを返せる自信はありません・・・。
(そもそもこの処理を作った経験のある人は中々見つからないかもしれないので、解答を得るのは難しいかなとも思ってます・・・。)

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: ゲームサーバー構築について

#38

投稿記事 by softya(ソフト屋) » 9年前

足らない情報ですが、何処と何処の間がTCPなのかUDPなのか書かれていませんでした。

>(そのためサーバーへUDPパケットを送信して、サーバーでパケット解析を行いクライアントのIPとポート番号を取得出来ています。)
こういう情報が欲しかったんです。
前までの情報でサーバーとはTCP通信していると思い込んでいました。

UDPホールパンチングでサーバ接続に成功しているのは、ご自身だけでしょうか、友人のルーターでは成功されていますか?
これも書かれておりませんので不明なままです。

>しかしサーバーの設定を修正した事により、サーバーとクライアント間の通信は行える様になりました。
ご自身のPC2台とのサーバーの同時接続が成功したかも書かれておりませんので不明なままです。
たぶん、成功したのだと思いますが、同じグローバルIPでのP2Pはこの場合実現できないのはご存知のとおりですので、ご友人の力を借りる必要があります。

> 一つのクライアントだけで完結出来る処理ではないので実行可能なサンプルコードと言われましても困ってしまいます。
そういう協力が出来るのであればと提案させていただきました。
サーバーを限定でも公開したくないという話であれば、致し方無いと思います。

UDPホールパンチング(NATトラーサバル)はすべてのルーターで有効な手段では無いと私は認識しておりますので、そこを心配しております。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

coco

Re: ゲームサーバー構築について

#39

投稿記事 by coco » 9年前

海外の論文を読んでいてSymmetric Natに対するUDPホールパンチングの対策が載っていてそれを試した所
ようやく成功致しました。
それまでにも通信部分を非同期処理に切り替えたりなど色々していたのでどれがピンポイントな解決部分だったのかは分かりませんが・・・。

現状でももしかしたらルーターによっては駄目なものもあるかもしれませんが、少なくとも試せる範囲内全て大丈夫でしたのでこれで解決と致します。

閉鎖

“C言語何でも質問掲示板” へ戻る