더북(TheBook)

리스닝 소켓이 논블록 소켓인 경우 TCP 연결이 아직 들어오지 않았으면 accept()는 블로킹 대신 would block 오류 코드를 줍니다. 이는 논블록 소켓이 수신할 데이터가 없을 때 recv()가 블로킹 대신 would block 오류 코드를 주는 것과 마찬가지입니다. select()를 갖고 리스닝 소켓에서 I/O 가능 이벤트가 감지되면 accept()를 호출하세요. 그러면 들어온 TCP 연결에 대한 소켓 핸들을 얻게 됩니다.

void NonBlockSocketOperation()
{
  s = socket(TCP);
  // 논블록 소켓으로 변경
  s.SetNonBlocking(true);
  s.listen(5000);
 
  while (true)
  {
      (socket, result) = s.accept();
 
      if (result = = EWOULDBLOCK)
      {
          // 블로킹 걸릴 상황이었다. TCP 연결이 안 들어왔다.
          continue;
      }
 
      if (result = = OK)
      {
          // TCP 연결을 잘 받았다.
      }
      else
      {
          // 리스닝 소켓에 무슨 문제가 생겼다.
      }
  }
}
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.