C#服务器获取客户端IP地址以及归属地探秘
背景:博主本是一位Windows桌面应用程序开发工程师,对网络通信一知半解。一日老婆逛完某宝,问:“为什么他们知道我的地址呢,他们是怎么获取我的地址的呢?”
顺着这个问题我们的探秘开始:
第一步:简单的服务搭建
思路,通过HttpListener在本地搭建一个简易的服务器,开发程序为控制台接口,核心类 HttpListenerService:
方法 Start()开启线程池针对指定IP进行监听,本地的端口选取的9527(周星驰唐伯虎点秋香在华府的编号)
public void Start(object obj)
{
try
{
//指定身份验证 Anonymous匿名访问
_httpListener.AuthenticationSchemes = AuthenticationSchemes.Anonymous;
//GetLocalIpAddress()----获取本地IP的方法
_httpListener.Prefixes.Add("http://" + GetLocalIpAddress() + ":9527/");
_httpListener.Start(); //等待请求连接
while (true)
{
//等待请求连接
//没有请求则GetContext处于阻塞状态
var ctx = _httpListener.GetContext();
ThreadPool.QueueUserWorkItem(TaskProc, ctx);
}
}
catch (Exception ex)
{
throw;
}
}
第二步:获取客户端request的IP地址
网上查询了很多例子,感觉太复杂了,自己通过VS的快速监视功能发现有一个属性 RemoteEndPoint 可以获取客户端IP和端口号 ,其实应该根据Get和POST进行区分,为了方便暂时省略
private void TaskProc(object o)
{
try
{;
var ctx = (HttpListenerContext) o;
string ipAddress = null;
if (ctx.Request.RemoteEndPoint != null)
{
ipAddress = ctx.Request.RemoteEndPoint.Address.ToString();
}
//后面的暂时不用看,已经获取到客户端访问IP
var encoding = Encoding.GetEncoding("gb2312");
var callbackData = JsonConvert.SerializeObject(IpGetCity(GetOuterNetIp()));
var data = encoding.GetBytes(callbackData);
ctx.Response.StatusCode = ;
ctx.Response.Close(data, false);
}
catch (Exception ex)
{
}
}
第三步:如何根据客户端的IP获取,客户端所在的地址,因为事情起源来自淘宝,所以就 查询淘宝是否有类似的接口,果然经过搜索后查到 http://ip.taobao.com/service/getIpInfo.php?ip= 客户IP的Json对象,通过Fiddler解析返回数据,创建对应Json格式对象,封装获取方法

public static Result IpGetCity(string ipAddres)
{
try
{
if (!ValidateIpAddress(ipAddres)) return null; var url = new Uri("http://ip.taobao.com/service/getIpInfo.php?ip=" + ipAddres);
var request = (HttpWebRequest) WebRequest.Create(url);
request.Timeout = *;
request.KeepAlive = false;
request.Method = "GET";
var resoponse = request.GetResponse();
string pageHtml;
// ReSharper disable once AssignNullToNotNullAttribute
using (var stream = new StreamReader(resoponse.GetResponseStream()))
{
pageHtml = stream.ReadToEnd();
}
var data = JsonConvert.DeserializeObject<Result>(pageHtml);
return data;
}
catch (WebException webEx)
{
throw;
}
}
第四步:测试。 因为本地是局域网,发送IP地址后返回肯定为空,先尝试查询本地外网IP,那么如何获取本地的外网IP呢?还是同前面的思路一样,网络查询类似的接口,百度一下直接根据第一个搜索的结果查询,http://1212.ip138.com,建立webrequest请求,抓取Html数据
public static string GetOuterNetIp()
{
var tempIp = "";
try
{
WebRequest wr = (HttpWebRequest) WebRequest.Create("http://1212.ip138.com");
var stream = wr.GetResponse().GetResponseStream();
var sr = new StreamReader(stream, Encoding.GetEncoding("gb2312"));
var all = sr.ReadToEnd();
//读取网站的数据
var start = all.IndexOf("您的IP是:[", StringComparison.Ordinal) + ;
var end = all.IndexOf("]", start, StringComparison.Ordinal);
tempIp = all.Substring(start, end - start);
sr.Close();
stream.Close();
}
catch
{
// ignored
}
return tempIp;
}
但是问题出现了,为什么我浏览器获取的数据可以得到本机的IP,但是我建立的连接获取的请求却是这样


经过分析后发现,这个网址试用iframe框架进行处理,无法获取到frame框架的内部信息,然后抓去frame信息发现其实他真正请求的路径为 http://1212.ip138.com/ic.asp,该网站的编码格式为gb2312,再次发送请求获取返回数据:

虽然大概了解的一些,但是比如用户用代理服务器访问等一系列的问题还是需要我继续去探索!
C#服务器获取客户端IP地址以及归属地探秘的更多相关文章
- JAVA获取客户端IP地址
在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的.但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实I ...
- (转)【ASP.NET开发】获取客户端IP地址 via C#
[ASP.NET开发]获取客户端IP地址 via C# 说明:本文中的内容是我综合博客园上的博文和MSDN讨论区的资料,再通过自己的实际测试而得来,属于自己原创的内容说实话很少,写这一篇是为了记录自己 ...
- 获取客户端IP地址 via C#
获取客户端IP地址 via C# 说明:本文中的内容是我综合博客园上的博文和MSDN讨论区的资料,再通过自己的实际测试而得来,属于自己原创的内容说实话很少,写这一篇是为了记录自己在项目中做过的事情,同 ...
- java服务器获取客户端ip
在写服务端代码时,有时需要对客户端ip做认证,比如限制只有某些ip能访问,或者1个ip1天只能访问几次.最近就碰到个需要限制ip的情况,从网上找了一些服务器获取客户端ip的方法,说的都不太完善,这里整 ...
- PHP 如何获取客户端ip地址
PHP 如何获取客户端ip地址 一.总结 一句话总结:主要是使用$_SERVER的 REMOTE_ADDR 和 HTTP_X_FORWARDED_FOR 两个属性,在用户使用不同代理的时候这两个属性可 ...
- .net core webapi 后台获取客户端ip地址
Asp.Net Core2.0获取客户IP地址,及解决发布到Ubuntu服务器获取不到正确IP解决办法 1.获取客户端IP地址实现方法(扩展类) 1 using Microsoft.AspNetC ...
- .net 获取客户端Ip地址
Request.ServerVariables["REMOTE_ADDR"]来取得客户端的IP地址,但如果客户端是使用代理服务器来访问,那取到的就是代理服务器的IP地址,而不是真正 ...
- 在Thinkphp3.2.3框架下实现自动获取客户端IP地址的get_client_ip()函数
在Thinkphp框架下使用get_client_ip()函数获取客户端IP地址十分方便: 一行代码便可以实现:$ip = get_client_ip(); 但当我们测试时会遇到后台获取的IP地址显示 ...
- php获取客户端ip地址
本文介绍一个,php获取客户端的IP地址的实例代码,有需要的朋友参考下吧. 获取客户端IP地址的代码,如下: 复制代码代码示例: <?php//取得客户端IP的函数function get_cl ...
随机推荐
- Unity3d入门 - 关于unity工具的熟悉
上周由于工作内容较多,花在unity上学习的时间不多,但总归还是学习了一些东西,内容如下: .1 根据相关的教程在mac上安装了unity. .2 学习了unity的主要的工具分布和对应工具的相关的功 ...
- 从Membership 到 .NET4.5 之 ASP.NET Identity
我们前面已经讨论过了如何在一个网站中集成最基本的Membership功能,然后深入学习了Membership的架构设计.正所谓从实践从来,到实践从去,在我们把Membership的结构吃透之后,我们要 ...
- ABP文档 - Mvc 视图
文档目录 本节内容: 简介 AbpWebViewPage 基类 简介 ABP通过nuget包Abp.Web.Mvc集成到Mvc视图里,你可以像往常那样创建常规的视图. AbpWebViewPage 基 ...
- AutoMapper:Unmapped members were found. Review the types and members below. Add a custom mapping expression, ignore, add a custom resolver, or modify the source/destination type
异常处理汇总-后端系列 http://www.cnblogs.com/dunitian/p/4523006.html 应用场景:ViewModel==>Mode映射的时候出错 AutoMappe ...
- .net 分布式架构之业务消息队列
开源QQ群: .net 开源基础服务 238543768 开源地址: http://git.oschina.net/chejiangyi/Dyd.BusinessMQ ## 业务消息队列 ##业务消 ...
- YII 2.x 模板文件的 beginBlock、beginContent、beginCache
echo '-----------beginBlock--------------------- <br />'; $this->beginBlock('block1', false ...
- ASP.NET MVC 5 系列 学习笔记 目录 (持续更新...)
前言: 记得当初培训的时候,学习的还是ASP.NET,现在回想一下,图片水印.统计人数.过滤器....HttpHandler是多么的经典! 不过后来接触到了MVC,便立马爱上了它.Model-View ...
- 超全面的.NET GDI+图形图像编程教程
本篇主题内容是.NET GDI+图形图像编程系列的教程,不要被这个滚动条吓到,为了查找方便,我没有分开写,上面加了目录了,而且很多都是源码和图片~ (*^_^*) 本人也为了学习深刻,另一方面也是为了 ...
- DB2重启数据库实例
DB2重启数据库实例时,有时停止实例会失败,此时需要先确认没有应用链接数据库,然后再关闭数据库实例,并重新启动. 1.查看是否有活动的链接 命令:db2 list applications for d ...
- 图解Spark API
初识spark,需要对其API有熟悉的了解才能方便开发上层应用.本文用图形的方式直观表达相关API的工作特点,并提供了解新的API接口使用的方法.例子代码全部使用python实现. 1. 数据源准备 ...