0

我正在使用 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 对象——正如我所说,性能很重要。

有人有这样做的经验吗?

4

1 回答 1

2

我会将地址解析与UdpClient.

  1. 使用Dns类来解析 IPaddress(并存储在局部变量中)
  2. 使用 的无参数构造函数UdpClient
  3. 不要连接UdpClient
  4. 将显式SendIPEndPoint参数一起使用。

在后台线程上:

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

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

于 2009-04-28T13:29:21.003 回答