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;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
libevent의 사용 방법 - 서버의 간단한 실례다음은 각 함수와 작업에 대해 설명합니다. 1,main (): 주 함수는 연결을 감청하는 플러그인을 만들고 accept () 의 리셋 함수를 만들어서 이벤트 처리 함수를 통해 모든 연결을 처리합니다. 2、accept...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.