【发布时间】: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 中)