libevent安装编译并测试
2015-10-08 16:14
204 查看
由于之前在windows平台下接触过一个网络数据过滤的程序,当时也是第一次写关于网络方面的程序(之前写的小程序不算),明显的经验不足。很多知识都不够用,最后导致这个程序没有完成。但是过程中学到了不少的东西,多线程,队列,锁机制,缓冲区管理等等。还有各种网络模型,包括典型的轮询方式,多路复用select以及windows下的IOCP等。
这段时间在看关于linux下面的编程,算是为找工作做准备吧,故开始学习libevent(前期linux基础还是看了一段时间)。
libevent的整个安装比较简单,从官网下载最新版的程序,解压到本地。
./configure -prefix=/usr
make
make install
基本上上面三步就可以了,可能会有些问题。譬如我开始的时候,configure这个文件不是可以执行的,需要修改一下属性。最后一步需要root权限,用sudo或是su就可以了。
安装完成后,在安装包里有一些简单的例子供大家参考,觉得应该接合例子看官网的帮助。
我在用官网上那个rot13服务器的例子时候就出现了一些问题,客户端连接没有问题,但是接受数据的时候有问题。每次都是无法接受到数据。下面上官网的接受数据例子,我用gdb调试了很多次,发现while循环条件总是不对,每次都读不出数据。但是查看input的大小,发现确实有数据。这里不知道evbuffer_readln这个函数是不是有问题,我从官网上貌似也没看到这个函数的解释说明。
所以我将上面的函数做了一下简单的修改,使这个程序可以正常运行。具体如下:
最后提醒一下,编译这个程序的时候需要加上链接库-levent
这段时间在看关于linux下面的编程,算是为找工作做准备吧,故开始学习libevent(前期linux基础还是看了一段时间)。
libevent的整个安装比较简单,从官网下载最新版的程序,解压到本地。
./configure -prefix=/usr
make
make install
基本上上面三步就可以了,可能会有些问题。譬如我开始的时候,configure这个文件不是可以执行的,需要修改一下属性。最后一步需要root权限,用sudo或是su就可以了。
安装完成后,在安装包里有一些简单的例子供大家参考,觉得应该接合例子看官网的帮助。
我在用官网上那个rot13服务器的例子时候就出现了一些问题,客户端连接没有问题,但是接受数据的时候有问题。每次都是无法接受到数据。下面上官网的接受数据例子,我用gdb调试了很多次,发现while循环条件总是不对,每次都读不出数据。但是查看input的大小,发现确实有数据。这里不知道evbuffer_readln这个函数是不是有问题,我从官网上貌似也没看到这个函数的解释说明。
void readcb(struct bufferevent *bev, void *ctx) { struct evbuffer *input, *output; char *line; size_t n; int i; input = bufferevent_get_input(bev); output = bufferevent_get_output(bev); while ((line = evbuffer_readln(input, &n, EVBUFFER_EOL_LF))) { for (i = 0; i < n; ++i) line[i] = rot13_char(line[i]); evbuffer_add(output, line, n); evbuffer_add(output, "\n", 1); free(line); } if (evbuffer_get_length(input) >= MAX_LINE) { /* Too long; just process what there is and go on so that the buffer * doesn't grow infinitely long. */ char buf[1024]; while (evbuffer_get_length(input)) { int n = evbuffer_remove(input, buf, sizeof(buf)); for (i = 0; i < n; ++i) buf[i] = rot13_char(buf[i]); evbuffer_add(output, buf, n); } evbuffer_add(output, "\n", 1); } }
所以我将上面的函数做了一下简单的修改,使这个程序可以正常运行。具体如下:
void readcb(struct bufferevent *bev, void *ctx) { struct evbuffer *input, *output; size_t n; int i; input = bufferevent_get_input(bev); output = bufferevent_get_output(bev); n = evbuffer_get_length(input); char line[1024]; n = evbuffer_remove(input, line, sizeof(line)); while (n > 0) { for (i = 0; i < n; ++i) line[i] = rot13_char(line[i]); evbuffer_add(output, line, n); evbuffer_add(output, "\n", 1); n = evbuffer_remove(input, line, sizeof(line)); } }
最后提醒一下,编译这个程序的时候需要加上链接库-levent
相关文章推荐
- Thinkphp中的CURD总结
- 软件工程习题2
- iOS常用开发工具
- Java日志性能那些事(转)
- 前端开发中两种常见的图片加载方式
- LeetCode OJ:Integer to Roman(转换整数到罗马字符)
- 基于Unity3D引擎的Android游戏优化
- C++Primer第五版 练习11.17(解答)
- Android Studio添加使用Assets
- 定义一个Pet类,定义Cat,Dog,为子类继承Pet类。
- 面向对象程序设计具有4个共同特征:抽象性、封装性、继承性和多态性
- 淘宝消息中间件(转载)
- [LeetCode]Two Sum
- datepicker插件实现开始日期(minDate)和结束日期(maxDate)
- PowerDesigner通过ODBC来实现Mysql数据库的连接操作
- 数组中重复的数字(没理解)
- 检测crashlytics是否成功安装并能触发
- ReactJs 组件间数据传递
- LeetCode:Game of Life
- CentOS 6.3下源码安装LAMP(Linux+Apache+Mysql+Php)环境