다중접속이 처리되기는 하지만 write(); 앞에 sleep(10); 등을 넣어서 컴파일 후 클라이언트 두개를 동시에 사용하면 한개씩 처리하는것을 알 수 있다.
다중스레드를 사용하지 않는 한 간단한 일밖에 하지 못한다.
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <sys/epoll.h> #include <arpa/inet.h> #include <sys/socket.h> #include <netinet/in.h> #include <fcntl.h> #include <sys/ioctl.h> #define SA struct sockaddr #define EPOLL_SIZE 20 int main(int argc,char *argv[]) { struct sockaddr_in addr,clientaddr; struct eph_comm *conn; int sfd; int cfd; int clilen; int flags=1; int n,i; int readn; struct epoll_event *events; int efd; char buf_in[256]; events=(struct epoll_event *) malloc(sizeof(*events)*EPOLL_SIZE); if((efd=epoll_create(EPOLL_SIZE))<0) { perror("epoll_create error:"); return 1; } clilen=sizeof(clientaddr); sfd=socket(AF_INET,SOCK_STREAM,0); if(sfd==-1) { perror("socket error:"); close(sfd); return 1; } addr.sin_family=AF_INET; addr.sin_port=htons(4445); addr.sin_addr.s_addr=htons(INADDR_ANY); if(bind(sfd,(struct sockaddr *) &addr,sizeof(addr))==-1) { close(sfd); return 1; } listen(sfd,5); events->events=EPOLLIN; events->data.fd=sfd; epoll_ctl(efd,EPOLL_CTL_ADD,sfd,events); while(1) { n=epoll_wait(efd,events,EPOLL_SIZE,-1); if(n==-1) { perror("epoll wait error:"); } for(i=0;i<n;i++) { if(events[i].data.fd==sfd) { //printf("Accept:"); cfd=accept(sfd,(SA *) &clientaddr,&clilen); printf("Accept: %d\n",cfd); events->events=EPOLLIN; events->data.fd=cfd; epoll_ctl(efd,EPOLL_CTL_ADD,cfd,events); } else { memset(buf_in,0x00,256); readn=read(events[i].data.fd,buf_in,255); if(readn<=0) { epoll_ctl(efd,EPOLL_CTL_DEL,events[i].data.fd,events); close(events[i].data.fd); printf("Close: %d\n",events[i].data.fd); } else { printf("read data: %s",buf_in); /* int count; for(count=0;count<readn;count++) { printf("0x%02x ",buf_in[count]); } */ if(strcmp(buf_in,"exit\x0d\x0a")==0) { write(events[i].data.fd,"bye!!\n",6); epoll_ctl(efd,EPOLL_CTL_DEL,events[i].data.fd,events); close(events[i].data.fd); printf("Exit: %d\n",events[i].data.fd); } else { write(events[i].data.fd,buf_in,strlen(buf_in)); } } } } } }