Non-blocking socket에서 recv하는 도중 -1리턴과 함께 errno==EAGAIN이면 더이상 읽을 데이터가 없단 뜻..
epoll & tcp listen socket 사용시 EPOLLET(Edge trigger)사용시 epoll_wait을 통해 이벤트 받았을 때 한번씩만 accept하면 accept못하는 클라이언트 발생.
(확인안해봄) EAGAIN이 나올때까지 accept하거나
Listen socket에는 Edge trigger을 사용하지 않고 그냥 Level trigger만 사용.
당연히 Receive에는 ET사용.
epoll사용시 같은fd에 대한 이벤트가 여러Thread에서 처리될 수 있다.
이런경우 순서의 문제 등이 발생할 수 있는데 EPOLLONESHOT을 통해 이러한 문제가 해결 가능하다.
해당 이벤트 처리 후 EPOLL_CTL_MOD 을 통해 다시 이벤트를 등록해야 한다.
이벤트 처리중 ~ EPOLL_CTL_MOD 중간에 또다시 event가 발생한다면?(데이터 수신이 일어난다면?)
문제없다. EPOLL_CTL_MOD 등 이벤트를 등록할때 수신큐를 확인해서 이벤트를 등록한다고 한다.
반응형
댓글