不要总是依赖InterNetwork,因为您可能有多个设备也使用IP4,这会影响获取IP的结果。
首先,我会获取路由器(网关)的地址。如果返回的结果显示我连接到了一个网关(这意味着没有直接连接到无线调制解调器或者不是无线的),那么我们就有了网关地址作为IPAddress,否则我们将得到一个空指针IPAddress引用。
然后,我们需要获取计算机的IP地址列表。这里并不难,因为所有路由器(所有的路由器)都使用4个字节(…)。前三个最重要,因为连接到它的任何计算机的IP4地址都将匹配前三个字节。例如:192.168.0.1是路由器默认IP的标准值,除非管理员对其进行了更改。“192.168.0”或其他值是我们需要匹配的内容。这就是我在IsAddressOfGateway函数中所做的全部工作。
之所以需要匹配长度是因为并不是所有地址(只针对计算机)都具有4个字节的长度。通过在cmd中输入netstat命令,您会发现这一点。所以这样做确实需要更多的工作来找到你真正需要的东西。消去法的过程。
而且,千万不要通过ping来查找地址,因为这需要时间,首先您会发送要被ping的地址,然后它必须返回结果。不要这样做,而是直接使用与您的系统环境相关的.Net类来处理,您将在需要仅与计算机有关的答案时得到您要找的答案。
现在如果您直接连接到您的调制解调器,过程几乎相同,因为调制解调器是您的网关,但子掩码不同,因为您是直接从DNS服务器通过调制解调器获取信息,而不是由路由器掩盖,提供给您上网。尽管如此,您仍然可以使用相同的代码,因为分配给调制解调器的IP的最后一个字节是1。因此,如果从调制解调器发送的IP(会发生变化)为111.111.111.1,则将获得111.111.111.(某个字节值)。请记住,我们需要查找网关信息,因为与互联网连接有关的设备比您的路由器和调制解调器更多。
现在您知道为什么不要更改路由器的前两个字节192和168了。这些只是为路由器专门保留的,不用于互联网使用,否则IP协议将出现严重问题,并且双ping将导致计算机崩溃。想象一下,如果您被分配的路由器IP是192.168.44.103,而您单击了一个具有相同IP的站点。天啊!您的计算机将不知道要ping什么。就会在那里崩溃。为避免这个问题,只分配给路由器,而不用于互联网使用。所以请让路由器的前两个字节保持原样。
static IPAddress FindLanAddress()
{
IPAddress gateway = FindGetGatewayAddress();
if (gateway == null)
return null;
IPAddress[] pIPAddress = Dns.GetHostAddresses(Dns.GetHostName());
foreach (IPAddress address in pIPAddress) {
if (IsAddressOfGateway(address, gateway))
return address;
return null;
}
static bool IsAddressOfGateway(IPAddress address, IPAddress gateway)
{
if (address != null && gateway != null)
return IsAddressOfGateway(address.GetAddressBytes(),gateway.GetAddressBytes());
return false;
}
static bool IsAddressOfGateway(byte[] address, byte[] gateway)
{
if (address != null && gateway != null)
{
int gwLen = gateway.Length;
if (gwLen > 0)
{
if (address.Length == gateway.Length)
{
--gwLen;
int counter = 0;
for (int i = 0; i < gwLen; i++)
{
if (address[i] == gateway[i])
++counter;
}
return (counter == gwLen);
}
}
}
return false;
}
static IPAddress FindGetGatewayAddress()
{
IPGlobalProperties ipGlobProps = IPGlobalProperties.GetIPGlobalProperties();
foreach (NetworkInterface ni in NetworkInterface.GetAllNetworkInterfaces())
{
IPInterfaceProperties ipInfProps = ni.GetIPProperties();
foreach (GatewayIPAddressInformation gi in ipInfProps.GatewayAddresses)
return gi.Address;
}
return null;
}
Dns.GetHostEntry(Dns.GetHostName()).AddressList.Where(o => o.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork).First().ToString()
- Luis Perez