C# 为什么获取IP地址会引发异常?
背景: 我的程序启动了,它必须获得运行它的机器的IP地址 它是客户端-服务器体系结构中接收传入tcp ip消息的“服务器” 我还应该添加机器:C# 为什么获取IP地址会引发异常?,c#,windows,tcp-ip,C#,Windows,Tcp Ip,背景: 我的程序启动了,它必须获得运行它的机器的IP地址 它是客户端-服务器体系结构中接收传入tcp ip消息的“服务器” 我还应该添加机器: 有多个ip地址可用 正在运行Windows 2008 R2服务器 以下是获取IP地址的代码: public bool IsNetworkAvailable { get { return System.Net.NetworkInformation.NetworkInterface.
- 有多个ip地址可用
- 正在运行Windows 2008 R2服务器
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在本文中建议的代码:
这是我的(修改过的)代码(它是有效的)
在阅读了接受的答案@之后 我假设收到此错误的特定客户端计算机的网络有点故障 引用@Stephen Cleary 此错误表示网络未连接或配置不正确。这肯定是客户端机器上的错误,而不是服务器上的错误。 要“解决”这个问题,你没什么办法。您所能做的几乎就是升级客户端的网络驱动程序并检查连接问题(可能它们几乎不在无线范围内,或者以太网电缆缺少锁片)
如果它只在一台机器上工作,则可能是机器本身的问题,而不是代码的问题。显然,该机器上的设置存在问题,无法打开插座。你能改一下吗?你能从机器上ping这个IP吗?Dan Wilson:从你的链接中,有另一个条目“当本地机器上有多个IP地址可用时,有一种更准确的方法。连接UDP套接字并读取其本地端点”。。。这就是为什么我要做我现在正在做的事。蒙特利昂-是的,它发出的声音很好。。。(它的IP是192.168.0.189…所以它在我们的本地DNS中)我将检查这个并进一步研究。。。thanks@user3174075-如果这是答案,请不要忘记接受。@user3174075,有问题的计算机是否可能由于网络、防火墙或防病毒配置而无法访问不在本地网络上的IP地址?示例代码中的硬编码地址与您在注释中给出的192.168.0.189地址不在同一子网中。你还说本地计算机有多个地址,这些地址和硬编码地址在同一子网上吗?没有防火墙,没有防病毒。。。奇怪的是代码在其他机器上工作。。。
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() : "";
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() : "";