【问题标题】:Why does getting an IP address throw an exception?为什么获取 IP 地址会引发异常?
【发布时间】:2018-04-13 04:13:18
【问题描述】:

背景: 我的程序启动了,它必须获取运行它的机器的 IP 地址。

它是客户端-服务器架构中的“服务器”,接收传入的 tcp-ip 消息。

我还应该添加机器:

  • 有多个可用的 IP 地址

  • 正在运行 Windows 2008 R2 Server

获取IP地址的代码如下:

    public bool IsNetworkAvailable
    {
        get
        {
            return System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable();
        }
    }

    public string thisIP { get; private set; }
    public void GetThisIP()
    {
        if (!string.IsNullOrEmpty(thisIP))
        {
            return;
        }

        thisIP = "*";

        if (IsNetworkAvailable)
        {
            using (System.Net.Sockets.Socket socket = new System.Net.Sockets.Socket(
                System.Net.Sockets.AddressFamily.InterNetwork,
                System.Net.Sockets.SocketType.Dgram, 0))
            {
                socket.Connect("11.0.1.5", 65530);
                System.Net.IPEndPoint endPoint = socket.LocalEndPoint as System.Net.IPEndPoint;
                thisIP = endPoint.Address.ToString();
            }
        }
    }

这是错误信息:

(0x80004005): A socket operation was attempted to an unreachable network 11.0.1.5:65530 
at System.Net.Sockets.Socket.Connect(IPAddress[] addresses, Int32 port)

解决方案: 我已将代码更改为 rodcesar.santos 在此建议的内容: Get local IP address

这是我的(修改后的)代码(它可以工作)

            System.Net.NetworkInformation.UnicastIPAddressInformation mostSuitableIp = null;

            var networkInterfaces = System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces();

            foreach (var network in networkInterfaces)
            {
                if (network.OperationalStatus != System.Net.NetworkInformation.OperationalStatus.Up)
                {
                    continue;
                }

                var properties = network.GetIPProperties();

                if (properties.GatewayAddresses.Count == 0)
                {
                    continue;
                }

                if (mostSuitableIp != null)
                {
                    break;
                }

                foreach (var address in properties.UnicastAddresses)
                {
                    if (address.Address.AddressFamily != System.Net.Sockets.AddressFamily.InterNetwork)
                    {
                        continue;
                    }

                    if (System.Net.IPAddress.IsLoopback(address.Address))
                    {
                        continue;
                    }

                    if (mostSuitableIp == null && address.IsDnsEligible)
                    {
                        mostSuitableIp = address;
                        break;
                    }
               }
            }

            thisIP = mostSuitableIp != null ? mostSuitableIp.Address.ToString() : "";

【问题讨论】:

  • 如果它在除一台机器之外的所有机器上都可以工作,那么很可能是机器本身的问题,而不是代码。
  • 这台机器上的设置显然存在问题,导致套接字无法打开。你可以just do this 代替吗?
  • 你能从机器上ping那个IP吗?
  • Dan Wilson :从您的链接中,还有另一个条目“当本地机器上有多个 ip 地址可用时,有一种更准确的方法。连接 UDP 套接字并读取其本地端点”...这就是为什么我正在做我正在做的事情......
  • S. Monteleone - 是的,它 ping 很好……(它的 IP 是 192.168.0.189 ……所以它在我们的本地 DNS 中)

标签: c# windows tcp-ip


【解决方案1】:

阅读接受的答案@A socket operation was attempted to an unreachable host后,

我假设收到此错误的特定客户端计算机的网络有些故障。

引用@Stephen Cleary

此错误表示网络未连接或配置不正确。这绝对是客户端机器上的错误,而不是您的服务器上的错误。 你无能为力来“解决”这个问题。您几乎所能做的就是升级客户端的网络驱动程序并检查连接问题(可能它们几乎不在无线范围内,或者以太网电缆缺少锁定标签)。

【讨论】:

  • 我会检查一下并进一步研究...谢谢
  • @user3174075 - 如果这是答案,请不要忘记接受它。
  • @user3174075,问题计算机是否可能由于网络、防火墙或防病毒配置而无法访问不在本地网络上的 IP 地址?您的示例代码中的硬编码地址与您在 cmets 中提供的 192.168.0.189 地址不在同一个子网上。您还说本地计算机有多个地址,是否与硬编码地址在同一子网中?
  • 没有防火墙,没有杀毒软件...奇怪的是代码可以在其他机器上运行...
【解决方案2】:
            System.Net.NetworkInformation.UnicastIPAddressInformation mostSuitableIp = null;

            var networkInterfaces = System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces();

            foreach (var network in networkInterfaces)
            {
                if (network.OperationalStatus != System.Net.NetworkInformation.OperationalStatus.Up)
                {
                    continue;
                }

                var properties = network.GetIPProperties();

                if (properties.GatewayAddresses.Count == 0)
                {
                    continue;
                }

                if (mostSuitableIp != null)
                {
                    break;
                }

                foreach (var address in properties.UnicastAddresses)
                {
                    if (address.Address.AddressFamily != System.Net.Sockets.AddressFamily.InterNetwork)
                    {
                        continue;
                    }

                    if (System.Net.IPAddress.IsLoopback(address.Address))
                    {
                        continue;
                    }

                    if (mostSuitableIp == null && address.IsDnsEligible)
                    {
                        mostSuitableIp = address;
                        break;
                    }
               }
            }

            thisIP = mostSuitableIp != null ? mostSuitableIp.Address.ToString() : "";

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多