如何获取访问者的外网真实IP

Netcean 2011-12-13 09:19:01

Uri uri = new Uri("http://www.ip138.com/ip2city.asp");
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(uri);
req.Method = "POST";
req.ContentType = "application/x-www-form-urlencoded";
req.ContentLength = 0;
req.CookieContainer = new CookieContainer();
req.GetRequestStream().Write(new byte[0], 0, 0);
HttpWebResponse res = (HttpWebResponse)(req.GetResponse());
StreamReader rs = new StreamReader(res.GetResponseStream(), Encoding.GetEncoding("gb2312"));
string s = rs.ReadToEnd();
rs.Close();
req.Abort();
res.Close();
Match m = Regex.Match(s, @"(\d+)\.(\d+)\.(\d+)\.(\d+)");
if (m.Success) return m.Groups[0].Value.ToString().Trim();
string strnetIP = string.Empty;
return strnetIP;


现在做IP限制登录功能,用上面的代码获取到的还是web服务器的IP,并不是访问者的IP地址,请教应该如何获取登录系统者的外网真实IP?能让程序模拟访问ip138网站并获取上面显示的IP地址。谢谢
...全文
712 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
Netcean 2011-12-13
  • 打赏
  • 举报
回复
没人?1、3楼的方法获取到的IP跟ip138上的有差别。不是正确的
Netcean 2011-12-13
  • 打赏
  • 举报
回复
为什么无法获取到泉州联通的正确IP呢。奇怪,其它地方的都可以
小伙写代码 2011-12-13
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 netcean 的回复:]
引用 1 楼 a67251026 的回复:
Page.Request.UserHostAddress?

这是获取本机的IP,比如192.168.1.101
[/Quote]
如果你服务器架在局域网 那就是得到192.168.1.101
如果你服务器架在外网 那就是得到真实IP了
orain 2011-12-13
  • 打赏
  • 举报
回复

private static bool IsIP(string ip)
{
string[] sections = ip.Split('.');
if (sections.Length != 4)
return false;

foreach (string s in sections)
{
int tmp = int.Parse(s.Trim());
if (tmp > 255)
return false;
}

return true;
}

/// <summary>
/// 取得客户端真实IP。如果有代理则取第一个非内网地址
/// </summary>
public static string GetUserIP()
{
var svrVar = HttpContext.Current.Request.ServerVariables;
string result = svrVar["HTTP_X_FORWARDED_FOR"];

if (!String.IsNullOrEmpty(result))
{
//可能有代理
if (result.IndexOf(".") == -1) //沒有".",非 IPv4 格式
result = null;
else
{
if (result.IndexOf(",") != -1)
{
//有",",估計多個代理。取第一個不是內網的IP。
result = result.Replace(" ", "");
string[] temparyip = result.Split(',', ';');
foreach (string ip in temparyip)
{
string tmp = ip.Substring(0, 7);
if (IsIP(ip) && ip.Substring(0, 3) != "10." && tmp != "192.168" && tmp != "172.16.")
{
result = ip;
break;
}
}
}
else if (!IsIP(result))
result = null;
}
}

if (String.IsNullOrEmpty(result))
{
result = svrVar["REMOTE_ADDR"];
if(String.IsNullOrEmpty(result))
result = HttpContext.Current.Request.UserHostAddress;
}

return result;
}
Netcean 2011-12-13
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 a67251026 的回复:]
Page.Request.UserHostAddress?
[/Quote]
这是获取本机的IP,比如192.168.1.101
小伙写代码 2011-12-13
  • 打赏
  • 举报
回复
Page.Request.UserHostAddress?
肖无疾 2011-12-13
  • 打赏
  • 举报
回复
4楼说 的很清楚了
tonghui211306 2011-12-13
  • 打赏
  • 举报
回复
/// <summary>
/// 获取客户端的IP地址
/// </summary>
/// <returns></returns>
public static String ClientIP()
{
string result = String.Empty;
result = HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
if (result != null && result != String.Empty)
{
//可能有代理
if (result.IndexOf(".") == -1)
//没有"."肯定是非IPv4格式
result = null;
else
{
if (result.IndexOf(",") != -1)
{
//有",",估计多个代理。取第一个不是内网的IP。
result = result.Replace(" ", "").Replace("", "");
string[] temparyip = result.Split(",;".ToCharArray());
for (int i = 0; i < temparyip.Length; i++)
{
if (IsIPAddress(temparyip[i]) && temparyip[i].Substring(0, 3) != "10." && temparyip[i].Substring(0, 7) != "192.168" && temparyip[i].Substring(0, 7) != "172.16.")
{
return temparyip[i];//找到不是内网的地址
}
}
}
else if (IsIPAddress(result)) //代理即是IP格式
return result;
else
result = null;//代理中的内容 非IP,取IP
}
}
string IpAddress =
(HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"] != null &&
HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"] != String.Empty) ? HttpContext.Current.Request.ServerVariables
["HTTP_X_FORWARDED_FOR"] : HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
if (null == result || result == String.Empty)
result = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
if (result == null || result == String.Empty)
result = HttpContext.Current.Request.UserHostAddress;
return result;
}

private static bool IsIPAddress(string str1)
{
if (str1 == null || str1 == string.Empty || str1.Length < 7 || str1.Length > 15)
return false;
string regformat = @"^\d{1,3}[\.]\d{1,3}[\.]\d{1,3}[\.]\d{1,3}$";
Regex regex = new Regex(regformat, RegexOptions.IgnoreCase);
return regex.IsMatch(str1);
}
highpr 2011-12-13
  • 打赏
  • 举报
回复
道高一尺
Netcean 2011-12-13
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 chen_ya_ping 的回复:]
网上找个webservice,或者是调用人家的接口,就OK了啊
再不行,试试上面提出的方法。
[/Quote]

目前还没找到这样的webservice,

[Quote=引用 8 楼 huayy 的回复:]
用Request.ServerVariables("Remote_addr")试试
我一直用此方法取IP,如果你还要判断地址,不建议你模拟抓取IP138的,建议去网上下载一个纯真IP数据库,在CSDN下载频道有的
[/Quote]

只要正确获取IP地址就好,不需要判断是哪个地区的。
客户那通过Request.ServerVariables("Remote_addr")获取到的IP在ip138或chinaz上查不到。所以才想能ip138的为准。
huayy 2011-12-13
  • 打赏
  • 举报
回复
用Request.ServerVariables("Remote_addr")试试
我一直用此方法取IP,如果你还要判断地址,不建议你模拟抓取IP138的,建议去网上下载一个纯真IP数据库,在CSDN下载频道有的
chen_ya_ping 2011-12-13
  • 打赏
  • 举报
回复
网上找个webservice,或者是调用人家的接口,就OK了啊
再不行,试试上面提出的方法。

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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