더북(TheBook)

이를 논블록 소켓으로 처리하면 블로킹이 난무하는 문제가 사라집니다.

List<Socket> sockets;
 
void NonBlockSocketOperation()
{
  foreach(s in sockets) // 각 소켓에 대해
  {
      // 논블록 수신. 오류 코드와 수신된 데이터를 받는다.
      (result, data) = s.receive();
      if (data.length > 0) // 잘 수신했으면
      {
          print(data); // 출력
      }
      else if (result != EWOULDBLOCK)
      {
          // would block이 아니면 오류가 난 것이므로
          // 필요한 처리를 한다.
          ...;
      }
  }
}

이 코드는 루프를 돌면서 논블록 수신을 합니다. 수신할 데이터가 있으면 그냥 꺼내서 처리합니다. 수신할 데이터가 없으면 would block 코드를 리턴할 뿐 수신 함수는 즉시 리턴해 버립니다. 따라서 많은 수의 소켓 데이터를 지연 시간 없이 처리할 수 있습니다.

논블록 수신 함수가 would block 코드를 리턴한 경우에는 잠시 후 다시 논블록 수신 함수를 호출하면 됩니다. 수신된 것이 있으면 수신된 데이터가 리턴될 것이고, 그렇지 않다면 would block 코드가 또 나올 것입니다.

Tip

소켓 프로그래밍은 지저분하고 까다롭기로 유명합니다. 그것은 함수들의 입출력 매개변수와 리턴 값 설명이 매우 길기 때문입니다. 게다가 이들 설명을 자세히 읽지 않으면 몇 가지 예외 경우를 놓치면서 고생합니다. 따라서 소켓 프로그래밍을 할 때는 소켓 API 도움말을 (내용이 길더라도) 꼼꼼하게 확인해 보세요.

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