gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 00:48:23 27 4
gpt4 key购买 nike

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

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

客户端在广播 IP 和端口 A 上广播其 IP 地址。服务器通过 A 监听它,并且

服务器与客户端建立一个新的 UDP 连接,就像客户端在端口 B 上所说的那样。它发送游戏所需的所有重要信息,包括其 IP。

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

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

绑定(bind):地址已被使用

什么是合理的解决方案?

最佳答案

首先,让客户端广播它的地址听起来很糟糕,至少对我来说是这样。广播意味着它只有在服务器位于本地子网上时才能工作,并且会用大量不必要的流量污染网络。

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

其次,服务器不应该为每个客户端分配一个线程。虽然此模型可以在某种程度上发挥作用,但它的开销相当大,而且扩展性非常差。

最后,对于(我认为是)您最初的问题:我不会为每个客户端使用不同的端口,而是为所有客户端设置一个端口。来自客户端的每个请求都将携带足够的信息供服务器执行它包含的任何请求。服务器仅在其单个端口上监听,并在每个请求到达时为其提供服务。您可能为此分配了多个线程,但它应该是一个通用线程池——即,涉及的线程数只是一个配置问题,对整体设计没有逻辑影响(即,特定线程的身份) thread 没有意义——如果你移动到一个更大的服务器,拥有 8 倍的 man cores,添加更多线程只是配置更多线程的简单问题,而不是改变整体设计。

关于c - 用于自动搜索服务器的 UDP 广播,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3954262/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com