0

我在 Mono 上的 Dns 类(从 C# 调用)遇到了一个高度可重现的问题:如果我从多台机器(例如,在集群上)进行多次调用,或多或少同时进行(例如当批处理程序启动时) ,一些随机数的呼叫挂起。

Mono Dns 类似乎很可能没有正确超时并重新发出请求:DNS 使用基于 UDP 的 RPC 协议,并且由于 UDP 不可靠,如果十个数据包同时到达 DNS 服务器或某事和一个丢失,将不会有任何回复。

这是我的问题:有没有人知道从 Mono 上的 C# 中断对 Dns.GetHostName 或 Dns.GetHostInfo 的调用的干净方法,以便在发生这种情况时,我可以强制重新发出请求?

4

1 回答 1

0

现在我想我应该回答我自己的问题。因此,事实上,Mono 的库中存在某种与 DNS 通信的错误,自 2005 年左右开始记录,但尚未修复。有人声称 DNS 库的第二个版本效果更好。

出于我自己的目的,事实证明我可以从我的代码中消除几乎所有的 DNS 调用。毕竟,由 DNS 中丢失的数据包触发的 DNS 代码挂起是一件非常可怕的事情。

我认为这是一个很好的代码示例,它将 UDP 通信视为可靠,并且因为它非常可靠,除非在重负载下,有一个挥之不去的错误,根本无法修复。但是很容易通过简单地将 Mono DNS 置于重负载下触发。

于 2013-07-18T19:54:15.363 回答