libevent 多线程发送数据 bufferevent_write

使用 libevent 

主线程:

	struct event_base*base = event_base_new();

	event_base_dispatch(base);

发送数据线程:

unsigned _stdcall ThreadProc(void* param)
{
	struct bufferevent * bev = (struct bufferevent *)param;

	int iFrameNo = 1;

    char szMsg[512];
    memset( szMsg, 0, sizeof(szMsg) );

	while (1)
	{
		printf("send packet : %d\n", iFrameNo++);

		err = bufferevent_write(bev, szMsg, sizeof(szMsg));
		size_t curlen = evbuffer_get_length(bev->output);

		Sleep(5000);
	}

	return 0;
}

 

这种方式 发送不了 数据。 我的程序 base 放入一个 timeout, 也是以timeout 的 频率 进行。

	struct timeval tv;
	struct event evtPeriod;
	/* Initalize one event */
	event_assign(&evtPeriod, base, -1, EV_PERSIST, time_cb, (void*)bev);

	tv.tv_sec = 5;
	tv.tv_usec = 100*1000;
	evtimer_add(&evtPeriod, &tv);

解决方法:

主线程 需要唤醒。 参见: https://bbs.csdn.net/topics/390523738

timeout 其实进行了 唤醒。

 

需要增加:

#ifdef WIN32
	evthread_use_windows_threads();
#else
	evthread_use_pthreads();
#endif
	evthread_make_base_notifiable(base);
	struct bufferevent*bev = bufferevent_socket_new(base, -1,
		BEV_OPT_CLOSE_ON_FREE | BEV_OPT_THREADSAFE );

增加 BEV_OPT_THREADSAFE 可能会更 可靠。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
libeventbufferevent 可以用于收发数据,具体步骤如下: 1. 创建 bufferevent 对象: ``` struct bufferevent *bev; bev = bufferevent_socket_new(base, fd, BEV_OPT_CLOSE_ON_FREE); ``` 其中,base 是 event_base 对象,fd 是已连接的 socket 文件描述符,BEV_OPT_CLOSE_ON_FREE 表示在释放 bufferevent 对象时关闭底层的 socket 连接。 2. 设置回调函数: ``` void bev_read_cb(struct bufferevent *bev, void *ctx) { // 处理读事件 } void bev_write_cb(struct bufferevent *bev, void *ctx) { // 处理写事件 } void bev_event_cb(struct bufferevent *bev, short events, void *ctx) { // 处理事件 } bufferevent_setcb(bev, bev_read_cb, bev_write_cb, bev_event_cb, NULL); ``` bufferevent_setcb 函数用于设置 bufferevent 对象的回调函数,包括读、写、事件回调函数。 3. 启用 bufferevent: ``` bufferevent_enable(bev, EV_READ|EV_WRITE); ``` bufferevent_enable 函数用于启用 bufferevent 对象的读写事件。 4. 发送数据: ``` const char *data = "hello, world"; bufferevent_write(bev, data, strlen(data)); ``` bufferevent_write 函数用于向 bufferevent 对象写入数据。 5. 接收数据: ``` void bev_read_cb(struct bufferevent *bev, void *ctx) { char buf[1024]; size_t len = bufferevent_read(bev, buf, sizeof(buf)); // 处理接收到的数据 } ``` bev_read_cb 回调函数中,使用 bufferevent_read 函数从 bufferevent 对象中读取数据。 以上就是 libeventbufferevent 收发数据的基本步骤。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值