IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> libevent之evhttp异步线程发送消息 -> 正文阅读

[C++知识库]libevent之evhttp异步线程发送消息

libevet异步发送消息的原理

说明

代码未验证,只设计其逻辑, 工作中是成功的,不能给出.

  • 类似场景: 单线程的网络库 csharp的UI异步线程 Andorid的UI异步通知
  • 凡是单线程业务通知,都有其自定义通知的过程, 然后在自定义通知逻辑中实现遍历具体的单线程任务中模块(IO, UI布局等), 得到后进行操作.

逻辑

通过参考libevent源码,采用socketpair

static evutil_socket_t pair[2]; //[0]发送 [1]接收
struct evhttp* http = NULL;
struct event* evpair = NULL; //单独的io socket
//http的构建过程忽略
if (evutil_socketpair(AF_UNIX, SOCK_STREAM, 0, pair) == -1)
		return (1);
evutil_make_socket_nonblocking(pair[0]);
evutil_make_socket_nonblocking(pair[1]);

evpair = event_new(base, pair[1], EV_READ | EV_PERSIST, _pair_callbk, http);
if (event_add(evpair, NULL))
	goto err;
static void _pair_callbk(evutil_socket_t fd, short event, void* arg)
{
   char buf[256] = { 0 };
   int len;
   struct evhttp* http = (struct evhttp*)arg;
   len = recv(fd, buf, sizeof(buf), 0);
   //异步发送消息
	TAILQ_FOREACH(evcon, &http->connections, next)
	{
		TAILQ_FOREACH(req, &evcon->requests, next)
		{
			//在这里进行异步
			evhttp_send_reply(req, 200, "OK", buff);
		}
	}
}
进行c++11多线程处理回复
std::vector<std::function<void(struct evhttp_request*)>> funcs;

std::thread td([]{
 sleep(8); //8秒的耗时操作
 //这里需要给指定的req发送消息
 std::string msg="hello";
 std::function<void(struct evhttp_request*)> response=[msg](struct evhttp_request* req){
    struct evbuffer *buff=evbuffer_new();
    evbuffer_add(evb, msg.c_str(), msg.size());
 	evhttp_send_reply(req, 200, "OK", buff);
 	evbuffer_free(buff);
 	//从funcs中删除自己, 可以自己封装类来处理,有点像csharp的ui异步线程通知类
 };
 funcs.push_back(response);
 send(pair[0], "n", 1, 0); //让event进入_pair_callbk   
});
//修改上面的evhttp_send_reply 
for(auto &fun:funcs){
  fun(req);
}
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-04-22 18:17:37  更:2022-04-22 18:19:07 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 23:41:31-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码