libevent简单使用

libevent的安装还是挺简单的,点击打开链接

服务器端

#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <event.h>
#include <string.h>

#define MEM_SIZ (1024)
struct sock_ev {
    struct event* read_ev;
    struct event* write_ev;
    char* buffer;
};

static struct event_base * base;

#define release_sock(sock_ev)  do{  \
	event_del((sock_ev)->read_ev); \
	free((sock_ev)->read_ev);\
	free((sock_ev)->write_ev);\
	free((sock_ev)->buffer);\
	free(sock_ev);\
	}while(0)\


void on_write(int sockfd, short event, void* arg)
{
	struct sock_ev * sock_ev;
	sock_ev = (struct sock_ev *)arg;	
	printf("begin write.\n");
	send(sockfd, sock_ev->buffer, strlen(sock_ev->buffer), 0);
	free(sock_ev->buffer);
	sock_ev->buffer = NULL;
}

void on_read(int sockfd, short event, void* arg)
{
	struct sock_ev * sock_ev;
	ssize_t read_bytes;

	sock_ev = (struct sock_ev *)arg;	
	sock_ev->buffer = (char *)malloc(MEM_SIZ);

	read_bytes = recv(sockfd, sock_ev->buffer, MEM_SIZ, 0);
	(sock_ev->buffer)[read_bytes] = 0;
	if(0 == read_bytes)
	{
		release_sock(sock_ev);
		close(sockfd);
		return ;		
	}

	printf("recv:%s\n", sock_ev->buffer);

	event_set(sock_ev->write_ev, sockfd, EV_WRITE, on_write, sock_ev);
	event_base_set(base, sock_ev->write_ev);
	event_add(sock_ev->write_ev, NULL);
}

void on_accept(int sockfd, short event, void* arg)
{
	struct sockaddr_in cli_addr;
	socklen_t addrlen;
	struct sock_ev * sock_ev;
	int cli_fd;

	cli_fd = accept(sockfd, (struct sockaddr *)&cli_addr, &addrlen);
	sock_ev= (struct sock_ev *)malloc(sizeof(struct sock_ev));
	sock_ev->read_ev = (struct event*)malloc(sizeof(struct event));
	sock_ev->write_ev = (struct event*)malloc(sizeof(struct event)); 	

	event_set(sock_ev->read_ev, cli_fd, EV_READ | EV_PERSIST, on_read, sock_ev);
	event_base_set(base, sock_ev->read_ev);
	event_add(sock_ev->read_ev, NULL);	
}

int main()
{
	int sock;
	int ret;
	int yes = 1;
	struct sockaddr_in my_addr;
	struct event listen_ev;
	sock = socket(AF_INET, SOCK_STREAM, 0);
	setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int));

	my_addr.sin_family = AF_INET;
	my_addr.sin_port = htons(9999);
	my_addr.sin_addr.s_addr =htonl(INADDR_ANY);
	ret = bind(sock, (struct sockaddr *)&my_addr, sizeof(my_addr));

	listen(sock, 5);   

	base = event_base_new();
	event_set(&listen_ev, sock, EV_READ | EV_PERSIST, on_accept, NULL);
	event_base_set(base, &listen_ev);
	event_add(&listen_ev, NULL);
	event_base_dispatch(base);
	return 0;
}


客户端

#include <sys/types.h> 
#include <sys/socket.h> 
#include <netinet/in.h>
#include <arpa/inet.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <strings.h>
#include <string.h>
#include <errno.h>   

int main()
{	
	int sockfd;
	int ret;
	struct sockaddr_in serv_addr;
	char buffer[1024];
	
	sockfd = socket(AF_INET, SOCK_STREAM, 0);   
	serv_addr.sin_family = AF_INET;
	serv_addr.sin_port = htons(9999);
	inet_pton(AF_INET, "127.0.0.1", &(serv_addr.sin_addr));

	ret = connect(sockfd, (struct sockaddr *)&serv_addr,
            sizeof(struct sockaddr_in));
	if(0 == ret)
	{
		printf("connection established.\n");
	}
	else
	{
		printf("connection established failed. \n%d %s\n", ret, strerror(errno));
		return -1;
	}

	while(1)
	{
		printf("Send:");	
		scanf("%s", buffer);
		
		send(sockfd, buffer, strlen(buffer), 0);
		bzero(buffer, 1024);

		ret = recv(sockfd, buffer, 1024, 0);
		if(ret == 0)
		{
			printf("connection failed.\n");
			break;
		}
		printf("Recv:%s\n", buffer);
	}
	return 0;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值