2011-07-02 4 views
0

私はソケットやマルチプレイヤープログラミングに関する経験はありません。
私はC++で作ったゲームにマルチプレイヤーモードをコーディングする必要があります。それはパズルゲームですが、ゲームモードはターンベースではなく、より協調的です。
私はUDPを使用することに決めました。チュートリアルを読んでいます。見つけたサンプルは、データを送信するクライアントとそれを受信するサーバーを作成する方法を記述しています。
私のゲームは2人のプレイヤーによってプレイされ、どちらのプレイヤーも他のプレイヤーとデータを送受信します。UDPマルチプレイヤーゲーム用

クライアントとサーバーをコーディングする必要がありますか?
送受信に同じソケットを使用する必要がありますか?
同じポートでデータを送受信する必要がありますか?

ありがとうございました。

答えて

2

クライアントとサーバーをコーディングする必要はありますか?

によって異なります。 2人のプレーヤーのゲーム、両方のコンピュータが同じLANにある、または両方のインターネットが開いている場合は、2台のコンピュータにパケットを直接送信させることができます。

一方、ゲームがインターネット上で動作するようにするには、一方または両方のプレーヤーがNATおよび/またはファイアウォールの後ろにいる場合、NATおよび/またはファイアウォールがおそらくフィルタリングされるという問題がありますローカルプレーヤーが自分のファイアウォールでポート転送を設定する手間に掛からない限り、他のプレーヤーの着信UDPパケット...多くのユーザーが喜んで(または可能な)何かをしているとは限りません。その場合、両方のクライアントが接続できるパブリック・サーバーを実行した方が、クライアントから別のクライアントにデータを転送する方がよい場合があります。 (UDPストリームでは一般的にUDPパケットよりもファイアウォールの問題が少なくなるため、UDPの代わりにUDPを使用することをお勧めします)

送受信しますか? 同じポートでデータを送受信する必要がありますか?

単一のソケットと1つのポートだけを使用することには欠点はなく、コードを単純化することができます。

2

マスターはそれをやった方法を読む: http://www.bluesnews.com/abrash/chap70.shtml

をコード読む:

git clone git://quake.git.sourceforge.net/gitroot/quake/quake 

オープン1つのUDPソケットとはsendtoとのrecvfromを使用します。次のファイルには、ネットワーククライアントの機能が含まれています。

quake/libs/net/nc/net_udp.c 
UDP_OpenSocket calls socket (PF_INET, SOCK_DGRAM, IPPROTO_UDP) 
NET_SendPacket calls sendto 
NET_GetPacket calls recvfrom 
1

この回答はすべてUDPソケットの使用に関するものです。あなたがTCPソケットを使うように気を変えたら、それはほとんどすべて無関係になります。

  • クライアントとサーバーをコーディングする必要がありますか? (あなたのデータは本当に重要ではなく、より信頼性の高い通信よりも低レイテンシーのメリットがあれば、公正な選択)、あなたはここで選択肢の多くを持っていないあなたはUDPを使用するようにすることを選択したので

: 「サーバー」はネットワークからパケットを受信するためのコードで、「クライアント」はパケットをネットワークに送信するためのコードです。 UDPは、2ウェイソケットを確立するTCPと異なり、サーバーがクライアントと通信するためのメカニズムを提供しません。この場合、2つのホスト間で双方向の通信を行うには、それぞれサーバーとクライアントのコードが必要です。

UDPブロードキャストの使用を選択します。両方のクライアントがブロードキャストアドレス(通常はホームネットワークの場合は192.168.1.255ですが、何でも構いません)でUDPブロードキャストを受信して​​送信します。これはコード化するのがやや複雑ですが、クライアント/サーバーの設定が不要になり、ユーザーのためのプラグインのプレイが増えると見られます。ただし、これはインターネット上では機能しません。

また、ブロードキャストをブロードキャストおよびリスンすることでホストが検出されるハイブリッド方式を作成できますが、ホストが選択されると、ホストを使用してユニキャストソケットをホストします。手動でネットワーク設定(各自のリモートホスト/ポート)を指定して、インターネット上で動作するようにフォールバックを提供することができます。

最後に、すべてのクライアントが接続する真の "サーバー"役割を提供することができます。サーバは、それに接続されているクライアントを認識し、次にそれに接続しようとします。これはソケットレベルではなく、より高いレベルのサーバーです。両方のホストは、依然としてパケット送信(クライアント)と受信(サーバー)コードを持つ必要があります。

  • 送受信に同じソケットを使用する必要がありますか?

UDPを使用しているため、実際には選択肢がありません。 UDPは、前後に通信できる永続的な接続を確立しません。詳細については、上記の点を参照してください。

  • 同じポートでデータを送受信する必要がありますか?

上記の質問に照らして、あなたの質問は「各ホストが同じポートでリッスンする必要がありますか?私はあなたのコーディングを確実に楽にしてくれるはずですが、そうする必要はありません。あなたがしていない場合、最初のポイントの3番目のオプションを選択すると、 "クライアントの"最初のメッセージのサーバーに "このポートで私に接続する"データフィールドが必要になります。

関連する問題