美文网首页
libcurl 配合epoll 的异步并行server原理

libcurl 配合epoll 的异步并行server原理

作者: 什锦甜 | 来源:发表于2018-10-30 17:35 被阅读151次

libcurl库

有同步和异步两种方式,而在本文中,重点放在异步方式,并使用epoll进行socket事件管理。

Multi interface

在libcurl官方网站上提供了使用epoll进行事件管理的例子。Example

步骤如下:

  1. 创建一个pipe,并用epoll来监听

  2. 初始化;得到multi指针
    g.multi = curl_multi_init();

  3. 设置multi的参数

  curl_multi_setopt(g.multi, CURLMOPT_SOCKETFUNCTION, sock_cb);
  curl_multi_setopt(g.multi, CURLMOPT_SOCKETDATA, &g);
  curl_multi_setopt(g.multi, CURLMOPT_TIMERFUNCTION, multi_timer_cb);
  curl_multi_setopt(g.multi, CURLMOPT_TIMERDATA, &g);

用来设置socket回调和timer回调,sock_cb是socket的回调函数,而multi_timer_cb是timeout之后的回到函数。

  1. 进入while循环,epoll_wait()监听事件

  2. 如果有连接进来,epoll_wait()监听到fifofd,调用fifo_cb()函数,读取url,调用new_conn()函数

  3. 在new_conn()中,初始化easy handle句柄,设置easy句柄的传输选项

curl_easy_setopt(conn->easy, CURLOPT_WRITEFUNCTION, write_cb);

write_cb是在libcurl接收到数据之后调用的回调函数,用来处理接收到的数据。

curl_easy_setopt(conn->easy, CURLOPT_NOPROGRESS, 0L);
curl_easy_setopt(conn->easy, CURLOPT_PROGRESSFUNCTION, prog_cb);
curl_easy_setopt(conn->easy, CURLOPT_PROGRESSDATA, conn);

CURLOPT_PROGRESSFUNCTION指定的函数正常情况下每秒被libcurl调用一次,为了使CURLOPT_PROGRESSFUNCTION被调 用,CURLOPT_NOPROGRESS必须被设置为false,CURLOPT_PROGRESSDATA指定的参数将作为CURLOPT_PROGRESSFUNCTION指定函数的第一个参数。

  1. 使用curl_multi_add_handle()函数加入该easy句柄。这个函数会立刻触发multi中设置的超时回调函数,即multi_timer_cb

  2. multi_timer_cb中调用curl_multi_socket_action(),该函数会执行指定的action,建立连接。

  3. 回调sock_cb()函数,在set_sock()将fd添加到epoll中

  4. epoll_wait()监听到事件,触发event_cb(),action是EPOLLOUT,触发curl_multi_socket_action()处理

  5. 可写,触发easy句柄中的write_cb()回调函数来处理接收到的数据。

// 11. 接收完毕之后,状态变成EPOLLIN,触发event_cb(),调用curl_multi_socket_action()处理

相关文章

  • libcurl 配合epoll 的异步并行server原理

    libcurl库 有同步和异步两种方式,而在本文中,重点放在异步方式,并使用epoll进行socket事件管理。 ...

  • 不可不说的多线程

    关键字:多线程原理,队列(串行并行),任务(同步异步),NSThread,GCD,NSOperation,@syn...

  • 面试常见问题06 - 项目相关

    一. epoll 1. epoll 实现原理 epoll_create:创建一个epoll对象,一般 epollf...

  • 多线程GCD的使用

    一、同步/异步、串行/并行的区别 1.同步/异步 同步/异步是指线程与线程之间的关系。 2.串行/并行 串行、并行...

  • IO - 同步,异步,阻塞,非阻塞和IO模型

    同步,异步,阻塞,非阻塞大话 Select、Poll、Epoll

  • epoll 或者 kqueue 的原理

    epoll 或者 kqueue 的原理是什么?深入理解IO复用之epoll

  • iOS多线程小结

    同步异步串行并行 同步串行:不开启线程 同步并行:不开启线程 异步串行:最多开启一个线程 异步并行:开启线程 同步...

  • 2018-03-12

    python异步与协程 异步编程: 异步I/O selet/poll/epoll 事件循环 + 回调共享状态管理困...

  • GCD基础总结一

    上代码~ 同步串行队列 同步并行队列 异步串行队列 异步并行队列 主队列同步 会卡住 主队列异步

  • 2017-10-19-同步和异步

    同步和异步 1,同步 2,异步 并发和并行都是异步任务实现的俩种方式 3,并发 4,并行 总结:并行是相对于多核C...

网友评论

      本文标题:libcurl 配合epoll 的异步并行server原理

      本文链接:https://www.haomeiwen.com/subject/kxegtqtx.html