epoll 에서 Listen 소켓을 이벤트 지정 값은...

sjang의 이미지

/* 소켓 생성 */
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번 나온다는 뜻입니다.

어느 것이 올바른 구현인가요?

bugiii의 이미지

제 경험으로는 레벨 트리거를 사용해서 구현하는 것이 훨씬 쉽고 자연스럽습니다. 엣지 트리거라면, listen 큐에 담긴 것들이 몇개인지를 알아야 하는 문제를 해결해야 할텐데 적절한 방법이 떠오르지 않는군요. 비동기로 accept 해서 실패하는 경우에 다시 대기상태로 가면 되겠지만, 레벨 트리거라면 한번에 하나라는 것으로 더 간단하게 구현할 수 있습니다.

sjang의 이미지

EPOLLET로 했을 때의 현상때문에 Listen 소켓을 EPOLLET로 설정하고 아래와 같이 코딩하기도 했었죠.


client = accept(.....); /* 물론, Non-block Listener */
if (client > 0)
{

/* epoll FD에 등록 */
.
.
.

}

nfsd = epoll_wait(....); /* TIMEOUT를 10ms 정도로 주었습니다.*/

이렇게 해도 잘 동작하는거 같았습니다.

그리고, 다른 구현방법으로 Listen 소켓을 Level trigger로 하고 accept() 부분을 이벤트처리로
구현하기도 했습니다.

말씀하신대로라면 후자가 되겠네요.

성능상의 차이는 없다고 할 수 있을까요?

일반적인 방법은 무엇인가요?

Listen 소켓을 Level trigger로, accept() 후에 소켓은 Edge trigger로..... 이렇게 하는 것이 일반적일까요?

감사합니다.

The Future !!!

nomoreid의 이미지

sjang wrote:


client = accept(.....); /* 물론, Non-block Listener */
if (client > 0)
{

/* epoll FD에 등록 */
.
.
.

}

nfsd = epoll_wait(....); /* TIMEOUT를 10ms 정도로 주었습니다.*/

이렇게 해도 잘 동작하는거 같았습니다.
.

네 위에분 말씀도 맞는거 같구요 첨언하자면. 위처럼 했을때는 이론상 10ms에 클라이언트 하나씩 받을 수 있기 때문에..
다음과 같이 바꿔서 해결했는데 맞는건지 모르겠네요. 이렇게 해보신분 계시나요?

nfsd = epoll_wait(....); /* TIMEOUT를 10ms 정도로 주었습니다.*/

if ( 서버 소켓에서 이벤트가 발생했다면 )
{    
    while(1)
    {
        client = accept(.....); /* 물론, Non-block Listener */
        if ( client == -1) break;
        else if (client > 0)
        {

        /* epoll FD에 등록 */
        .
        .
        .

        } // if
    }// while
} // if 


Never Ending 삽질.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.