소켓 프로그래밍 I/O 멀티플렉싱 관련 질문

freesky의 이미지

제가 보고 있는 책에서 IO 멀티플렉싱 관련 예제로 다음과 같은 프로그램이 있습니다.

    // 윗 부분 생략
   fd_set read_fds, tmp_fds;
   FD_ZERO(&read_fds);
   FD_SET(ssock, &read_fds);    //  ssock는 서버 소켓
    while(1)
   {
       tmp_fds = read_fds;       // read_fds의 내용을 tmp_fds에 갱신
        if(select(FD_SETSIZE, &tmp_fds, (fd_set*)0, (fd_set *)0, (struct timeval*)0) < 1)
       {
            // 생략
        }
 
       for (fd = 0; fd < FD_SETSIZE; fd++)
       {
           if(FD_ISSET(fd, &tmp_fds))
           {
              if(fd == ssock)     // 클라이언트에서 접속 요구를 할 경우
                {
                  csock = accept(ssock, (struct sockaddr*)&client_addr, &clen);
                  FD_SET(csock, &read_fds);
              }
              else
              {
                  // 클라이언트가 요구한 내용 처리
                }
           }
       }
   }

제가 여기서 궁금해 하는 점은 굳이 tmp_fds란 것이 필요한지의 여부입니다.
처음에 read_fds에 서버 소켓을 설정하고, 이를 tmp_fds에 복사한 다음, select 함수로 tmp_fds에서 이벤트가 발생했는지 확인하고, for문으로 어느 파일 디스크립터에서 이벤트가 발생했는지 확인하는 구조입니다.
이런 경우에 만약 서버 소켓이 5번으로 할당되고, for 문을 수행하는 도중 처음으로 접속을 요청한 클라이언트 소켓이 6번으로 할당되었다면, 현재 tmp_fds에는 5번인 서버 소켓만 할당되어 있는 상태라 for 문을 다 돌고 나서야 tmp_fds가 갱신되어 클라이언트 소켓 6번의 이벤트를 처리할 수 있습니다.

제 생각에는 tmp_fds를 없애버리고
select(FD_SETSIZE, &read_fds, ...)
FD_ISSET(fd, &read_fds)
라고 고치면 다음 번 for 문 수행 때 바로 클라이언트가 요구한 내용을 처리할 수 있어서 더 빠를 것 같은데, 이렇게 하는 것에 문제는 없는지 알고 싶습니다.

익명 사용자의 이미지

그래도, 다시 초기화(예를 들어 , FD_ZERO 사용)하는 부분이 필요하겠군요.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.