더북(TheBook)

이제 TCP 소켓의 receive() 처리 부분도 살펴봅시다. 수신 버퍼에 1바이트라도 들어 있으면 I/O 가능이 됩니다. 이 상태에서 TCP 수신, 즉 recv() 함수를 호출하면 수신 버퍼에 있는 것을 꺼내 옵니다. 따라서 would block이 생기지 않으며 UDP 소켓의 receive() 처리 역사 문제가 없습니다. 이유는 TCP 소켓의 receive() 처리 때와 같습니다.

하지만 UDP 소켓의 send() 처리에서는 문제가 있습니다.

List<Socket> sockets;
 
void NonBlockSocketOperation()
{
  while (true)
  {
      // 100밀리초까지 대기
      // 1개라도 I/O 처리를 할 수 있는 상태가 되면
      // 그 전에라도 리턴
      select(sockets, 100ms);
 
      foreach(s in sockets)
      {
          // 논블록 수신
          (result, length) = s.sendto(dest, data);
          if (length >= 0)
          {
              // 잘 보냈다.
          }
          else if (result != EWOULDBLOCK)
          {
              // 소켓 오류 처리를 한다.
          }
          else
          {
              // 아직 would block이다.
          }
      }
  }
}
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.