您的位置:首页 > 其它

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这个函数是不是有问题,我从官网上貌似也没看到这个函数的解释说明。
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: