libevent安装编译并测试

由于之前在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



你可能感兴趣的:(网络编程学习)