2011-07-02 48 views
0

我對套接字和多人遊戲編程沒有經驗。
我需要爲我在C++中製作的遊戲編寫多人遊戲模式。這是一款益智遊戲,但遊戲模式不會基於回合,更像是合作。
我決定使用UDP,所以我已經閱讀了一些教程,並且我發現所有示例都描述瞭如何創建發送數據的客戶端以及接收數據的服務器。
我的遊戲將由兩個玩家玩,並且兩個玩家都將收發數據。用於多人遊戲的UDP

我需要編碼客戶端和服務器嗎?
我應該使用相同的套接字發送和接收嗎?
我應該在同一端口發送和接收數據嗎?

謝謝,我有點失落。

回答

2

我需要編碼客戶端和服務器嗎?

這取決於。對於兩臺計算機都在同一局域網中的雙人遊戲,或者在開放的互聯網上,兩臺計算機可以直接將數據包直接發送給對方。另一方面,如果你希望你的遊戲在互聯網上工作,當一個或兩個玩家在NAT和/或防火牆後面,那麼你就有可能過濾出NAT和/或防火牆的問題另一個玩家的UDP數據包,除非本地玩家在防火牆上設置端口轉發的麻煩......許多用戶不願意(或能夠)做的事情。在這種情況下,運行兩個客戶端都可以連接的公共服務器可能會更好,它可以將數據從一個客戶端轉發到另一個客戶端。 (您也可以考慮使用在這種情況下,TCP而不是UDP,至少作爲備用,因爲TCP流是一般可能有較少的問題與防火牆比UDP數據包)

我應該使用相同的插座發送和接收? 我應該在同一端口發送和接收數據嗎?

你不需要,但你也可以 - 只使用一個套接字和一個端口是沒有缺點的,它會簡化你的代碼。

2

閱讀的主人是如何做到的: http://www.bluesnews.com/abrash/chap70.shtml

閱讀代碼:

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

打開一個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不提供任何服務器與客戶端通信的機制(與建立雙向套接字的TCP不同)。在這種情況下,如果您希望在兩臺主機之間進行雙向通信,則每臺主機都需要服務器和客戶端代碼。

現在,你可能選擇使用UDP廣播,其中客戶端監聽和發送廣播地址(家庭網絡通常爲192.168.1.255,但它可以是任何東西,並且可配置)。這對代碼來說稍微複雜一點,但它不需要客戶端/服務器配置,並且可能會被視爲更適合用戶的插件。但是請注意,這不適用於互聯網。

或者,您可以創建一種混合方法,通過廣播和偵聽廣播來發現主機,但是一旦選擇了主機,就會使用主機來託管單播套接字。您可以提供回退以手動指定網絡設置(每個設備的遠程主機/端口),以便它可以通過Internet工作。

最後,您可以提供所有客戶端連接到的真正「服務器」角色。然後服務器會知道哪些客戶端連接到它,並反過來嘗試連接到它們。這是一個更高級別的服務器,而不是套接字級別的服務器。兩臺主機仍然需要發送數據包(客戶端)和接收(服務器)代碼。

  • 我應該使用相同的套接字來發送和接收嗎?

那麼,因爲你使用UDP,你沒有真正的選擇。 UDP不建立任何可以來回通信的持續連接。有關更多詳細信息,請參閱上述內容

  • 我應該在同一端口發送和接收數據嗎?

鑑於上述問題,您的問題可能會更好地表述爲「每個主機應該在同一個端口上監聽嗎?」。我認爲這肯定會讓你的編碼更容易,但它不一定。如果你不這樣做,並且你選擇了第一個點的第三個選項,那麼你需要在「客戶端」的第一條消息中向服務器發送「在這個端口上連接回我」數據字段。