中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

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

發布時間:2020-07-13 12:58:35 來源:網絡 閱讀:809 作者:張立達 欄目:建站服務器

背景:博主本是一位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<Result>(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地址以及歸屬地探秘

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

 


向AI問一下細節

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

AI

封开县| 绥江县| 偃师市| 楚雄市| 汉源县| 德令哈市| 肇源县| 延寿县| 朝阳区| 交城县| 贺兰县| 南城县| 托克逊县| 阿拉尔市| 常熟市| 龙陵县| 嘉峪关市| 淅川县| 古浪县| 沁阳市| 贞丰县| 杂多县| 施甸县| 宁晋县| 翁牛特旗| 浙江省| 肇州县| 鸡东县| 霍林郭勒市| 滦平县| 客服| 洱源县| 郑州市| 张家港市| 通河县| 台北县| 理塘县| 萍乡市| 宁武县| 雅安市| 长白|