创建可通过网络发现的Windows(win32)服务

时间:2009-07-28 05:22:27

标签: networking tcp udp service-discovery

简而言之:如何在零客户端配置的情况下可靠地发现在(可能是多段)局域网上运行的服务器

我的客户端应用程序必须在不知道服务器IP地址的情况下找到服务器应用程序。它必须在本地LAN上工作,可以将其拆分为带有集线器或其他交换设备的段。

我已经有了一个可行的解决方案,但让它在多段网络上工作有点麻烦。它的工作原理如下:

当客户端启动时,它会在自己的网段上发送UDP广播。如果服务器在同一网段上运行,则它可以正常运行 - 服务器会响应相应的消息。

如果服务器和客户端在由不转发UDP的集线器/交换机分隔的网络上运行(最可能的情况),那么我在每个网段上运行服务器实例,并且它们将客户端请求转发给彼此通过TCP - 但我需要为服务器实例配置它(简单,但仍然是技术支持的痛苦。)这是我需要解决的主要问题。有些网站我们有数百个客户在5个或6个不同的细分市场上运行。

我面临的问题: 1.虽然我的应用程序安装程序在防火墙上启用了适当的端口,但有时我会遇到这种情况似乎没有正确发生的情况。 2.必须在不转发UDP的集线器/交换网络上运行多个服务器实例(并因此配置和维护它们)

最后,我需要一个可以在最小的Windows网络(XP / 2000 / Vista)上无需维护的解决方案,该网络可能没有配置Active Directory或其他查找服务。

我不想为此标记任何运行时内容 - 应该能够使用普通的VC ++或Delphi进行标记。

商业应用通常采用什么方法?我知道SQL Server使用广播和NetBEUI调用的组合(我可能错了)。

提前致谢。

2 个答案:

答案 0 :(得分:1)

您有一些术语问题:

  • 如果您说“网段”,则表示“IP子网”。同一网段上的设备可以看到相同的IP广播。
  • 如果您说“hub / switch”,则表示“IP路由器”。
  • 如果你说“不会转发UDP”,问题实际上是“不会转发IP广播”。

一旦我们过了那个,你有几个选择:

  • 如果您的DNS服务器允许动态DNS更新,您的服务器可以在DNS中以知名名称注册。您应该使用RFC2782中指定的SRV记录。然后客户端进行DNS查找以查找服务器。
  • 您可以在组织的DNS中静态分配您的服务器众所周知的名称,可能与之前的选项一样使用SRV记录。
  • 如果您的路由器支持IP多播,您的服务器可以加入IP多播组。然后,客户端将其初始发现请求作为UDP数据包发送到(预先规定的)多播地址。

答案 1 :(得分:0)

如果您有域名服务器,我会选择小型服务。您可以与其他服务连接并将其用作分发点。

为何选择域名服务器?找到它的名字(DsGetDcName)相对容易。

其他选择包括DHCP服务器,DNS服务器或任何需要由维护人员填写的东西。