【问题标题】:Send message to all connected machines using Delphi using UDP or other low level technique?使用 UDP 或其他低级技术使用 Delphi 向所有连接的机器发送消息?
【发布时间】:2024-01-18 01:39:01
【问题描述】:

我正在制作一款游戏,并想从我的游戏服务器一次与所有客户端对话。 (原问题:如何制作 IP 列表,更新问题:如何进行 UDP 广播。)

我想在玩家之间建立局域网连接。 现在我不明白如何找到所有连接的机器向他们发送带有服务器信息的消息。 或者如何使用 Synapse 向所有人发送 UDP?

【问题讨论】:

标签: delphi udp ip lan


【解决方案1】:

在您的 LAN 上枚举完整的 IP 地址列表并不容易,至少不是在原始 TCPIP 级别上,这是您最初要求的(IP 地址列表)。然后您更新了问题以询问有关向所有连接的计算机发送消息的问题。上面有一条评论建议使用 NETSTAT 信息来执行此操作,但我不确定这是否是您想要做的可靠解决方案。

难以枚举 IP 的原因 1 是许多连接的计算机根本不会响应任何内容,包括 Ping。第二个问题是,如果您想枚举当前网段中的计算机,则必须广播到所有本地地址,这将花费很长时间,并且不会完成,因为您的局域网段可能有多组 IP 地址,可能在几个不同的私有 IP 子网上,以及一个或多个公共 IP 子网。

如果您正在制作游戏,并且您编写了基于 TCP 的游戏服务器,那么您的游戏服务器知道当前连接到服务器的用户,并且您应该能够通过活动会话。对于 Indy、ICS、Synapse 或您用于编写 TCP/IP 或 UDP 游戏协议服务器代码的任何其他库,执行此操作的代码会有所不同。您可以使用UDP broadcast message,但这可能不是某些游戏系统的正确解决方案。想象一下,您在同一台计算机上运行两台服务器,并且每台都连接了一些玩家。面向连接的解决方案更加健壮。您的客户端可能仍使用 UDP 并可能轮询它们连接的服务器,并通过协议中的标志接收事件通知。这比尝试向 LAN 多播或广播要强大得多。

但是,如果您坚持,Synapse 确实支持广播语法:

 socket := TUDPBlockSocket.create;
 socket.enablebroadcast(true);
 socket.Connect('255.255.255.255', '12345')
 socket.SendBufferTo(@DATARECORD, SIZEOF(DATARECORD));

【讨论】:

  • 兼容 IP 设备应该响应 ICMP 回显请求。
  • 实际上,防火墙通常会阻止 ICMP 回显。
最近更新 更多