【问题标题】:Broadcasting ip:port by socket server通过套接字服务器广播 ip:port
【发布时间】:2018-02-26 22:27:42
【问题描述】:

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

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

我很确定这个问题在 Stack 上被问过很多次,但我可以找到合适的关键字来搜索它。

【问题讨论】:

    标签: sockets networking network-protocols


    【解决方案1】:

    一种方法是通过 UDP 广播数据包。如果您使用的是 BSD 套接字,请参阅 beej's guide。而here 是微软的版本。

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

    多播是另一种选择,但如果这是仅限 LAN 的事情,我认为没有必要。

    建议

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

    格式建议

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

    幻数只是为了防止与使用相同端口的另一个应用程序发生冲突。检查数据包的长度和幻数。

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

    【讨论】:

    • 与其让服务器频繁地广播它的信息,那样只会浪费带宽,一个常用的选项是让客户端发送自己的广播,请求任何服务器来识别自己。任何接收该广播的服务器都可以发回包含其当前信息的回复。客户端可以收集该信息并选择要连接的服务器(如果有多个)。
    【解决方案2】:

    一些选项是:

    • DNS-SD(似乎翻译为“Apple Bonjour”):它在 macOS 上有库,但需要在 Windows 上安装 Bonjour 服务。我不知道 Linux 的情况。因此,它是多平台的,但您需要外部库。
    • UDP 广播或多播
    • 其他一些花哨的东西,例如以太网广播、原始套接字……

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

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

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

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

    其中一个可能更适合您的应用程序,这取决于。

    请考虑以下论点:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-02
      • 2014-06-02
      • 2013-06-03
      • 1970-01-01
      • 2011-12-05
      • 2010-10-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多