C#获取外网IP地址

julian 2012-07-01 03:52:32
写了个服务组件,如何获取本机电脑的外网ip地址(不是局域网的地址),求代码。
...全文
5040 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
尽在云中 2014-03-18
  • 打赏
  • 举报
回复
我好像搞定了,在网站上打开http://iframe.ip138.com/city.asp,它提示你的IP地址和位置,这时拷贝当前网页的网址,我的是http://iframe.ip138.com/ic.asp,然后用10L的方法
尽在云中 2014-03-18
  • 打赏
  • 举报
回复
LZ,问题解决没?我和你一样,得到一堆脚本
gy坏坏 2014-02-10
  • 打赏
  • 举报
回复
18# 正解
wy503160517 2014-01-23
  • 打赏
  • 举报
回复
被杀毒软件拦截,不可行,用户体验不好
Hsuwen 2013-03-25
  • 打赏
  • 举报
回复
/// <summary> /// IP地址服务类 /// </summary> public class IPHelper { HttpContextBase context; /// <summary> /// 构造函数 /// </summary> /// <param name="httpContext">请求上下文</param> public IPHelper(HttpContextBase httpContext) { context = httpContext as HttpContextBase; } /// <summary> /// ip正则校验 /// </summary> private Regex RegIP { get { return new Regex(@"^\d+.\d+.\d+.\d+$"); } } /// <summary> /// 获取ip地址 /// </summary> /// <returns></returns> public string GetIpAddress() { string ipAdress = "172.0.0.1"; if (RegIP.IsMatch(GetClientIpPv6())) { ipAdress = GetClientIpPv6(); } if (RegIP.IsMatch(GetClientIPv4())) { ipAdress = GetClientIPv4(); } return ipAdress; } /// <summary> /// 判断客户端有没有使用代理使用代理返回true,没有使用代理返回false /// </summary> /// <returns></returns> private bool IsProxy() { return context.Request.ServerVariables["HTTP_VIA"] != null; } /// <summary> /// 获取客户端的IPv6如果获取不到IPv6将自动获取IPv4 /// </summary> /// <returns></returns> private string GetClientIpPv6() { string ipv6 = string.Empty; //ipv6 = Request.UserHostAddress; if (IsProxy())//客户端有使用代理 { ipv6 = context.Request.ServerVariables["HTTP_X_FORWARDED_FOR"].ToString(); } else//客户端没有使用代理 { ipv6 = context.Request.ServerVariables["REMOTE_ADDR"].ToString(); } return ipv6; } /// <summary> /// 获取客户端的IPv4 /// </summary> /// <returns></returns> private string GetClientIPv4() { string ipv4 = String.Empty; foreach (IPAddress IPA in Dns.GetHostAddresses(context.Request.UserHostAddress)) { if (IPA.AddressFamily.ToString() == "InterNetwork") { ipv4 = IPA.ToString(); break; } } if (ipv4 != String.Empty) { return ipv4; } foreach (IPAddress IPA in Dns.GetHostAddresses(Dns.GetHostName())) { if (IPA.AddressFamily.ToString() == "InterNetwork") { ipv4 = IPA.ToString(); break; } } return ipv4; } }
sysmenu 2013-03-07
  • 打赏
  • 举报
回复
也就是必须通过这个http://iframe.ip138.com/ipcity.asp来获得本地计算机外网的ip吗?难道没有公用的类通过联网来直接调出ip地址?
kalaam 2012-10-27
  • 打赏
  • 举报
回复
经测试,IP138使用了重定向,且似乎没天重定向地址不一样。
以下代码有点繁琐,但可以实现。
private string GetIpAddress()
{
try
{
WebClient client = new WebClient();
client.Encoding = System.Text.Encoding.Default;
string response = client.UploadString("http://iframe.ip138.com/ipcity.asp","");
Match mc = Regex.Match(response, @"location.href=""(.*)""");
if(mc.Success && mc.Groups.Count > 1)
{
response = client.UploadString(mc.Groups[1].Value,"");
return response;//做相关处理
}
return null;
}
catch (System.Exception e)
{
}
}
wzxlyl123 2012-10-15
  • 打赏
  • 举报
回复
#12楼 是测试通过的的代码,非常好,2楼 10楼的代码是正确的,就是不知道为什么回不来IP地址,是不是被访问网站的问题呢? 2楼 10楼的代码稍加改动配上12楼的网址就能得到外网ip了。
测试中使用了多线程得到了更好的体验
kevin_尛柒 2012-09-12
  • 打赏
  • 举报
回复
IP138的地址是变化的,所以得改地址!!
现在可用的是http://city.ip138.com/city0.asp
duliguo726 2012-08-01
  • 打赏
  • 举报
回复
我使用2楼和7楼的方法得到的结果都是
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta http-equiv="refresh" content="0;url=http://city.ip138.com/city0.asp">
<title>IP地址查询</title>
</head>
<body>
<script type="text/javascript">
location.href="http://city.ip138.com/city0.asp";
</script>
</body>
</html>
mmmmtest 2012-07-05
  • 打赏
  • 举报
回复
像我这样的菜鸟只能祝你好运了,
brightfran 2012-07-05
  • 打赏
  • 举报
回复
我对这个问题也感兴趣,只能先帮你ding,期待大神解决了
熙风 2012-07-05
  • 打赏
  • 举报
回复
   /// <summary>
/// 得到外网IP地址
/// </summary>
/// <returns></returns>
public static string GetIP()
{
Uri uri = new Uri("http://city.ip138.com/ip2city.asp");
System.Net.HttpWebRequest req = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(uri);
req.Method = "get";
using (Stream s = req.GetResponse().GetResponseStream())
{
using (StreamReader reader = new StreamReader(s))
{
char[] ch = {'[',']' };
string str = reader.ReadToEnd();
System.Text.RegularExpressions.Match m = System.Text.RegularExpressions.Regex.Match(str, @"\[(?<IP>[0-9\.]*)\]");
return m.Value.Trim(ch) ;

}
}
}
julian 2012-07-05
  • 打赏
  • 举报
回复
2楼的方法 打开页面是可以获取ip;
但是,在调试时,该方法获取的是脚本代码,没有ip信息;
string all = sr.ReadToEnd(); //读取网站的数据


可有其他法子?
tangping112 2012-07-05
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]
C# code
/// <summary>
/// 得到外网IP地址
/// </summary>
/// <returns></returns>
public static string GetIP()
{
Uri uri = new Uri("http://city.ip……
[/Quote]

只能通过第三方网站获取吗?
诺维斯基 2012-07-05
  • 打赏
  • 举报
回复
不知道这个行不行:
string ip=Request.UserHostAddress.ToString(); //获取访问者的当前上网ip
taotao5268 2012-07-05
  • 打赏
  • 举报
回复
直接调用方法

public static IPAddress getRemoteIP()
{
WebClient client = new WebClient();
byte[] bytRecv = client.DownloadData("http://www.123cha.com/"); //下载网页数据
string str = System.Text.Encoding.GetEncoding("gb2312").GetString(bytRecv);
string r = @"(((\d{1,3})|(1\d{2})|(2[0-4]\d)|(25[0-5]))\.){3}((\d{1,3})|(1\d{2})|(2[0-4]\d)|(25[0-5]))";
string ip = System.Text.RegularExpressions.Regex.Match(str, r).ToString(); //提取信息
return IPAddress.Parse(ip);
}
wy811007 2012-07-05
  • 打赏
  • 举报
回复
对了 不行看我这个 之前发问的
http://topic.csdn.net/u/20110810/18/bf2541bf-45f5-4070-91ff-5aa9fd4648ab.html
wy811007 2012-07-05
  • 打赏
  • 举报
回复
//获取本机的公网IP
privatestaticstring GetIP()
{
string tempip ="";
try
{
WebRequest wr = WebRequest.Create("http://iframe.ip138.com/city.asp");
Stream s = wr.GetResponse().GetResponseStream();
StreamReader sr =new StreamReader(s, Encoding.Default);
string all = sr.ReadToEnd(); //读取网站的数据

int start = all.IndexOf("[") +1;
int end = all.IndexOf("]", start);
tempip = all.Substring(start, end - start);
sr.Close();
s.Close();
}
catch
{
}
return tempip;
}

这个ok
devmiao 2012-07-01
  • 打赏
  • 举报
回复
一般需要访问一个外网网站才能返回。

比如ip138
但是这也有缺点。

很容易在内网模拟或者伪造这么一个网站,那么可以使得程序返回错误的网址。
加载更多回复(4)

110,545

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧