1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
|
#include"warp.h" #define SERV_PORT 9527 #define OPEN_MAX 20 int main(int argc,char * argv[]) { int i,listenfd,connfd,efd,res,nready,sockfd; int n,num=0; char buf[4096],str[INET_ADDRSTRLEN]; socklen_t clien; listenfd=Socket(AF_INET,SOCK_STREAM,0); int opt=1; setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt)); struct sockaddr_in servaddr,cliaddr; struct epoll_event tep,ep[OPEN_MAX];
servaddr.sin_family=AF_INET; servaddr.sin_port=htons(SERV_PORT); servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
Bind(listenfd,(struct sockaddr *)&servaddr,sizeof(servaddr)); Listen(listenfd,128); efd=epoll_create(OPEN_MAX); if(efd==-1) perr_exit("epoll_create error");
tep.events=EPOLLIN; tep.data.fd=listenfd; res=epoll_ctl(efd,EPOLL_CTL_ADD,listenfd,&tep); if(res==-1) perr_exit("epoll_ctl error"); for(;;) { nready=epoll_wait(efd,ep,OPEN_MAX,-1); if(nready==-1) perr_exit("epoll_wait error"); for(i=0;i<nready;i++) { if(!ep[i].events&EPOLLIN) continue; if(ep[i].data.fd==listenfd) { clien=sizeof(cliaddr); connfd=Accept(listenfd,(struct sockaddr *)&cliaddr,&clien);
printf("received from %s at PORT %d\n",inet_ntop(AF_INET,&cliaddr.sin_addr,str,sizeof(str)),ntohs(cliaddr.sin_port)); printf("cfd %d---client %d\n",connfd,++num); tep.events=EPOLLIN; tep.data.fd=connfd; res=epoll_ctl(efd,EPOLL_CTL_ADD,connfd,&tep); if(res==-1) perr_exit("epoll_ctl error"); } else { sockfd=ep[i].data.fd; n=Read(sockfd,buf,4096);
if(n==0) { res=epoll_ctl(efd,EPOLL_CTL_DEL,sockfd,NULL); if(res==-1) perr_exit("epoll_ctl error"); Close(sockfd); printf("client[%d] closed connection\n",sockfd); } else if(n<0) { perror("read n<0 error:"); res=epoll_ctl(efd,EPOLL_CTL_DEL,sockfd,NULL); Close(sockfd); } else { for(i=0;i<n;i++) buf[i]=toupper(buf[i]); Write(STDOUT_FILENO,buf,n); Write(sockfd,buf,n); } } } }
Close(listenfd); Close(efd); return 0; }
|