简述用于windows客户端的一个异步http模块的实现
1.需要实现的feature
1.1 很容易地发起异步http请求,然后回调。而E,在任何可能影响超时时间的后面都加一个。
for (;;)
{
if (m_UnHandleRequest > 0 && m_RunningRequest < MAX_RUNNING_REQUEST)
{
HandleQueueingRequest();
ModifyTimer();
}
while (::PeekMessage())
{
ProcessMessage();
if (m_QuitFlag)
{
ClearResource();
break;
}
}
if (m_QuitFlag)
{
break;
}
ModifyTimer();
if (!HaveRequestAndIO())
{
GetMessage();
ProcessMessage();
if (m_QuitFlag)
{
ClearResource();
break;
}
}
if (m_QuitFlag)
{
break;
}
ModifyTimer();
IOLoop();
IOComplete();
ModifyTimer();
}
void ProcessMessage()
{
case 退出:m_QuitFlag = 1; break;
case 取消Request:HandleCanceledRequest(); break;
case 添加Request:HandleQueueingRequest();break;
}
void HandleCanceledRequest()
{
在请求队列中,直接remove掉。
在running中,对应的remove操作。
// bad case,在处理请求时,完成的task已经进入调用者线程的task队列
}
void HandleQueueingRequest()
{
将请求队列中的请求放到Running队列中。
调用curl对应接口开始处理对应的请求。
更新m_UnHandleRequest。
}
void ModifyTimer()
{
计算最近超时,如果存在则更新timer。
}
void IOLoop()
{
int m_OldRunningRequest = m_RunningRequest;
while (m_RunningRequest)
{
if (m_UnHandleRequest > 0 && m_RunningRequest < MAX_RUNNING_REQUEST)
{
break;
}
if (PeekMessage())
{
break;
}
if (m_OldRunningRequest != m_RunningRequest)
{
break;
}
curl_multi_timeout();
修改超时时间,如果超时时间超过100毫秒。
如果超时时间是0,需要curl_multi_perform一次。
curl_multi_fdset();
select();
}
}基于curl的异步http实现,布布扣,bubuko.com
原文地址:http://blog.csdn.net/baihacker/article/details/36539795