简述用于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