epoll에서 작동하는 두 개의 스레드가 있습니다. 하나의 스레드가 서버에 대한 TCP 연결을 시도하고 EPOLL_CTL_ADD 옵션을 사용하여 소켓을 epoll-fd에 추가합니다.Epoll : SD가 epoll-fd에 추가되면 이벤트의 실제 SD 값과 다릅니다.
또 다른 스레드는 epoll-fd에 추가 된 SD에서 이벤트 대기를 담당합니다.
스레드 1 :
establish_tcp_conn()
{
struct epoll_event event;
sd = socket(AF_INET,SOCK_STREAM,0);
fcntl(sd, F_SETFL, O_NONBLOCK);
connect(sd,(struct sockaddr *)&servaddr, sizeof(servaddr));
event.events = EPOLLOUT | EPOLLIN | EPOLLRDHUP | EPOLLERR | EPOLLET ;
event.data.fd = sd;
event.data.ptr = data; //user data
epoll_ctl((int)g_epfd, EPOLL_CTL_ADD, sd, &event) ; // successful
......
}
스레드 2 :
void * sock_thread()
{
n = epoll_wait(g_epfd, events, MAX_SOCKETS, -1);
...
}
A 이벤트는 sd
이 g_epfd
에 추가에, 나는 sd != events[i].data.fd
볼 발생합니다. events[i].data.fd
의 값은 부당한 값을 포함합니다. 그러나 correctly.Also 이벤트를 검출하고, event.data에 부착 된 사용자 데이터가 왜 events[i].data.fd
EPOLL_CTL
첨가 한 것 sd
동일하지이다 events[i].data.ptr
에서 잘 얻어?
아아! 감사합니다 @ cmeerw! – Prabhu