C#服务器获取客户端IP地址以及归属地探秘
admin
2023-03-25 15:21:23
0

背景:博主本是一位Windows桌面应用程序开发工程师,对网络通信一知半解。一日老婆逛完某宝,问:“为什么他们知道我的地址呢,他们是怎么获取我的地址的呢?” 

 

顺着这个问题我们的探秘开始:

第一步:简单的服务搭建

思路,通过HttpListener在本地搭建一个简易的服务器,开发程序为控制台接口,核心类 HttpListenerService:

方法 Start()开启线程池针对指定IP进行监听,本地的端口选取的9527(周星驰唐伯虎点秋香在华府的编号)

C#服务器获取客户端IP地址以及归属地探秘

 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;
            }
        }

C#服务器获取客户端IP地址以及归属地探秘

第二步:获取客户端request的IP地址

           网上查询了很多例子,感觉太复杂了,自己通过VS的快速监视功能发现有一个属性 RemoteEndPoint 可以获取客户端IP和端口号 ,其实应该根据Get和POST进行区分,为了方便暂时省略

C#服务器获取客户端IP地址以及归属地探秘

 1 private void TaskProc(object o) 2         { 3             try 4             {; 5                 var ctx = (HttpListenerContext) o; 6                 string ipAddress = null; 7                 if (ctx.Request.RemoteEndPoint != null) 8                 { 9                     ipAddress = ctx.Request.RemoteEndPoint.Address.ToString();10                 }              
11               //后面的暂时不用看,已经获取到客户端访问IP12                 var encoding = Encoding.GetEncoding("gb2312");13                 var callbackData = JsonConvert.SerializeObject(IpGetCity(GetOuterNetIp()));14                 var data = encoding.GetBytes(callbackData);15                 ctx.Response.StatusCode = 200;16                 ctx.Response.Close(data, false);17             }18             catch (Exception ex)19             {20             }21         }

C#服务器获取客户端IP地址以及归属地探秘

第三步:如何根据客户端的IP获取,客户端所在的地址,因为事情起源来自淘宝,所以就 查询淘宝是否有类似的接口,果然经过搜索后查到 http://ip.taobao.com/service/getIpInfo.php?ip= 客户IP的Json对象,通过Fiddler解析返回数据,创建对应Json格式对象,封装获取方法

 

C#服务器获取客户端IP地址以及归属地探秘

 

C#服务器获取客户端IP地址以及归属地探秘

 1  public static Result IpGetCity(string ipAddres) 2         { 3             try 4             { 5                 if (!ValidateIpAddress(ipAddres)) return null; 6  7                 var url = new Uri("http://ip.taobao.com/service/getIpInfo.php?ip=" + ipAddres); 8                 var request = (HttpWebRequest) WebRequest.Create(url); 9                 request.Timeout = 1000*5;10                 request.KeepAlive = false;11                 request.Method = "GET";12                 var resoponse = request.GetResponse();13                 string pageHtml;14                 // ReSharper disable once AssignNullToNotNullAttribute15                 using (var stream = new StreamReader(resoponse.GetResponseStream()))16                 {17                     pageHtml = stream.ReadToEnd();18                 }             
19                 var data = JsonConvert.DeserializeObject(pageHtml);20                 return data;21             }22             catch (WebException webEx)23             {24                 throw;25             }26         }

C#服务器获取客户端IP地址以及归属地探秘

 

第四步:测试。 因为本地是局域网,发送IP地址后返回肯定为空,先尝试查询本地外网IP,那么如何获取本地的外网IP呢?还是同前面的思路一样,网络查询类似的接口,百度一下直接根据第一个搜索的结果查询,http://1212.ip138.com,建立webrequest请求,抓取Html数据

C#服务器获取客户端IP地址以及归属地探秘

 1  public static string GetOuterNetIp() 2         { 3             var tempIp = ""; 4             try 5             { 6                 WebRequest wr = (HttpWebRequest) WebRequest.Create("http://1212.ip138.com"); 7                 var stream = wr.GetResponse().GetResponseStream(); 8                 var sr = new StreamReader(stream, Encoding.GetEncoding("gb2312")); 9                 var all = sr.ReadToEnd(); 
10                 //读取网站的数据11                 var start = all.IndexOf("您的IP是:[", StringComparison.Ordinal) + 7;12                 var end = all.IndexOf("]", start, StringComparison.Ordinal);13                 tempIp = all.Substring(start, end - start);14                 sr.Close();15                 stream.Close();16             }17             catch28             {19                 // ignored20             }21             return tempIp;22         }

C#服务器获取客户端IP地址以及归属地探秘

 

 但是问题出现了,为什么我浏览器获取的数据可以得到本机的IP,但是我建立的连接获取的请求却是这样

C#服务器获取客户端IP地址以及归属地探秘

C#服务器获取客户端IP地址以及归属地探秘

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

C#服务器获取客户端IP地址以及归属地探秘

虽然大概了解的一些,但是比如用户用代理服务器访问等一系列的问题还是需要我继续去探索!

 


相关内容

热门资讯

学生放学回家后又返回学校坠亡,... 学生符某放学后回到家中,后又从家中返回学校,并于当晚从学校教学楼楼顶坠亡。符某父母随后将学校告上法庭...
泽连斯基称乌已向俄方提交100... 当地时间10日,乌克兰总统泽连斯基表示,乌俄双方将以“千人换千人”的方式交换战俘,乌方已向俄方提交了...
国网上海市电力公司举办“明灯引... 5月7日至9日,在第十个“中国品牌日”来临之际,国网上海市电力公司(以下简称“国网上海电力”)以“明...
字跳申请会话信息的发送方法专利... 国家知识产权局信息显示,北京字跳网络技术有限公司申请一项名为“会话信息的发送方法、装置、电子设备、存...
非开挖定向钻机厂家选择指南:郑... 导语:非开挖定向钻机作为市政管道铺设、能源管线穿越等场景的核心设备,其性能稳定性与厂家服务能力直接影...
你昂贵的DDR5内存可能是假货... 快科技5月10日消息,内存价格近期持续走高,亚洲市场出现大量假冒DDR5内存模块,且外观极具迷惑性。...
6G,迎利好!工信部批复 工信部批复6G技术试验频率。 为进一步推动我国6G技术研发、标准研制与产业化进程,工业和信息化部近日...
涉疫邮轮5名法国公民回国,一人... △“洪迪厄斯”号邮轮(资料图)法国总理勒科尔尼10日在社交媒体说,涉汉坦病毒疫情邮轮“洪迪厄斯”号上...
伊朗警告法英两国:只有我们能保... △霍尔木兹海峡(资料图)针对法国和英国计划向红海及霍尔木兹海峡周边海域增派军舰,伊朗副外长加里巴巴迪...
这次对武大不妨多一点包容 1)国内某手机品牌为母亲节准备的文案,引发了很大的争议。2)我想,品牌方肯定也在努力反思当中,它在第...