libevent应用中对socket的理解是否存在问题

ihyy 2012-12-14 04:53:06
实现需求:
多个终端连接到服务器,每个终端的连接状态(终端采集数据的其实时间点,状态值要更新)、采集数据(实时数据)、对实时数据进行一个算法(AR)分析并将上述三项值都存储下来。

linux下通过libevent buf机制实现。

在创建event buf后,
memset(&sin, 0, sizeof(sin));
sin.sin_family=AF_INET;
sin.sin_port=htons(PORT);
listener=evconnlistener_new_bind(base, listener_cb, (void*)base, LEV_OPT_REUSEABLE|LEV_OPT_CLOSE_ON_FREE, -1, (struct sockaddr*)&sin, sizeof(sin));

我在listener_cb函数中,初始化每一个终端的连接状态和算法初始状态。
struct event_with_state* lo_eventWithState=(struct event_with_state*)malloc(sizeof(struct event_with_state));

eventstateinit(lo_eventWithState);

bufferevent_setcb(bev, conn_readcb, conn_writecb, conn_eventcb, lo_eventWithState);
printf("listener_cb 3. event_setcb OK.\n");

我在conn_readcb记录socket的fd值,在conn_eventcb中更新fd值,并写下来。

结果在实现代码后,当终端断开不在发送数据的时候,数据值停止写入,但是socket的fd仍然没有更新。进入conn_eventcb时我就会有一条打印。但查看打印信息,没见到conn_eventcb被回调的迹象。

这是为什么呢?

我思考了一下,我对event中socket的理解如下:
1)listen建立后,程序监听状态,我的其它代码不被执行,程序相当于被挂起。
2)当eventbuf中有数据后,回调一次listener_cb。即每一个新终端连接建立时,我在listener_cb初始化这个终端的fd和算法缓冲区初值。这样不需要使用全局变量。且一个终端对应一个状态空间,断开设备时,conn_eventcb记录后,将初始化这个空间。
问题是:我对socket监听时候和启动回调的理解是否正确?为什么conn_eventcb不能进入?
...全文
203 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
ihyy 2012-12-17
  • 打赏
  • 举报
回复
请指点,谢谢
ihyy 2012-12-15
  • 打赏
  • 举报
回复
自己顶一个,希望有达人能帮助帮助新人。谢谢

23,125

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧