epoll에서 동시에 발생한 이벤트의 처리
글쓴이: sjang / 작성시간: 수, 2005/10/26 - 8:36오후
epoll로 web proxy 하나 구현중입니다.
non-blocking 소켓을 사용하고 있습니다.
epoll의 man 페이지 예제처럼 listen 소켓을 만들고, 이것을 감시할 epoll fd에 ADD 하였습니다.
그런데, epoll_wait() 상태에서 동시에 두곳에서 접속이 들어오면 listen 소켓에서 이벤트가 하나만 발생했다고 리턴합니다.
epoll의 man 페이지에 아래와 같은 FAQ를 봤습니다.
Q7: If more than one event comes in between poll_wait(2) calls, are they combined or reported separately? A7: They will be combined.
즉, 하나의 소켓에 이벤트가 동시에 발생하면 epoll_wait()에서 이벤트가 합쳐져서 하나만 발생했다고 리턴한다는 말인데...... 맞는 것인가요?
Listen 소켓에 이벤트가 오면 aceept()를 호출하는데, 한번의 이벤트가 보고 되니까, accept()도 한번만 호출합니다.
근데, 이상하게도 접속을 시도한 두곳 모두 정상연결로 나오네요.
우째 이런일이....
epoll를 사용할 때 listen 소켓 처리에 대한 조언을 바랍니다.
감사합니다.
Forums:
질문을 좀 더 쉽게 고치면요...동시에 접속이 오더라도 accep
질문을 좀 더 쉽게 고치면요...
동시에 접속이 오더라도 accept()에서 하나만 받고, 나머지는 backlog에 쌓이잖아요.
이런것처럼 epoll에서도 listen 소켓에 이벤트(EPOLLIN)가 발생하면 accept()를 호출하는데, backlog와는 다르게, 이벤트는 쌓이지 않아서 epoll_wait()에서 이벤트가 다시 오지않고, 그래서 accept()를 호출할 수 없다는 뜻입니다.
Listen 소켓은 epoll FD에 넣지 않고 non-block 으로 accept()를 계속 호출해야 할까요?
The Future !!!
댓글 달기