【问题标题】:UDP for multiplayer game多人游戏的UDP
【发布时间】:2011-09-27 10:03:12
【问题描述】:

我没有套接字或多人编程方面的经验。
我需要为我用 c++ 制作的游戏编写多人模式。这是一款益智游戏,但游戏模式不会是回合制,更像是合作。
我决定使用 UDP,所以我阅读了一些教程,我找到的所有示例都描述了如何创建发送数据的客户端和接收数据的服务器。
我的游戏将由两个玩家玩,并且都将向对方发送和接收数据。

我需要编写客户端和服务器代码吗?
我应该使用同一个套接字来发送和接收吗?
我应该在同一个端口发送和接收数据吗?

谢谢,我有点迷路了。

【问题讨论】:

    标签: sockets udp


    【解决方案1】:

    了解大师们是如何做到的: 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
    

    【讨论】:

      【解决方案2】:

      请注意,这个答案都是关于使用 UDP 套接字的。如果你改变主意使用 TCP 套接字,它几乎都无关紧要。

      • 我需要编写客户端和服务器的代码吗?

      由于您已选择使用 UDP(如果您的数据不是很重要并且从低延迟中受益比可靠通信更多,这是一个公平的选择),您在这里没有太多选择:“服务器”是用于从网络接收数据包的一段代码,而您的“客户端”用于将数据包发送到网络。 UDP 不提供服务器与客户端通信的任何机制(与建立 2 路套接字的 TCP 不同)。在这种情况下,如果您想在两台主机之间进行双向通信,它们都需要服务器和客户端代码。

      现在,您可以选择使用 UDP 广播,其中两个客户端都在广播地址上侦听和发送(家庭网络通常为 192.168.1.255,但它可以是任何东西并且可以配置)。这对代码来说稍微复杂一些,但它会消除对客户端/服务器配置的需要,并且可能被视为对您的用户来说更加即插即用。但是请注意,这不适用于 Internet。

      或者,您可以创建一种混合方法,通过广播和侦听广播来发现主机,但是一旦选择了主机,您就可以使用主机来托管单播套接字。您可以提供回退以手动指定网络设置(每个设置的远程主机/端口),以便它可以在 Internet 上工作。

      最后,您可以提供一个真正的“服务器”角色,供所有客户端连接。服务器然后会知道哪些客户端连接到它,然后会尝试连接回它们。这是更高级别的服务器,而不是套接字级别的服务器。两台主机仍然需要有数据包发送(客户端)和接收(服务器)代码。

      • 我应该使用同一个套接字发送和接收吗?

      好吧,既然您使用的是 UDP,那么您实际上别无选择。 UDP 不建立任何可以来回通信的持久连接。有关详细信息,请参阅上述要点。

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

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

      【讨论】:

        【解决方案3】:

        我需要编写客户端和服务器代码吗?

        这取决于。对于两人游戏,两台计算机在同一个 LAN 上,或者都在开放的 Internet 上,您可以简单地让两台计算机直接相互发送数据包。

        另一方面,如果您希望您的游戏在 Internet 上运行,当一个或两个玩家都在 NAT 和/或防火墙之后,那么您的问题是 NAT 和/或防火墙可能会过滤掉其他玩家的传入 UDP 数据包,除非本地玩家在他们的防火墙中设置端口转发的麻烦......许多用户不愿意(或不能)做的事情。在这种情况下,您最好运行一个两个客户端都可以连接到的公共服务器,它将数据从一个客户端转发到另一个客户端。 (在这种情况下,您也可以考虑使用 TCP 而不是 UDP,至少作为后备,因为 TCP 流通常比 UDP 数据包更容易受到防火墙的影响)

        我应该使用同一个套接字来发送和接收吗? 我应该在同一个端口发送和接收数据吗?

        您不必这样做,但您也可以这样做——只使用一个套接字和一个端口没有任何缺点,而且它会稍微简化您的代码。

        【讨论】:

          猜你喜欢
          • 2012-07-09
          • 1970-01-01
          • 1970-01-01
          • 2019-08-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多