广播ip:端口由套接字服务器

时间:2011-10-05 15:51:45

标签: sockets networking network-protocols

我正试图找到一种让客户端知道套接字服务器ip:port的方法,而不是明确定义它。通常我有一个在便携式设备上运行的套接字服务器,它通过DHCP连接到网络(通过WiFi),理想情况下客户端应该能够自动找到它。

所以我想问一个问题是套接字服务器是否可以通过本地网络以某种方式广播它的地址?我认为UPnP可以做到这一点,但我宁愿不介入它。

我很确定这个问题在Stack很多时候都有问题,但我可以找到合适的关键字来搜索它。

2 个答案:

答案 0 :(得分:3)

这样做的一种方法是通过UDP广播包。如果您使用的是BSD套接字,请参阅beej's guidehere是微软的版本。

假设应用程序的所有客户端都在路由器的同一侧,那么255.255.255.255(或IPv6的ff02::1)的广播地址应该是足够的。

多播是另一种选择,但如果这只是局域网,我认为没必要。

建议

选择一个UDP端口号(比如说我们选择1667的例子)。客户端应该监听255.255.255.255:1667上的UDP消息(或者等价的东西。例如:IPEndPoint(IPAddress.Any, 1667))。服务器应该在同一地址上广播消息。

格式建议

UDP数据包:前四个字节作为幻数,接下来四个字节是一个IPv4地址(您可能希望添加其他内容,如服务器名称)。

如果与使用相同端口的其他应用程序发生冲突,则会显示幻数。检查数据包的长度和幻数。

服务器会以30秒的时间间隔广播数据包。 (或者,您可以让服务器仅在客户端通过广播发送请求时才发送响应。)

答案 1 :(得分:1)

有些选择是:

  • DNS-SD(似乎转换为“Apple Bonjour”):它在macOS上有库,但它需要在Windows上安装Bonjour服务。我不知道Linux的情况。所以,它是多平台的,但你需要外部库。
  • UDP广播或多播
  • 其他一些奇特的东西,如以太网广播,原始套接字,......

对于您的情况(WiFi网络上的客户端),UDP广播数据包就足够了,它是多平台的,并且从一开始就不太难实现。

选择此选项,两个主要算法是:

  1. 服务器发送“通告”广播包,客户端收听广播地址。一旦客户端收到“announce”数据包,他们就会知道服务器地址。现在,他们可以将UDP数据包发送到服务器(它将发现用于发送回复的地址),或者使用TCP进行连接。

  2. 客户端发送“发现”广播数据包,服务器监听广播地址。一旦服务器收到“发现”数据包,就可以通过“通告”UDP数据包直接回复它。

  3. 对于您的应用,其中一种可能更好,这取决于。

    请考虑以下论点:

    • 服务器通常会收听请求并发送回复
    • 通过WiFi网络发送定期“通告”广播数据包的服务器,对于可能到达或未到达的客户端,浪费网络带宽,而客户端确切地知道何时需要轮询可用服务器,并且一旦停止就停止完成。

    作为这两个选项的混合,服务器可以在其出现后发送“无偿宣布”广播数据包,然后它可以监听来自客户端的“发现”广播请求,使用常规直接回复其中一个UDP包。

    从这里开始,客户端可以根据需要继续:使用UDP向服务器发送直接请求,连接到TCP地址:“announce”数据包中提供的端口,...

    (这是我在我正在处理的应用程序中使用的方案)