epoll 에서 Listen 소켓을 이벤트 지정 값은...
글쓴이: sjang / 작성시간: 목, 2005/10/27 - 11:19오전
/* 소켓 생성 */ serv_sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); bind(serv_sock,(struct sockaddr *)&serv_addr,sizeof(serv_addr)); listen(serv_sock,MAXPENDING); fcntl(serv_sock,F_SETFL,O_NONBLOCK); /* non-block */
위와 같이 작성한 후에, 이벤트를 설정할 때 아래 1, 2 중 어느것으로 해야하나요?
1. serv_event.events=EPOLLIN;
2. serv_event.events=EPOLLIN|EPOLLET;
EPOLLET는 epoll를 edge trigger 로 사용한다는 뜻.
listen 소켓에 대해서 EPOLLET를 넣게 되면, epoll_wait()전에 여러 접속이 있었더라도
이벤트는 한번만 보고 됩니다.
EPOLLET를 안넣어서 Level Trigger로 쓰게 되면 epoll_wait()에서 1를 리턴되면서
한번에 하나씩 이벤트가 옵니다. 즉, 클라이언트 3곳에서 접속하면 epoll_wait()에서 1이
리턴되는 결과가 3번 나온다는 뜻입니다.
어느 것이 올바른 구현인가요?
Forums:
제 경험으로는 레벨 트리거를 사용해서 구현하는 것이 훨씬 쉽고 자연스럽습
제 경험으로는 레벨 트리거를 사용해서 구현하는 것이 훨씬 쉽고 자연스럽습니다. 엣지 트리거라면, listen 큐에 담긴 것들이 몇개인지를 알아야 하는 문제를 해결해야 할텐데 적절한 방법이 떠오르지 않는군요. 비동기로 accept 해서 실패하는 경우에 다시 대기상태로 가면 되겠지만, 레벨 트리거라면 한번에 하나라는 것으로 더 간단하게 구현할 수 있습니다.
EPOLLET로 했을 때의 현상때문에 Listen 소켓을 EPOLLET로
EPOLLET로 했을 때의 현상때문에 Listen 소켓을 EPOLLET로 설정하고 아래와 같이 코딩하기도 했었죠.
이렇게 해도 잘 동작하는거 같았습니다.
그리고, 다른 구현방법으로 Listen 소켓을 Level trigger로 하고 accept() 부분을 이벤트처리로
구현하기도 했습니다.
말씀하신대로라면 후자가 되겠네요.
성능상의 차이는 없다고 할 수 있을까요?
일반적인 방법은 무엇인가요?
Listen 소켓을 Level trigger로, accept() 후에 소켓은 Edge trigger로..... 이렇게 하는 것이 일반적일까요?
감사합니다.
The Future !!!
[quote="sjang"][code:1]client = ac
네 위에분 말씀도 맞는거 같구요 첨언하자면. 위처럼 했을때는 이론상 10ms에 클라이언트 하나씩 받을 수 있기 때문에..
다음과 같이 바꿔서 해결했는데 맞는건지 모르겠네요. 이렇게 해보신분 계시나요?
Never Ending 삽질.
댓글 달기