![让应用程序监听不同网关下的主机](https://linux22.com/image/30350/%E8%AE%A9%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E7%9B%91%E5%90%AC%E4%B8%8D%E5%90%8C%E7%BD%91%E5%85%B3%E4%B8%8B%E7%9A%84%E4%B8%BB%E6%9C%BA.png)
网络结构
典型的大学网络。不同的宿舍通过 LAN 连接。宿舍中的所有主机都使用相同的网关。我可以使用其他宿舍的唯一 IP 直接与其他宿舍的主机通信。
我的查询
我通过 Wine 在 Linux 下运行 Dota/Warcraft。对于 LAN 游戏,魔兽争霸仅自动检测由使用同一网关的主机创建的服务器(在我的例子中,由我宿舍中的主机创建)。对于其他人来说,有一个工具叫做战网在这里可以添加托管服务器的IP并使其能够正常显示在魔兽争霸中。不幸的是,这个工具不能通过 wine 工作。然而,这个概念对我来说似乎很简单,并且我相信可以很容易地实现。我只需要让这个应用程序监听某个 ip 的端口 6112(对吧?)。有任何帮助/线索吗?
答案1
首先,您不是直接与其他旅馆的主人进行通信,而是通过至少一个网关(更有可能是两个)间接通信:您的和他们的。网关标记广播域的末端,这实际上意味着广播不会超出网关。然而,游戏,尤其是魔兽争霸,使用广播来宣布服务器。这就是为什么你看不到其他旅舍的主人创建的服务器;因为你没有收到他们的广播。
奇怪的是,我自己没有处理过这个问题,但这是我可以猜测并会尝试的:
事实上,有像 BattleLan 这样的东西可以解决这个问题,我猜广播消息包含“有一个 at 和 的开放游戏”形式的信息。您的游戏客户端收到该广播后会联系服务器以处理其他事宜。
为了验证您可以使用wireshark
或等工具tcpdump
,让它们在您的本地网络接口卡上侦听广播流量并打开魔兽争霸游戏。该程序将捕获并显示广播。这些数据包很可能发送到 255.255.255.255 或子网的最高 IP,可能仍以 255 结尾。IP 数据包应包含 UDP 段,而不是 TCP,但它仍可能发送到端口 6112。
从概念上讲,您需要做的是从这些 IP 广播数据包中获取 UDP 段,并通过 IP(单播)将它们发送到服务器广播域之外的远程客户端。正如您所知,IP 单播将(意味着)超越您的网关,一直到达远程计算机。
根据《魔兽争霸》实现的协议的复杂性,您要么确实需要捕获、提取和发送消息,要么您可以简单地自己创建它们。
我认为已经有一个实现这里。适应/尝试它,看看它对你有什么作用。