멀티스레드 epoll과 EPOLLRDHUP 어디가 문제인가요?
글쓴이: 익명 사용자 / 작성시간: 토, 2019/06/15 - 4:10오후
while(1) { clnt_adr_sz=sizeof(clnt_addr); clnt_sock=accept(serv_sock, (struct sockaddr*)&clnt_addr, sizeof(clnt_adr_sz); event.events=EPOLLRDHUP; // 스레드로 전달된 소켓 디스크립터의 종료(클라이언트 종료)를 기다림 event.data.fd=clnt_sock; epoll_ctl(epfd, EPOLL_CTL_ADD, clnt_sock, &event); pthread_mutex_lock(&mutex); clnt_socks[clnt_sock++]=clnt_sock; //전역변수 clnt_socks[]와 clnt_sock pthread_mutex_unlock(&mutex); pthread_create(&t_id, NULL, handle_clnt, (void*)&clnt_sock); pthread_detach(t_id); printf("Connected client IP: %s \n", inet_ntoa(clnt_adr.sin_addr)); event_cnt=epoll_wait(epfd, ep_events, EPOLL_SIZE, -1); // 혹시나 해서 출력해보면 실패했다고 -1이 뜹니다. for(i=0; i<event_cnt; i++) { epoll_ctl(epfd, EPOLL_CTL_DEL, ep_events[i].data.fd, NULL); // 종료된 클라이언트들의 소켓 디스크립터 close(ep_events[i].data.fd); printf("closed client: %d \n", ep_events[i].data.fd); } }
Forums:
댓글 달기