免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3024 | 回复: 3
打印 上一主题 下一主题

[C] Libevent库用于特定的协议 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-10-29 23:31 |只看该作者 |倒序浏览
各位大侠,小弟现在在做一个类似于echo的server,但是用的是公司制定的协议,对于这样的情况大家是怎么样用Libevent来处理的
  1. void buffered_on_read(struct bufferevent *bev, void *arg)
  2. {
  3.     struct client *this_client = (struct client *) arg;
  4.     struct evbuffer_ptr start;
  5.     int msg_len;
  6.     uint8_t *head;
  7.     uint8_t *message;

  8.     /* Copy as many data as possible */
  9.     struct evbuffer *input = bufferevent_get_input(this_client->buf_ev);

  10.     if (evbuffer_get_length(input) >= 11)
  11.     {
  12.         evbuffer_remove_buffer(input, g_data, BUFFER_LENGTH);

  13.         for ( ; ; ) {
  14.             start = evbuffer_search(g_data, (char *)TAG, 3, NULL);
  15.             if (start.pos == -1) {
  16.                 /* FCFCFC not found! */
  17.                 break;
  18.             }
  19.             else if (start.pos != 0) {
  20.                 /* Garbage message, remove it! */
  21.                 evbuffer_drain(g_data, start.pos);
  22.                 continue;
  23.             }
  24.             else {
  25.                 /* Find right message */
  26.                 if (evbuffer_get_length(g_data) > 11) {
  27.                     head = evbuffer_pullup(g_data, 11);

  28.                     msg_len  = head[10] & 0xFF;
  29.                     msg_len |= (head[9] << 8) & 0xFF00;

  30.                     if (evbuffer_get_length(g_data) >= (msg_len + 11)) {
  31.                         message = evbuffer_pullup(g_data, msg_len + 11);
  32.                         
  33.                         /* Handle message at here */
  34.                         handle_raw_message(this_client, message, msg_len + 11);

  35.                         /* After handle, remove it */
  36.                         evbuffer_drain(g_data, msg_len + 11);
  37.                     }
  38.                     else {
  39.                         /* Message length smaller than (msg_len+11) */
  40.                         break;
  41.                     }
  42.                 }
  43.                 else
  44.                 {
  45.                     /* Message length smaller or equal than 11 */
  46.                     break;
  47.                 }

  48.                 continue;
  49.             }
  50.         }
  51.     }

  52.     /* Add remain message to struct evbuffer input again */
  53.     evbuffer_prepend_buffer(input, g_data);
  54.     return;
  55. }
复制代码

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
2 [报告]
发表于 2013-10-30 11:01 |只看该作者
官方有bufferevent的sample, 不过顺便推荐一下我的库: https://code.csdn.net/qq120848369/ez_poll

论坛徽章:
0
3 [报告]
发表于 2013-10-30 19:51 |只看该作者
回复 2# linux_c_py_php
官方的例子基本上都看过了,我想请教的是大家如何用Libevent来处理一些自定义的协议,比如TLV这种格式的协议。因为服务器用的是Freebsd所以你的库暂时没法用……

   

论坛徽章:
7
摩羯座
日期:2013-12-05 10:42:57辰龙
日期:2013-12-27 13:40:49亥猪
日期:2014-01-15 09:10:37天秤座
日期:2014-01-20 11:22:20辰龙
日期:2014-01-26 17:02:25午马
日期:2014-01-27 14:22:34水瓶座
日期:2014-02-19 09:36:40
4 [报告]
发表于 2013-10-30 20:12 |只看该作者
看DEMO,我就是用libevent开发的,用的自己的协议。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP