如果并行调用,Mono Dns操作会挂起

时间:2013-06-07 21:08:35

标签: c# dns mono

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

Mono Dns类很可能没有正确地超时并重新发出请求:DNS使用基于UDP的RPC协议,因为UDP不可靠,如果10个数据包同时到达DNS服务器或一些东西丢失了,没有回复。

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

1 个答案:

答案 0 :(得分:0)

到现在为止,我想我应该回答我自己的问题。事实上,在Mono的库中存在某种与DNS交谈的错误,自2005年左右开始记录但尚未修复。有一些人声称可以更好地使用DNS库的第二个版本。

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

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