加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 从libevent移植到boost :: asio:什么是ASIO中libevent事件

发布时间:2020-12-16 09:52:09 所属栏目:百科 来源:网络整理
导读:我正在尝试向基于libevent的库反向移植以使用ASIO后端(从而在单个应用程序中避免多个事件循环).还有其他方法可以解决“问题”,但我对此感兴趣 在Boost :: ASIO文档中,我没有看到事件对象的直接等价物(或者更确切地说,是一个句柄 – 因为libevent是用简单的C
我正在尝试向基于libevent的库反向移植以使用ASIO后端(从而在单个应用程序中避免多个事件循环).还有其他方法可以解决“问题”,但我对此感兴趣

在Boost :: ASIO文档中,我没有看到事件对象的直接等价物(或者更确切地说,是一个句柄 – 因为libevent是用简单的C编写的); boost :: asio :: strand看起来很熟悉,但它似乎没有遵循libevent的模式:创建,期望,接收,做工作{,重复}.

我需要的是拥有一组对象/事件/事件回调,除非在io_service的循环之上运行回调(通过套接字事件),否则可以创建和忘记回调. Boost中有类似的东西吗?

解决方法

Boost.Asio没有提供与libevent的 events等效的东西.

在Boost.Asio中,创建一个I / O对象,例如socket(1).然后,程序将启动一个操作,例如socket.async_receive(buffer,&handler)(2),表示它希望将数据从套接字读入缓冲区,并在读取数据后调用处理程序.此步骤类似于在libevent中创建非持久性挂起事件,但一个关键区别是Boost.Asio的Proactor将代表用户将数据从套接字读取到缓冲区,而不是通知用户数据可用读.最后,Boost.Asio会将请求转发给操作系统(3).

然后,操作系统将以与libevent事件变为活动时类似的方式通知io_service数据可用于读取(4).在某些时候,应用程序将通过io_service::run()(5)处理事件循环,就像使用libevent的event_base_loop()一样.由于可以读取数据,Boost.Asio会将数据从套接字读入缓冲区,然后将用户的回调(处理程序)发布到准备调用的回调队列中(6).然后,应用程序将在处理事件循环时调用回调.

Boost.Asio强烈关注I / O对象而不是操作:

>每次应用程序有兴趣处理I / O对象上的事件时,都必须启动操作.在这方面,整体流程类似于仅使用非持久性事件的libevent程序.
>操作无法识别. Boost.Asio不提供libevent为操作提供的相同级别的控制.例如,如果应用程序在套接字上具有挂起的读取事件和挂起的写入事件,则libevent允许通过event_free()删除写入事件,而不会影响读取事件.另一方面,由于在Boost.Asio中无法识别操作,因此只能取消所有未决操作,例如通过socket.cancel(),而不是取消特定操作,例如写入但不能读取.

源图像和一般细节可以位于here.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读