我正在使用代码
string host = System.Net.Dns.GetHostName();
string hostname = Dns.GetHostEntry(host).HostName;
IPHostEntry ipEntry = Dns.GetHostEntry(host);
IPAddress[] addr = ipEntry.AddressList;
在本地工作正常并给我“192.168.1.4”但在服务器端它给出“2002:cc5d:a178 :: cc5d:a178”
答案 0 :(得分:2)
第一个地址192.168.1.4是IPv4,第二个地址2002:cc5d:a178 :: cc5d:a178是IPv6地址。遗憾的是,您无法将IPv6从IPv6转换为IPv4,如下所示:Problem Converting ipv6 to ipv4
简单回答:在服务器上禁用IPV6,或从DNS条目中删除服务器的IPV6地址。
没有神奇的IPV4< - > IPV6转换器。它们是完全不同的协议,一个地址不转换为另一个。如果要可靠地检索客户端的IPV4地址,则需要确保客户端通过IPV4连接。
更新如果要禁用IPv6(在Windows服务器上),请按照Microsoft支持文章中的说明操作:http://support.microsoft.com/kb/929852但请记住IPv4 慢慢地被IPv6取代,因此您可能最好使用服务器默认IP分辨率。
答案 1 :(得分:1)
你得到> 1 Ip回来了,并且(假设服务器真的得到了一个ipv4地址)你可以只查找IPv4而不是ipV6的地址。像
string host = System.Net.Dns.GetHostName();
string hostname = Dns.GetHostEntry(host).HostName;
IPHostEntry ipEntry = Dns.GetHostEntry(host);
IPAddress[] addr = ipEntry.AddressList;
foreach (IPAddress a in addr)
Console.WriteLine("{0}:{1}", a.AddressFamily, a.ToString());
这将为您提供以下内容:
InterNetworkV6:fe80::c80b:d804:38c3:2734%17
InterNetworkV6:fe80::752d:9c4a:69fd:cb63%15
InterNetwork:169.254.80.80
InterNetwork:10.0.1.17
答案 2 :(得分:0)
你可以使用它。
using System;
using System.Net;
public class IPNetworking
{
public static string GetIP4Address()
{
string IP4Address = String.Empty;
foreach (IPAddress IPA in Dns.GetHostAddresses(HttpContext.Current.Request.UserHostAddress))
{
if (IPA.AddressFamily.ToString() == "InterNetwork")
{
IP4Address = IPA.ToString();
break;
}
}
if (IP4Address != String.Empty)
{
return IP4Address;
}
foreach (IPAddress IPA in Dns.GetHostAddresses(Dns.GetHostName()))
{
if (IPA.AddressFamily.ToString() == "InterNetwork")
{
IP4Address = IPA.ToString();
break;
}
}
return IP4Address;
}
//调用此函数获取Ip
string ClientIP = IP4.GetIP4Address();