#define _GNU_SOURCE 1 #include <unistd.h> #include <stdio.h> #include <string.h> #include <sys/types.h> #include <stdlib.h> #include <netdb.h> #include <pthread.h> #include <fcntl.h> #include <errno.h> #include <sys/socket.h> #include <poll.h> #include <sys/epoll.h> #define DEF_STD_ERROR (-1) #define DEF_BIND_PORT (10240) #ifndef TRUE typedef int BOOL; #define TRUE 1 #define FALSE 0 #endif int main(int argc,char *argv[]) { int ret; int sock; struct sockaddr_in addr; char buf[1024]; int len; int epoll_id; struct epoll_event event; struct epoll_event ret_events[100]; int i; int client; int count=0; //create socket sock = socket(AF_INET,SOCK_STREAM,0); if(sock == DEF_STD_ERROR) { printf("%d %s",ret,strerror(errno)); return -1; } //init address addr.sin_family = AF_INET; addr.sin_port = htons(DEF_BIND_PORT); addr.sin_addr.s_addr = inet_addr("192.168.1.168"); //bind ret = bind(sock,(struct sockaddr*)&addr,sizeof(addr)); if(ret == DEF_STD_ERROR) { printf("%s",strerror(errno)); close(sock); return -1; } //listen ret = listen(sock,5); if(ret == DEF_STD_ERROR) { printf("%s",strerror(errno)); close(sock); return -1; } //create epoll epoll_id = epoll_create(100); //promote sock to epoll event.events = EPOLLIN; event.data.fd=sock; epoll_ctl(epoll_id,EPOLL_CTL_ADD,sock,&event); printf("listen socket [%d]\n",sock); //accept while(1) { //wait epoll ret = epoll_wait(epoll_id,ret_events,100,10); if(ret == 0) { usleep(10); continue; } else if(ret < 0) { printf("%s\n",strerror(errno)); break; } //deal for(i = 0;i < ret;i++) { if(EPOLLERR & ret_events[i].events) { epoll_ctl(epoll_id,EPOLL_CTL_DEL,ret_events[i].data.fd,NULL); close(ret_events[i].data.fd); printf("client:[%d] force quit!\n",ret_events[i].data.fd); } else if(EPOLLRDHUP & ret_events[i].events) { epoll_ctl(epoll_id,EPOLL_CTL_DEL,ret_events[i].data.fd,NULL); close(ret_events[i].data.fd); printf("client:[%d] gracefully quit!\n",ret_events[i].data.fd); } else if(EPOLLIN & ret_events[i].events) { //accept or recv if(ret_events[i].data.fd == sock) { //accept client = accept(sock,NULL,NULL); event.events = EPOLLIN | EPOLLERR | POLLRDHUP|EPOLLET; event.data.fd=client; epoll_ctl(epoll_id,EPOLL_CTL_ADD,client,&event); } else { memset(buf,0,sizeof(buf)); count=recv(ret_events[i].data.fd,buf,sizeof(buf),0); printf("client:[%d][%s]\n",ret_events[i].data.fd,buf); event.events = EPOLLOUT; event.data.fd=ret_events[i].data.fd; epoll_ctl(epoll_id,EPOLL_CTL_MOD/*xiu gai*/,ret_events[i].data.fd,&event); } } else if(EPOLLOUT&ret_events[i].events) { send(ret_events[i].data.fd,buf,count,0); event.events = EPOLLIN|EPOLLERR|EPOLLRDHUP|EPOLLET; event.data.fd=ret_events[i].data.fd; epoll_ctl(epoll_id,EPOLL_CTL_MOD,ret_events[i].data.fd,&event); } } } //close close(sock); return 0; }