【问题标题】:How to advertise a TCP host via UDP?如何通过 UDP 通告 TCP 主机?
【发布时间】:2012-12-21 08:46:18
【问题描述】:

我有一个应用程序(本质上是一个游戏),它通过 UDP 将游戏状态数据广播到专用 LAN 上的许多连接的客户端。

UDP 适用于广播游戏状态。不必配置客户端对于此应用程序很重要。客户端只是读取 UDP 数据报流并建立状态。

但现在我需要客户端可靠地从服务器下载几块大数据负载。 TCP 比 UDP 要好得多。

但我们仍然宁愿不必为每个客户端配置主机信息。 最好在广播 UDP 流中嵌入服务广告,然后让每个客户端看到广告并连接到 TCP 主机,而无需在端点上进行额外配置。

是否有标准的方式,或者更好的示例代码通过 UDP 广告 TCP 服务。最好在 C++ 中。

【问题讨论】:

  • 我认为这实际上取决于您的客户端如何编码以处理来自 UDP 的消息。您能解释一下您的客户端是如何作用于 UDP 数据包的吗?例如,您使用的数据包的基本结构是什么?如果客户端从来没有任何用于创建 TCP 流的代码,您将不得不修改客户端,以便它确实有办法......
  • 我希望必须扩展客户端和服务器代码。 UDP 协议主要是固定大小的记录,但我可以使用我拥有自己的数据处理程序的“自定义数据报”来扩展它。我在想我只需要发送新的服务广告枚举以及服务器的本地主机名和主机监听的开放端口号。当客户端数据报处理程序看到服务时,它只是在具有主机名的线程中启动一个 tcp 连接。
  • 除了寻找解决方案外,您还应该注意中间人攻击:恶意程序可能会注入/修改流以要求客户端从另一个 ip 下载恶意更新/port 比你的...(当然,一个能够改变流的人可能已经处于一个很好的位置来做很多其他的事情......但是尝试阻止可预防的部分不会有什么坏处)跨度>
  • 是的,我在考虑中间人。我需要进行某种安全握手。

标签: sockets networking tcp udp


【解决方案1】:

客户端需要知道TCP服务器的IP和端口,仅此而已。如果您可以将该信息嵌入到您的协议中,它将起作用。

实际上,UDP 客户端可能已经知道 IP,因为 UDP 数据包有一个发送方 IP。也许这个事实可以帮助你。

【讨论】:

  • 他只需要通过 udp 发送某种“下载”代码,这将启动 TCP 连接和下载。
  • 是的,我昨天开始构建它。它似乎比我最初想的要简单。我只需要 ip 和/或主机名和端口号。感谢您的帮助。
【解决方案2】:

这里的一个选项(可能不仅仅是游戏,而是一些“企业”服务)是在本地 DNS 中设置 SRV 记录。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-26
    • 1970-01-01
    • 2012-01-31
    • 2015-11-27
    • 1970-01-01
    • 1970-01-01
    • 2019-06-29
    相关资源
    最近更新 更多