我在本机的网卡绑定了2个IP地址,192.168.1.105和192.168.1.204.而http://192.168.1.15:8000/Default.asp是我写的一个测试页面,只输出客户端请求的IP地址。请注意,其中有一行Thread.Sleep(ServicePointManager.MaxServicePointIdleTime);如果没有加入这行,你会得到两行192.168.1.105的结果,在代理那行(return m_OutIPEndPoint;)加入断点会发现只命中了一次。加入这行以后会得到192.168.1.105和192.168.1.204这个期望的结果.
原因就得从ServicePointManager说起,这个类缓存了ServicePoint,代表了到目标的连接。只要这个连接已经存在,出去的IP地址就已经确定了,所以不会再调用BindIPEndPointDelegate来获取出去的IP地址。加入了Thread.Sleep这行代码,只是等待这个连接释放,这样再次访问页面时候就会重新建立连接,从新绑定出去的IP地址了。这样做只是为了验证本文的目的。
当然这个示例程序没有办法真正工作,因为爬虫不可能休眠这么长时间,也不可能把ServicePointManager.MaxServicePointIdleTime设置为很短的时间,虽然实现了目的,但是降低了效率。这个示例程序只是揭示了使用不同IP地址访问目标服务器的可能性和实现途径。
出处:http://www.cnblogs.com/cesium/