|
我在做一个项目遇到了目标服务器对访问频率做了限制这种问题,一台电脑访问这个网站成功响应次次之后不再响应,五分钟后会再次响应。我测试过访问完一次后换一个网卡再访问,能再次收到响应。
于是我计划,通过连接多个外置网卡,设置多线程,每个线程控制一个网卡访问外网,能增加一个时段内的访问次数。
然后,我自己的解决方案是:
一,通过socket来绑定ip然后访问,这个我只是简单测试了一下,是可以同时访问的。但是如果全部由httpHelper改写为socket我感觉太麻烦了,就没有继续做。
二,在HttpWebRequest里通过BindIPEndPointDelegate这个委托处理,我外接了两个网卡再接到路由,网卡ip 192.168.1.100 192.168.1.101 通过绑定ip能访问外网,但是两个线程,同时只能一个线程访问,而且访问一次的时间较长。
问题具体说明:
1.同时只能一个线程访问,给我的感觉是实际这个委托并没有绑定到对应的网卡,只是设置了一个ip给请求。因为我把代码里的ip直接改为非网卡本身的ip依然可以访问,比如 192.168.1.105。
我有看到一些资料说,如果windows下有两个网卡都能连接外网,实际只有一个网卡做发送和接收,另一个网卡只接收数据。
http://www.cnblogs.com/cesium/archive/2010/08/14/1799706.html
上面这个帖子应该是一个网卡多个ip的,也设置了一个Thread.Sleep(ServicePointManager.MaxServicePointIdleTime);还是在一个线程下的,所以我估计是windows系统是由一个ServicePointManager统一控制设备信息。
我也查了一些资料,比如说通过修改路由表能解决这类问题。
2.
//设置对外访问所使用网卡的IP
//string sendingIp = "192.168.0.1";
//设置对外访问所使用的端口
//int sendingPort = 80;
Uri uri = new Uri(item.URL);
//HttpWebRequest wr = (HttpWebRequest)WebRequest.Create(uri);
//获取对外访问的包,并指定使用那个IP(网卡)与端口来发送数据包
ServicePoint sp = ServicePointManager.FindServicePoint(uri);
sp.BindIPEndPointDelegate = (servicePoint, remoteEp, retryCount) =>
{
return new IPEndPoint(IPAddress.Parse(sendingIp ), sendingPort );
};
//提交请求并获取返回结果
//var data = new StreamReader(wr.GetResponse().GetResponseStream()).ReadToEnd();
通过这样的方式尝试能双线程访问,但 “System.Net.Sockets.SocketException”类型的第一次机会异常在 System.dll 中发生,多线程访问一段时间也内部挂掉了,原因不明。
3.不熟悉监听,虽然有时看着程序在运行,但无法证实是在对应的网卡上请求和响应。最好有专门的程序能测试一下。
由于了解c#和网络通讯的时间较短,对这类比较深入的问题很难定性分析解决。
如果有关于目标服务器对访问频率做了限制的成熟解决方案,请不吝赐教,万分感激。
不到万不得已的情况下,不想用多个电脑处理,或者虚拟机,分布式处理的方法。
此问题我会持续解决,请各位朋友多提建议,谢谢。
socket貌似是可以的,至少测试多线程一个请求时都能收到响应,且未报异常,只是我不知道怎么监听确认每个线程是从不同网卡请求响应的。真心不想把httpHelper全部改成socket,太折腾。
BindIPEndPointDelegate网上有一些帖子,但我这里没有实际解决问题。
有没有懂系统操作网卡原理的朋友?
|
|