UDP广播用于自动搜索服务器

时间:2010-10-17 17:00:43

标签: c udp broadcast multiplayer

我正在制作一款多人网络游戏。现在要连接到服务器,客户端需要服务器的IP地址。

所以,我实现它的方式如下。

客户端在广播IP上广播其IP地址,并在端口上说A. 服务器通过A和

监听它

服务器创建一个新的UDP连接,客户端通过端口B表现为客户端。它发送游戏所需的所有重要信息,包括其IP。

客户端是此连接的服务器,并通过端口B从服务器接收数据。

现在,A和B是常量。因此,当我需要服务器在不同线程中侦听多个客户端时,我可以将diff值放入A和B中,但是在客户端文件A和B中,这些线程独立于这些线程。所以它给了我一个错误

bind: Address already in use

对此有什么合理的解决方案?

1 个答案:

答案 0 :(得分:4)

首先,让客户广播其地址听起来非常可怕,至少对我而言。广播意味着它只有在服务器位于本地子网上时才有效,并且会在网络中造成大量不必要的流量。

我让客户端通过DNS服务发现(DNS-SD)找到服务器。这样做的好处是,只要您的服务器位于本地子网上,就可以使用multicast DNS,并使用正常管理的DNS转换到广域服务器,而无需对客户端进行任何更改。

其次,服务器应该将线程专用于每个客户端。虽然这个模型可以在某种程度上起作用,但它有相当多的开销并且规模很小。

最后,对于(我认为是)您的原始问题:对于每个客户端而言,我有一个端口,而不是每个客户端都有一个端口。来自客户端的每个请求都将携带足够的信息供服务器执行它包含的任何请求。服务器只是监听其单个端口,并在每个请求到达时为其提供服务。您可以将多个线程专用于此,但它应该是一个通用线程池 - 即,涉及的线程数量只是配置问题,对整体设计没有逻辑含义(即,特定的特性)线程没有意义 - 如果你移动到一个更大的服务器,8倍于man核心,添加更多的线程是一个简单的问题,配置更多的线程,而不是改变整体设计)。