之前在论坛看到有人问过这样的问题 然后就帮着百度了一下 差不多得到了下面的代码
private IPEndPoint BindIPEndPoint(ServicePoint servicePoint, IPEndPoint remoteEndPoint, int retryCount) { return remoteEndPoint;//得到IP } HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://st233.com"); //绑定事件 request.ServicePoint.BindIPEndPointDelegate = BindIPEndPoint;
可是楼主说这样第一次访问是可以的 之后貌似取的就是缓存 就获取不到了 我也没有在意 毕竟这不是我的需求 可是今天自己有这样的需求了 然后我也忘记了以前回答过这样的问题 就去百度 然后居然看到了自己的回帖 也就是上面的代码 一脸懵逼 然后才想起原来自己以前百度过了 既然楼主都说有问题 而且同样的代码 百度到其他人也同样出现过这个问题 就没考虑这个解决方案了 虽然我可以通过HttpWebRequest去得到我想要的页面再通过Dns类去获取域名的IP 但是想想何必呢 HttpWebRequest坑定访问页面前也要获取Dns干嘛还要自己再去获取一次
然后琢磨着怎么入手 发现request.ServicePoint这个东西里面应该有我想要的东西 可是下面的属性中只找到一个看起来像是IP的属性就是[Address]可是他的类型并不是[IPAddress]里面是一些这样的数据
明显里面并没有自己想要的东西 于是乎干脆看看直接打印ServicePoint里面有什么东西
看到里面有这个东西 我猜是有八九就是我要的东西了 可是我不知道要怎么才能得到这个值 用反编译工具查看了一下这个类 里面并没有什么属性或者方法可以返回出m_IPAddressInfoList这个字段的字 既然没有现成的那么就自己动手反射咯
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://st233.com"); HttpWebResponse response = (HttpWebResponse)request.GetResponse(); IPAddress[] ips = request.ServicePoint.GetType() .GetField("m_IPAddressInfoList", BindingFlags.NonPublic | BindingFlags.Instance) .GetValue(request.ServicePoint) as IPAddress[]; foreach (var v in ips) Console.WriteLine(v.ToString());
搞定了 当然这里面可能有一个问题 比如访问baidu.com其实页面最后跳转到了www.baidu.com而得到的IP则可能不是你想要的baidu.com的IP 所以你想要靠谱一点那么就设置HttpWebRequest不要自动重定向 你自己去处理重定向来获取每一步的IP 而且现在那么网站有CDN得到的IP也不是真实的IP比如我的博客。。。