110,535
社区成员
发帖
与我相关
我的任务
分享
private int numValidationThreadsRunning = 0;
// 这个是启动所有的验证任务
private void Validate()
{
foreach (ProxyItem proxy in Instance._proxyList)
proxy.validated = false;
int count = ConfigServer.NumValidationThreads;
if (count > Instance._proxyList.Count) count = Instance._proxyList.Count;
numValidationThreadsRunning = count;
for (int i = 0; i < count; i++)
{
ProxyItem proxy = Instance._proxyList[i];
BeginValidation(proxy);
}
}
// 这个是启动验证任务中的其中一项,ProxyItem是存放代理服务器信息的一个结构
private void BeginValidation(ProxyItem proxy)
{
proxy.validated = true;
proxy.timeLastValidation = DateTime.Now;
HttpWebRequest request = HttpWebRequest.Create(ConfigServer.ValidationAddress) as HttpWebRequest;
request.KeepAlive = true;
request.ContentType = "application/x-www-form-urlencoded";
request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
request.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.2; zh-CN; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8";
request.Proxy = new WebProxy(proxy.ip + ":" + proxy.port);
RequestState state = new RequestState(request, proxy);
// 请求的异步返回
IAsyncResult result = request.BeginGetResponse(new AsyncCallback(OnRequestReturn), state);
// 超时的处理
ThreadPool.RegisterWaitForSingleObject(result.AsyncWaitHandle,
new WaitOrTimerCallback(OnTimeout),
state,
ConfigServer.ValicationTimeout * 1000,
true
);
}
// 一个验证任务完成后,去尝试其他的任务
private void ValidateMore()
{
foreach (ProxyItem proxy in Instance._proxyList)
{
if (!proxy.validated)
{
BeginValidation(proxy);
return;
}
}
numValidationThreadsRunning--;
if (numValidationThreadsRunning == 0)
{
ListChange();
LogServer.AppendLine("验证完成");
IOServer.SaveProxyList();
}
}
// 请求返回的处理
private void OnRequestReturn(IAsyncResult result)
{
RequestState state = result.AsyncState as RequestState;
HttpWebRequest request = state.request;
ProxyItem proxy = state.proxy;
HttpWebResponse response;
try
{
// 不知道为什么有时候这里会异常?
response = (HttpWebResponse)request.EndGetResponse(result);
}
catch
{
proxy.lastState = "连接错误";
proxy.validationCount++;
proxy.failAfterLastSuccessCount++;
LogServer.AppendLine(proxy.ip+":"+proxy.port+"返回并异常");
ValidateMore();
return;
}
// 验证结果
Stream stream = response.GetResponseStream();
string html = Instance.StreamToString(stream, response.CharacterSet);
Regex re = new Regex(ConfigServer.ValidationString);
MatchCollection matches = re.Matches(html);
if (matches.Count > 0)
{
proxy.lastState = "验证成功";
proxy.validationCount++;
proxy.successCount++;
proxy.failAfterLastSuccessCount = 0;
TimeSpan span = DateTime.Now - state.start;
proxy.delay = (int)span.TotalMilliseconds;
}
else
{
proxy.lastState = "不匹配";
proxy.validationCount++;
proxy.failAfterLastSuccessCount++;
}
LogServer.AppendLine(proxy.ip + ":" + proxy.port + "正常返回");
ValidateMore();
}
// 请求超时的处理
private void OnTimeout(object state, bool timeout)
{
if (timeout)
{
RequestState reqState = (RequestState)state;
if (reqState != null)
reqState.request.Abort();
ProxyItem proxy = reqState.proxy;
proxy.lastState = "超时";
proxy.validationCount++;
proxy.failAfterLastSuccessCount++;
LogServer.AppendLine(proxy.ip + ":" + proxy.port + "超时");
ValidateMore();
}
}