【问题标题】:How to get UdpClient to react to DNS updates如何让 UdpClient 对 DNS 更新做出反应
【发布时间】:2009-04-28 13:10:04
【问题描述】:

我正在使用 UdpClient 将数据包发送到服务器。我正在使用 (hostname, port) 构造函数在构造我的 Sender 对象时初始化 UdpClient。当以这种方式构造时,UdpClient 将主机名解析为 IP 地址。对 UdpClient 对象的后续调用使用 IP 地址。

很遗憾,如果使用的 DNS 别名通过 DNS 系统更新为指向不同的 IP 地址,则除非重新创建,否则此更改不会反映在我的 Sender 对象中。

让我的 Sender 对象及时响应 DNS 更改的最佳方式是什么?性能非常重要。我能想到几个解决方案:

  1. 对每次调用进行 DNS 解析(即使用接受主机名参数的发送重载)。由于 Windows DNS 缓存,这实际上可能非常快,我不知道。
  2. 在计时器线程上运行某种 DNS 检查程序,以定期检查 DNS 别名是否解析为不同的 IP。如果是这样,它会以某种方式更新 UdpClient 以使用新的 IP 地址。但是,我真的不想在每次调用时都锁定 UdpClient 对象 - 正如我所说,性能很重要。

有人有过这方面的经验吗?

【问题讨论】:

    标签: .net dns udpclient


    【解决方案1】:

    我会将地址解析与UdpClient 分开。

    1. 使用Dns 类到resolve IPaddress(并存储在局部变量中)
    2. 使用UdpClient的无参构造函数,
    3. 不要在UdpClient 上进行连接
    4. 使用显式 SendIPEndPoint 参数。

    在后台线程上:

    1. 每隔 X 秒检查一次更新的 DNS
    2. 替换您传递给UdpClient.Send 调用的本地IPEndPoint 变量。

    每次执行此操作时都无需销毁您的UdpClient。 此外,更新IPEndPoint 时无需锁定。更糟糕的情况是你有一个脏发送到一个旧地址,但是由于你没有立即收到更新通知,所以无论如何你都会有脏发送。

    【讨论】:

      猜你喜欢
      • 2021-05-12
      • 1970-01-01
      • 2020-12-07
      • 1970-01-01
      • 1970-01-01
      • 2021-08-10
      • 1970-01-01
      • 1970-01-01
      • 2021-05-13
      相关资源
      最近更新 更多