Dns.GetHostAddresses()挂起

时间:2016-03-10 10:12:40

标签: c# raspberry-pi

我正在用C#开发一个程序,它应该运行在树莓派上。 它使用多播来检测网络中的其他设备,为了做到这一点,我需要获取raspi的所有IP。执行此操作的代码in another SO question并且运行良好,但有一个例外:对Dns.GetHostAddresses()的调用永远挂起,但只有一些时间。其他时候它的工作方式就像它应该的那样。

代码是循环的一部分,循环连续发送间隔为2秒的多播包,直到它收到另一个设备的回答。真正奇怪的是,这只发生在循环的第一次迭代中。如果在第一次迭代中返回的调用返回,则所有后续迭代也将成功。

如果相关的话,这个类的两个实例同时在不同的线程中运行。

挂起的确切行是

IPAddress[] ips = Dns.GetHostAddresses (Dns.GetHostName ());
foreach (IPAddress localIp in ips) {...}

Dns.GetHostName ()部分每次都正确返回字符串"raspberrypi",无论它是否挂起。

任何想法为什么会挂起?错误最有可能出现在OS(raspbian),Mono或我的代码中吗?

如果需要更多代码,请告诉我。它与上面链接的答案大致相同。在此调用之前发生的唯一事情是启动一个线程,该线程将侦听对多播包的响应

编辑:我尝试了另一种方法,找到in another SO question。同样的问题。它永远挂起

新代码:

IPHostEntry iphostentry = Dns.GetHostEntry(Dns.GetHostName());
foreach (IPAddress localIp in iphostentry.AddressList) {...}

2 个答案:

答案 0 :(得分:1)

对于我的特殊问题,即“如何在本地计算机上的所有接口上的所有IP上发送UPD包”,遵循Damien_The_Unbeliever建议使用NetworkInterface工作。以下代码似乎可以执行我想要的操作:

foreach (NetworkInterface ni in NetworkInterface.GetAllNetworkInterfaces ()) {
    foreach (UnicastIPAddressInformation ip in ni.GetIPProperties().UnicastAddresses) {
        IPAddress localIp = ip.Address;
        ...
    }
}

然而,这并没有回答为什么Dns.GetHostAddresses()无法挂起

答案 1 :(得分:0)

我刚刚在Linqpad(windows)中运行了你的代码,它运行正常。您的问题可能来自外部原因。所以我要看看你正在使用的操作系统和/或框架。