溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

C#服務(wù)器獲取客戶端IP地址以及歸屬地探秘

發(fā)布時間:2020-07-13 12:58:35 來源:網(wǎng)絡(luò) 閱讀:809 作者:張立達 欄目:建站服務(wù)器

背景:博主本是一位Windows桌面應(yīng)用程序開發(fā)工程師,對網(wǎng)絡(luò)通信一知半解。一日老婆逛完某寶,問:“為什么他們知道我的地址呢,他們是怎么獲取我的地址的呢?” 

 

順著這個問題我們的探秘開始:

第一步:簡單的服務(wù)搭建

思路,通過HttpListener在本地搭建一個簡易的服務(wù)器,開發(fā)程序為控制臺接口,核心類 HttpListenerService:

方法 Start()開啟線程池針對指定IP進行監(jiān)聽,本地的端口選取的9527(周星馳唐伯虎點秋香在華府的編號)

C#服務(wù)器獲取客戶端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處于阻塞狀態(tài)
                    var ctx = _httpListener.GetContext();
                    ThreadPool.QueueUserWorkItem(TaskProc, ctx);
                }
            }            catch (Exception ex)
            {                throw;
            }
        }

C#服務(wù)器獲取客戶端IP地址以及歸屬地探秘

第二步:獲取客戶端request的IP地址

           網(wǎng)上查詢了很多例子,感覺太復(fù)雜了,自己通過VS的快速監(jiān)視功能發(fā)現(xiàn)有一個屬性 RemoteEndPoint 可以獲取客戶端IP和端口號 ,其實應(yīng)該根據(jù)Get和POST進行區(qū)分,為了方便暫時省略

C#服務(wù)器獲取客戶端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               //后面的暫時不用看,已經(jīng)獲取到客戶端訪問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#服務(wù)器獲取客戶端IP地址以及歸屬地探秘

第三步:如何根據(jù)客戶端的IP獲取,客戶端所在的地址,因為事情起源來自淘寶,所以就 查詢淘寶是否有類似的接口,果然經(jīng)過搜索后查到 http://ip.taobao.com/service/getIpInfo.php?ip= 客戶IP的Json對象,通過Fiddler解析返回數(shù)據(jù),創(chuàng)建對應(yīng)Json格式對象,封裝獲取方法

 

C#服務(wù)器獲取客戶端IP地址以及歸屬地探秘

 

C#服務(wù)器獲取客戶端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<Result>(pageHtml);20                 return data;21             }22             catch (WebException webEx)23             {24                 throw;25             }26         }

C#服務(wù)器獲取客戶端IP地址以及歸屬地探秘

 

第四步:測試。 因為本地是局域網(wǎng),發(fā)送IP地址后返回肯定為空,先嘗試查詢本地外網(wǎng)IP,那么如何獲取本地的外網(wǎng)IP呢?還是同前面的思路一樣,網(wǎng)絡(luò)查詢類似的接口,百度一下直接根據(jù)第一個搜索的結(jié)果查詢,http://1212.ip138.com,建立webrequest請求,抓取Html數(shù)據(jù)

C#服務(wù)器獲取客戶端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                 //讀取網(wǎng)站的數(shù)據(jù)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#服務(wù)器獲取客戶端IP地址以及歸屬地探秘

 

 但是問題出現(xiàn)了,為什么我瀏覽器獲取的數(shù)據(jù)可以得到本機的IP,但是我建立的連接獲取的請求卻是這樣

C#服務(wù)器獲取客戶端IP地址以及歸屬地探秘

C#服務(wù)器獲取客戶端IP地址以及歸屬地探秘

經(jīng)過分析后發(fā)現(xiàn),這個網(wǎng)址試用iframe框架進行處理,無法獲取到frame框架的內(nèi)部信息,然后抓去frame信息發(fā)現(xiàn)其實他真正請求的路徑為 http://1212.ip138.com/ic.asp,該網(wǎng)站的編碼格式為gb2312,再次發(fā)送請求獲取返回數(shù)據(jù):

C#服務(wù)器獲取客戶端IP地址以及歸屬地探秘

雖然大概了解的一些,但是比如用戶用代理服務(wù)器訪問等一系列的問題還是需要我繼續(xù)去探索!

 


向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI