libevent创建服务器程序

libevent安装方法

$ apt-get install git
$ git clone https://github.com/libevent/libevent.git
$ cd libevent
$ apt-get install cmake
$ apt-get install libssl-dev
$ mkdir build && cd build
$ cmake .. # Default to Unix Makefiles.
$ make
$ make verify # (optional)
$ make install
---------------------

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <errno.h>
#include <event2/event.h>
#include <event2/bufferevent.h>
#define LISTEN_PORT 9090
#define LISTEN_BACKLOG 32

void do_accept(evutil_socket_t listener, short event, void *arg);
void read_cb(struct bufferevent * bev, void *arg);
void write_cb(struct bufferevent * bev, void *arg);
void error_cb(struct bufferevent * bev, short event, void *arg);

int main(int argc, char * argv[])
{
	int ret;
	evutil_socket_t listener;
	listener = socket(AF_INET, SOCK_STREAM, 0);
	assert(listener > 0);

	//set port reuseable
	evutil_make_listen_socket_reuseable(listener);

	//create socket
	struct sockaddr_in sin;
	sin.sin_family = AF_INET;
	sin.sin_addr.s_addr = htonl(INADDR_ANY);
	sin.sin_port = htons(LISTEN_PORT);

	if(bind(listener, (struct sockaddr *)&sin, sizeof(sin))<0)
	{
		printf ("bind error!\n");
		return 1;
	}
	printf("bind ok...\n");

	if(listen(listener, LISTEN_BACKLOG)<0)
	{
		printf("listen error...\n");
		return 1;
	}
	printf ("listening ...\n");

	evutil_make_socket_nonblocking(listener);

	struct event_base *base = event_base_new();

	struct event * listen_event;
	listen_event = event_new(base, listener, EV_READ|EV_WRITE|EV_PERSIST, do_accept, (void *)base);

	//action event
	event_add(listen_event, NULL);

	//recycle listening
	event_base_dispatch(base);
	printf("The End...");
	return 0;
}

void do_accept(evutil_socket_t listener, short event, void *arg)
{
	struct event_base *base = (struct event_base *)arg;
	evutil_socket_t fd;
	struct sockaddr_in sin;
	socklen_t slen;
	fd = accept(listener, (struct sockaddr *)&sin, &slen);
	if(fd < 0)
	{
		printf("accept error...\n");
		return ;
	}

	if(fd > FD_SETSIZE)
	{
		printf("fd > FD_SETSIZE");
		return ;
	}

	printf ("Accept: fd = %d\n", fd);

	struct bufferevent *bev = bufferevent_socket_new(base, fd, BEV_OPT_CLOSE_ON_FREE);
	bufferevent_setcb(bev, read_cb, NULL, error_cb, arg);
	bufferevent_enable(bev, EV_READ|EV_WRITE|EV_PERSIST);
}

void read_cb(struct bufferevent *bev, void *arg)
{
	#define MAX_LINE  256
	char line[MAX_LINE+1];
	int n;
	evutil_socket_t fd = bufferevent_getfd(bev);

	while(n = bufferevent_read(bev, line, MAX_LINE), n>0)
	{
		line[n] = '\0';
		printf("fd = %d, read line:%s\n", fd, line);
		bufferevent_write(bev, line, n);
	}
}

void write_cb(struct bufferevent * bev, void *arg)
{
	printf ("send ok...\n");
}

void error_cb(struct bufferevent *bev, short event, void *arg)
{
	evutil_socket_t fd = bufferevent_getfd(bev);
	printf("fd = %d, ", fd);
	if(event & BEV_EVENT_TIMEOUT)
	{
		printf("Timed out\n");
	}
	else if(event & BEV_EVENT_EOF)
	{
		printf("connection closed\n");
	}
	else if(event & BEV_EVENT_ERROR)
	{
		printf("some other error!\n");
	}
	bufferevent_free(bev);
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

feng_blog6688

只需一个赞,谢谢你的鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值