我没有使用套接字或多人编程的经验
我需要为我用c ++制作的游戏编写多人游戏模式。这是一款益智游戏,但游戏模式不会以回合为基础,更像是合作
我决定使用UDP,所以我读了一些教程,我发现的所有示例都描述了如何创建发送数据的客户端和接收它的服务器。
我的游戏将由两个玩家玩,并且两个玩家都将向另一个玩家发送和接收数据。
我是否需要对客户端和服务器进行编码? 我应该使用相同的套接字发送和接收吗? 我应该在同一个端口发送和接收数据吗?
谢谢,我有点迷失。
答案 0 :(得分: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 :(得分:2)
我是否需要对客户端和服务器进行编码?
这取决于。对于双人游戏,两台计算机在同一个局域网上,或两者都在开放的互联网上,你可以简单地让这两台计算机直接相互发送数据包。
另一方面,如果您希望您的游戏在互联网上运行,当一个或两个玩家都在NAT和/或防火墙后面时,那么您可能会遇到NAT和/或防火墙可能会过滤掉其他播放器的传入UDP数据包,除非本地播放器在防火墙中设置端口转发的麻烦...许多用户不愿意(或不能)做的事情。在这种情况下,您可能最好运行两个客户端都可以连接的公共服务器,从而将数据从一个客户端转发到另一个客户端。 (在这种情况下,您可能还会考虑使用TCP而不是UDP,至少作为后备,因为TCP流通常可能比UDP数据包具有更少的防火墙问题)
我应该使用相同的套接字发送和接收吗? 我应该在同一个端口发送和接收数据吗?
你不必,但你也可以 - 只使用一个插槽和一个端口没有任何缺点,它会简化你的代码。
答案 2 :(得分:1)
请注意,这个答案都是关于使用UDP套接字的。如果你改变主意使用TCP套接字,它几乎都是无关紧要的。
由于您选择使用UDP(如果您的数据不是非常重要并且比可靠通信更低的延迟带来更多好处,那么这是一个公平的选择),您在这里没有太多选择:“服务器”是一段用于从网络接收数据包的代码,您的“客户端”用于将数据包发送到网络。 UDP不提供服务器与客户端通信的任何机制(与建立双向套接字的TCP不同)。在这种情况下,如果您希望在两台主机之间进行双向通信,则每台主机都需要服务器和客户端代码。
现在,您可以选择使用UDP广播,其中两个客户端都在广播地址上监听和发送(对于家庭网络通常为192.168.1.255,但它可以是任何内容并且是可配置的)。这对于代码来说稍微复杂一些,但它将消除对客户端/服务器配置的需求,并且可能被视为对用户来说更多的插件。但请注意,这不适用于互联网。
或者,您可以创建一种混合方法,通过广播和侦听广播来发现主机,但是一旦选择了主机,您就可以使用主机来承载单播套接字。您可以提供回退来手动指定网络设置(每个设置的远程主机/端口),以便它可以在Internet上工作。
最后,您可以提供所有客户端连接的真正“服务器”角色。然后,服务器将知道连接到它的哪些客户端,然后又尝试连接回它们。这是一个更高级别的服务器,而不是套接字级别的服务器。两个主机仍然需要包发送(客户端)和接收(服务器)代码。
好吧,既然你正在使用UDP,那么你真的没有选择。 UDP不会建立任何可以来回通信的持久连接。有关详细信息,请参阅上述内容。
根据上述问题,您的问题可能会更好地表达“每个主持人应该在同一个端口上收听吗?”。我认为这肯定会使您的编码更容易,但它不必。如果你没有,并且你选择第一个点的第三个选项,你需要在“客户端”的第一个消息中向服务器“连接回我这个端口”数据字段。