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 ...
随机推荐
- solr服务中集成IKAnalyzer中文分词器、集成dataimportHandler插件
昨天已经在Tomcat容器中成功的部署了solr全文检索引擎系统的服务:今天来分享一下solr服务在海量数据的网站中是如何实现数据的检索. 在solr服务中集成IKAnalyzer中文分词器的步骤: ...
- .NetCore MVC中的路由(1)路由配置基础
.NetCore MVC中的路由(1)路由配置基础 0x00 路由在MVC中起到的作用 前段时间一直忙于别的事情,终于搞定了继续学习.NetCore.这次学习的主题是MVC中的路由.路由是所有MVC框 ...
- Java8实战分享
虽然很多人已经使用了JDK8,看到不少代码,貌似大家对于Java语言or SDK的使用看起来还是停留在7甚至6. Java8在流式 or 链式处理,并发 or 并行方面增强了很多,函数式的风格使代码可 ...
- jQuery学习之路(1)-选择器
▓▓▓▓▓▓ 大致介绍 终于开始了我的jQuery学习之路!感觉不能再拖了,要边学习原生JavaScript边学习jQuery jQuery是什么? jQuery是一个快速.简洁的JavaScript ...
- mysql 学习总结
MYSQL的增.删.查.改 注册.授权 #创建一个对数据库中的表有一些操作权限的用户,其中OPERATION可以用all privileges替换,DBNAME.TABLENAME可以用*替换,表 ...
- C# 序列化与反序列化几种格式的转换
这里介绍了几种方式之间的序列化与反序列化之间的转换 首先介绍的如何序列化,将object对象序列化常见的两种方式即string和xml对象; 第一种将object转换为string对象,这种比较简单没 ...
- 怎样在Dos里切换盘符
一:在Dos里切换盘符 a:在电脑左下角右击显示图片;(我用的是win10系统,其他系统类似) b:点击运行,输入cmd; c:点击确定: d:输入盘符:(如f:) 或F: 只写字母,不写分号是不行的 ...
- linux启动SSH及开机自动启动
本文地址 分享提纲: 1.查看是否启动 2. 设置自动启动 1.[查看是否启动] 启动SSH服务 “/etc/init.d/sshd start”.然后用netstat -antulp | grep ...
- Android快乐贪吃蛇游戏实战项目开发教程-04虚拟方向键(三)三角形按钮效果
该系列教程概述与目录:http://www.cnblogs.com/chengyujia/p/5787111.html 一.知识点讲解 当我们点击系统自带的按钮时,按钮的外观会发生变化.上篇博文中我们 ...
- Markdown学习笔记
分为两步: 1.阅读Markdown中文官网的文档 2.下载MarkdownPad2将中文官网中文档的例子敲一遍,其中Markdownpad2为官网中推荐的编辑器 备注: 如果只看中文官网文档,不边看 ...