2011-07-02 108 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不建立任何可以来回通信的持续连接。有关更多详细信息,请参阅上述内容

  • 我应该在同一端口发送和接收数据吗?

鉴于上述问题,您的问题可能会更好地表述为“每个主机应该在同一个端口上监听吗?”。我认为这肯定会让你的编码更容易,但它不一定。如果你不这样做,并且你选择了第一个点的第三个选项,那么你需要在“客户端”的第一条消息中向服务器发送“在这个端口上连接回我”数据字段。