Libcurl较为基本的用法是easyinterface,它是最简单的同步接口,容易理解,实现代码简单,但是性能低下。
curl_multi_perform() + select():可以实现libcurl的异步多路发送,相对于easy interface有了较大的性能提升,但是select()性能不够好,还受到file descriptors不能大于1024的限制。这两种方法的实现可以参考:http://blog.csdn.net/lijinqi1987/article/details/53925835
本文来探讨下curl_multi_socket_action(),该发送方式采用libuv的epoll模型,性能最好,但是比较难以理解,其使用步骤主要是:
1、创建一个multi handle;2、使用CURLMOPT_SOCKETFUNCTION设置socket的回调函数;
3、使用CURLMOPT_TIMERFUNCTION设置超时回调函数,用来指定等待socket激活时的超时时间;
4、使用curl_multi_add_handle()添加easy handle
5、使用一些方法来管理libcurl正在使用的sockets,是你可以检查sockets的行为。可以通过你的代码来实现,或者通过一些第三方库如 libevent or glib来实现。
6、调用curl_multi_socket_action (..., CURL_SOCKET_TIMEOUT, 0, ...) ,获取一个或多个回调函数。
7、等待任意一个libcurl socket的活跃,使用被告知的回调函数的超时值;
8、当检测到activity,为起作用的socket(s)调用curl_multi_socket_action(),如果检测不到activity并且超时时间已到,调用带CURL_SOCKET_TIMEOUT的curl_multi_socket_action
libcurl对大量请求连接提供了管理socket的方法,用户可使用select/poll/epoll事件管理器监控socket事件,可读写时通知libcurl读写数据,libcurl读写完成后再通知用户程序改变监听socket状态,本文借助libuv来实现,两个重要的回调设置: