libevent 클라이언트 및 서버

5902 단어 libevent
서버 측:
#include<stdio.h>
#include<string.h>
#include<errno.h>
#include<unistd.h>
#include<event.h>
#include<event2/bufferevent.h>
#include<event2/listener.h>
#include<event2/thread.h>

void socket_read_cb(bufferevent* bev,void* arg)
{
	char msg[4096];

	int len=bufferevent_read(bev,msg,sizeof(msg)-1);
	msg[len]='\0';
	printf("recv the client msg:%s",msg);
	char reply_msg[4096]="I have recvieced the msg:";
	strcat(reply_msg+strlen(reply_msg),msg);
	bufferevent_write(bev,reply_msg,strlen(reply_msg));
}

void socket_event_cb(struct bufferevent* bev,short event,void* arg)
{
	if(event&BEV_EVENT_EOF)
	{
		printf("connection closed
"); } else if(event&BEV_EVENT_ERROR) { printf("some other error
"); } bufferevent_free(bev); } /*void accept_cb(int fd,short events,void* arg) { evutil_socket_t sockfd; struct sockaddr_in client; socklen_t len=sizeof(client); sockfd=accept(fd,(struct sockaddr*)&client,&len); evutil_make_socket_nonblocking(sockfd); printf("accept a client %d
",sockfd); struct event_base* base=(event_base*)arg; //struct event* ev=event_new(NULL,-1,0,NULL,NULL); //event_assign(ev,base,sockfd,EV_READ|EV_PERSIST,socket_read_cb,(void*)ev); //event_add(ev,NULL); bufferevent* bev=bufferevent_socket_new(base,sockfd,BEV_OPT_CLOSE_ON_FREE); bufferevent_setcb(bev,socket_read_cb,NULL,event_cb,arg); bufferevent_enable(bev,EV_READ|EV_PERSIST); } int tcp_server_init(int port,int listen_num) { int errno_save; evutil_socket_t listener; listener=socket(AF_INET,SOCK_STREAM,0); if(listener==-1) { return -1; } evutil_make_listen_socket_reuseable(listener); struct sockaddr_in sin; sin.sin_family=AF_INET; sin.sin_addr.s_addr=0; sin.sin_port=htons(port); if(bind(listener,(struct sockaddr*)&sin,sizeof(sin))<0) { goto error; } if(listen(listener,listen_num)<0) { goto error; } evutil_make_socket_nonblocking(listener); return listener; error: errno_save=errno; evutil_closesocket(listener); errno=errno_save; return -1; }*/ void listener_cb(evconnlistener* listener,evutil_socket_t fd,struct sockaddr* sock,int socklen,void* arg) { printf("accept a client %d
",fd); event_base* base=(event_base*)arg; bufferevent* bev=bufferevent_socket_new(base,fd,BEV_OPT_CLOSE_ON_FREE); bufferevent_setcb(bev,socket_read_cb,NULL,socket_event_cb,NULL); bufferevent_enable(bev,EV_READ|EV_PERSIST); } int main(int argc,char* argv[]) { struct sockaddr_in sin; memset(&sin,0,sizeof(sin)); sin.sin_family=AF_INET; sin.sin_addr.s_addr=0; sin.sin_port=htons(8888); struct event_base* base=event_base_new(); evconnlistener* listener=evconnlistener_new_bind(base,listener_cb,base,LEV_OPT_REUSEABLE|LEV_OPT_CLOSE_ON_FREE,10,(struct sockaddr*)&sin,sizeof(sin)); event_base_dispatch(base); evconnlistener_free(listener); event_base_free(base); return 0; }

클라이언트:
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<errno.h>
#include<unistd.h>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<event.h>
#include<event2/bufferevent.h>
#include<event2/buffer.h>
#include<event2/util.h>
void cmd_msg_cb(int fd,short events,void* arg)
{
	char msg[1024];
	int ret=read(fd,msg,sizeof(msg));
	if(ret<=0)
	{
		perror("read fail");
		exit(1);
	}
	struct bufferevent* bev=(struct bufferevent*)arg;
	bufferevent_write(bev,msg,ret);
}
void server_msg_cb(struct bufferevent*  bev,void* arg)
{
	char msg[1024];
	int len=bufferevent_read(bev,msg,sizeof(msg));
	msg[len]='\0';
	printf("recv %s from server
",msg); } void event_cb(struct bufferevent* bev,short event,void* arg) { if(event&BEV_EVENT_EOF) { printf("000connection closed
"); } else if(event& BEV_EVENT_ERROR) { printf("some other error
"); } else if(event&BEV_EVENT_CONNECTED) { printf("the client has connected to server
"); return; } bufferevent_free(bev); struct event* ev=(struct event*)arg; event_free(ev); } /*int tcp_connect_server(const char* server_ip,int port) { int sockfd,status,save_errno; struct sockaddr_in server_addr; memset(&server_addr,0,sizeof(server_addr)); server_addr.sin_family=AF_INET; server_addr.sin_port=htons(port); status=inet_aton(server_ip,&server_addr.sin_addr); if(status==0) { errno=EINVAL; return -1; } sockfd=socket(AF_INET,SOCK_STREAM,0); if(sockfd==-1) { return -1; } status=connect(sockfd,(struct sockaddr*)&server_addr,sizeof(server_addr)); if(status==-1) { save_errno=errno; close(sockfd); errno=save_errno; return -1; } evutil_make_socket_nonblocking(sockfd); return sockfd; }*/ int main(int argc,char* argv[]) { if(argc<3) { printf("please input 2 parameters
"); return -1; } struct event_base* base=event_base_new(); //struct event* ev_sockfd=event_new(base,sockfd,EV_READ|EV_PERSIST,socket_read_cb,NULL); //event_add(ev_sockfd,NULL); struct bufferevent* bev=bufferevent_socket_new(base,-1,BEV_OPT_CLOSE_ON_FREE); struct event* ev_cmd=event_new(base,STDIN_FILENO,EV_READ|EV_PERSIST,cmd_msg_cb,(void*)bev); event_add(ev_cmd,NULL); struct sockaddr_in server_addr; memset(&server_addr,0,sizeof(server_addr)); server_addr.sin_family=AF_INET; server_addr.sin_port=htons(atoi(argv[2])); inet_aton(argv[1],&server_addr.sin_addr); bufferevent_socket_connect(bev,(struct sockaddr*)&server_addr,sizeof(server_addr)); bufferevent_setcb(bev,server_msg_cb,NULL,event_cb,(void*)ev_cmd); bufferevent_enable(bev,EV_READ|EV_PERSIST); event_base_dispatch(base); printf("finished
"); return 0; }

좋은 웹페이지 즐겨찾기