使用UDP或其他低级技术使用Delphi向所有连接的计算机发送消息?

时间:2012-03-20 16:57:36

标签: delphi udp ip lan

我正在制作一款游戏,并希望立即从我的游戏服务器与所有客户交谈。 (原始问题:如何制作IP列表,更新问题:如何进行UDP广播。)

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

1 个答案:

答案 0 :(得分:5)

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

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

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

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

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