더북(TheBook)

이번에는 connect()accept()의 I/O 가능 이벤트도 알아봅시다. epoll은 connect()accept()에서도 I/O 가능 이벤트를 받을 수 있습니다. connect()send 이벤트와 동일하게, 그리고 accept()receive 이벤트와 똑같이 취급됩니다. 따라서 리스닝 소켓에 대한 receive 이벤트를 받을 경우, accept()를 호출하면 새 TCP 연결의 소켓을 얻을 수 있습니다. 다음 코드는 그 예입니다.

...
foreach(event in events) // ➍
{
  s = event.socket;    // ➎
  // 위 epoll.add에 들어갔던 값을 얻는다.
  userPtr = event.userPtr;
  // 수신? 송신?
  type = event.type;
  if (type = = ReceiveEvent)
  {
      if (s가 리스닝 소켓이면)
      {
          s2 = s.accept();
      }
      else
      {
          s.recv();
      }
  }
}

Tip

epoll의 실제 구동되는 예시 코드를 깃허브에 마련해 두었으니 참고하세요.

chapter_3/tcp_many_server_epoll: 논블로킹 모드로 TCP 연결을 받은 후 TCP 연결 각각에서 논블로킹 모드로 작동합니다. 별도의 스레드를 만들지 않고 메인 스레드에서 다수의 소켓을 모두 처리합니다. epoll을 이용하여 소켓 개수만큼 루프를 돌지 않습니다.

책에 나오는 의사 코드와 실제 작동하는 코드를 비교 및 직접 구동해 보기를 권장합니다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.