【问题标题】:Dns.GetHostAddresses() hangsDns.GetHostAddresses() 挂起
【发布时间】:2016-03-10 10:12:40
【问题描述】:

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

该代码是循环的一部分,该循环以 2 秒的间隔连续发送多播数据包,直到收到另一台设备的应答。真正奇怪的是,这只发生在循环的第一次迭代中。如果第一次迭代中的调用返回返回,那么后面的所有迭代也会成功。

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

挂起的确切行是

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

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

任何想法为什么会挂起?错误最有可能出现在操作系统 (raspbian)、Mono 中还是在我的代码中?

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

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

新代码:

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

【问题讨论】:

  • 是否可以选择使用NetworkInterface 和相关类?这些将基于本地配置而不是依赖于 DNS 基础设施。
  • 当然可以,只要它能让我在所有接口和 IP 上发送 UDP 包

标签: c# raspberry-pi


【解决方案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() 会无限期挂起

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 您是否尝试多次运行它?它大约有 50% 的时间有效
    猜你喜欢
    • 2022-01-14
    • 1970-01-01
    • 2018-12-23
    • 2019-01-18
    • 1970-01-01
    • 2012-12-20
    • 1970-01-01
    • 2016-01-16
    • 2015-07-06
    相关资源
    最近更新 更多