我在本地网络上有一台计算机,它位于NAT路由器后面。我有一些192.168.0.x地址,但我真正想知道的是我的公共IP地址,而不是在以下链接中提到的内容:
或者
我需要C#代码。
是否可能?如果是,怎么做?
我在本地网络上有一台计算机,它位于NAT路由器后面。我有一些192.168.0.x地址,但我真正想知道的是我的公共IP地址,而不是在以下链接中提到的内容:
或者
我需要C#代码。
是否可能?如果是,怎么做?
我更喜欢http://icanhazip.com。它返回一个简单的文本字符串,无需进行HTML解析。
string myIp = new WebClient().DownloadString(@"http://icanhazip.com").Trim();
经过一些搜索并扩大我的要求,我发现这不仅可以获取IP地址,还可以获取地理位置信息:
class GeoIp
{
static public GeoIpData GetMy()
{
string url = "http://freegeoip.net/xml/";
WebClient wc = new WebClient();
wc.Proxy = null;
MemoryStream ms = new MemoryStream(wc.DownloadData(url));
XmlTextReader rdr = new XmlTextReader(url);
XmlDocument doc = new XmlDocument();
ms.Position = 0;
doc.Load(ms);
ms.Dispose();
GeoIpData retval = new GeoIpData();
foreach (XmlElement el in doc.ChildNodes[1].ChildNodes)
{
retval.KeyValue.Add(el.Name, el.InnerText);
}
return retval;
}
}
返回了XML,因此键/值字典将填充如下:
<Response>
<Ip>93.139.127.187</Ip>
<CountryCode>HR</CountryCode>
<CountryName>Croatia</CountryName>
<RegionCode>16</RegionCode>
<RegionName>Varazdinska</RegionName>
<City>Varazdinske Toplice</City>
<ZipCode/>
<Latitude>46.2092</Latitude>
<Longitude>16.4192</Longitude>
<MetroCode/>
</Response>
class GeoIpData
{
public GeoIpData()
{
KeyValue = new Dictionary<string, string>();
}
public Dictionary<string, string> KeyValue;
}
问题在于你要查找的IP地址并不属于你的计算机,而是属于你的NAT路由器。我能想到的获取它的唯一方法是使用外部服务器或查询路由器。
如果你的路由器支持SNMP,也许可以通过这种方式获取它。
我相信你需要连接到某个服务器才能获取你的外部IP。
如果uPNP失败了,您可以尝试使用whatsmyip.com。
using System.Threading;
Task<string>[] tasks = new[]
{
Task<string>.Factory.StartNew( () => new System.Net.WebClient().DownloadString(@"http://icanhazip.com").Trim() ),
Task<string>.Factory.StartNew( () => new System.Net.WebClient().DownloadString(@"http://checkip.dyndns.org").Trim() )
};
int index = Task.WaitAny( tasks );
string ip = tasks[index].Result;
[Serializable]
public class LocationData
{
public string IP { get; set; }
public string CountryCode { get; set; }
public string CountryName { get; set; }
public string RegionCode { get; set; }
public string City { get; set; }
public string ZipCode { get; set; }
public string TimeZone { get; set; }
public string Latitude { get; set; }
public string Longitude { get; set; }
public string MetroCode { get; set; }
}
public static LocationData GetLocation(string ip= "")
{
using (var client = new System.Net.WebClient())
{
XmlRootAttribute xRoot = new XmlRootAttribute();
xRoot.ElementName = "Response";
string downloadedString = client.DownloadString("http://freegeoip.net/xml/" + ip);
XmlSerializer mySerializer = new XmlSerializer(typeof(LocationData), xRoot) ;
using (XmlReader xmlReader = XmlReader.Create(new System.IO.StringReader(downloadedString)))
{
return mySerializer.Deserialize(xmlReader)as LocationData;
}
}
}
由于答案是“坏”的xml,需要指定xRoot元素,否则会出现错误。
编码愉快
沃尔特
string _externalIP;
_externalIP = (new WebClient()).DownloadString("http://http://icanhazip.com/");
_externalIP = (new Regex(@"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}"))
.Matches(externalIP)[0].ToString();
WebClient
打开http://www.whatismyip.com/并解析输出以获取您的IP地址。 - BrokenGlass