背景:博主本是一位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地址以及归属地探秘的更多相关文章

  1. JAVA获取客户端IP地址

    在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的.但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实I ...

  2. (转)【ASP.NET开发】获取客户端IP地址 via C#

    [ASP.NET开发]获取客户端IP地址 via C# 说明:本文中的内容是我综合博客园上的博文和MSDN讨论区的资料,再通过自己的实际测试而得来,属于自己原创的内容说实话很少,写这一篇是为了记录自己 ...

  3. 获取客户端IP地址 via C#

    获取客户端IP地址 via C# 说明:本文中的内容是我综合博客园上的博文和MSDN讨论区的资料,再通过自己的实际测试而得来,属于自己原创的内容说实话很少,写这一篇是为了记录自己在项目中做过的事情,同 ...

  4. java服务器获取客户端ip

    在写服务端代码时,有时需要对客户端ip做认证,比如限制只有某些ip能访问,或者1个ip1天只能访问几次.最近就碰到个需要限制ip的情况,从网上找了一些服务器获取客户端ip的方法,说的都不太完善,这里整 ...

  5. PHP 如何获取客户端ip地址

    PHP 如何获取客户端ip地址 一.总结 一句话总结:主要是使用$_SERVER的 REMOTE_ADDR 和 HTTP_X_FORWARDED_FOR 两个属性,在用户使用不同代理的时候这两个属性可 ...

  6. .net core webapi 后台获取客户端ip地址

    Asp.Net Core2.0获取客户IP地址,及解决发布到Ubuntu服务器获取不到正确IP解决办法   1.获取客户端IP地址实现方法(扩展类) 1 using Microsoft.AspNetC ...

  7. .net 获取客户端Ip地址

    Request.ServerVariables["REMOTE_ADDR"]来取得客户端的IP地址,但如果客户端是使用代理服务器来访问,那取到的就是代理服务器的IP地址,而不是真正 ...

  8. 在Thinkphp3.2.3框架下实现自动获取客户端IP地址的get_client_ip()函数

    在Thinkphp框架下使用get_client_ip()函数获取客户端IP地址十分方便: 一行代码便可以实现:$ip = get_client_ip(); 但当我们测试时会遇到后台获取的IP地址显示 ...

  9. php获取客户端ip地址

    本文介绍一个,php获取客户端的IP地址的实例代码,有需要的朋友参考下吧. 获取客户端IP地址的代码,如下: 复制代码代码示例: <?php//取得客户端IP的函数function get_cl ...

随机推荐

  1. 菜鸟学Struts2——Interceptors

    昨天学习Struts2的Convention plugin,今天利用Convention plugin进行Interceptor学习,虽然是使用Convention plugin进行零配置开发,这只是 ...

  2. JAVA语言中的修饰符

    JAVA语言中的修饰符 -----------------------------------------------01--------------------------------------- ...

  3. 【初学python】使用python调用monkey测试

    目前公司主要开发安卓平台的APP,平时测试经常需要使用monkey测试,所以尝试了下用python调用monkey,代码如下: import os apk = {'j': 'com.***.test1 ...

  4. javascript中的继承与深度拷贝

    前言 本篇适合前端新人,下面开始...... 对于前端新手来说(比如博主),每当对js的对象做操作时,都是一种痛苦,原因就是在于对象的赋值是引用的传递,并非值的传递,虽然看上去后者赋值给了前者,他们就 ...

  5. Mac OS 使用 Vagrant 管理虚拟机(VirtualBox)

    Vagrant(官网.github)是一款构建虚拟开发环境的工具,支持 Window,Linux,Mac OS,Vagrant 中的 Boxes 概念类似于 Docker(实质是不同的),你可以把它看 ...

  6. 快递Api接口 & 微信公众号开发流程

    之前的文章,已经分析过快递Api接口可能被使用的需求及场景:今天呢,简单给大家介绍一下微信公众号中怎么来使用快递Api接口,来完成我们的需求和业务场景. 开发语言:Nodejs,其中用到了Neo4j图 ...

  7. Python(九)Tornado web 框架

    一.简介 Tornado 是 FriendFeed 使用的可扩展的非阻塞式 web 服务器及其相关工具的开源版本.这个 Web 框架看起来有些像web.py 或者 Google 的 webapp,不过 ...

  8. EF上下文对象线程内唯一性与优化

    在一次请求中,即一个线程内,若是用到EF数据上下文对象,就创建一个,这也加是很多人的代码中习惯在使用上下文对象时,习惯将对象建立在using中,也是为了尽早释放上下文对象, 但是如果有一个业务逻辑调用 ...

  9. ubuntu 下安装scrapy

    1.把Scrapy签名的GPG密钥添加到APT的钥匙环中: sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 6272 ...

  10. 编写简单的Makefile文件

    makefile中的编写内容如下: www:hello.c x.h gcc hello.c -o hello clean: rm hello www:hello.c  x.h 表示生成www这个文件需 ...