더북(TheBook)

보다시피 일단 select()를 호출합니다. 매개변수로 소켓의 배열과 대기 최대 시간을 넣습니다.

에서 select()를 호출합니다. sockets에 I/O 처리가 가능한 소켓이 하나라도 있을 경우 즉시 리턴합니다. 그렇지 않으면 100밀리초까지 블로킹합니다. 그 전에라도 조건을 만족하면 즉시 리턴합니다.

I/O 처리가 가능하다는 것은 해당 소켓에 대해 소켓 함수를 호출하면 would block이 아닌 다른 결과가 나온다는 것을 의미합니다. 이러한 상태를 “I/O 처리가 가능하다.”라는 의미에서 I/O 가능(I/O available event) 이벤트가 왔다 혹은 I/O 가능이라고 합니다. 소켓 안의 송신 버퍼에 1바이트라도 공간이 남았거나 소켓 안의 수신 버퍼에 1바이트라도 들어 있다면 I/O 가능입니다.

select() 함수가 리턴한 후에는 sockets의 각 소켓에 대한 논블록 I/O 처리 함수를 호출하면 됩니다. 성공하는 것도 실패하는 것도 있겠지만, 최소한 하나는 would block이 아닌 다른 결과가 나올 것입니다.

Tip

윈도와 리눅스에서는 select() 사용법이 서로 조금 다릅니다. 여기서는 운영체제 중립성을 최대한 지키고자 윈도와 리눅스 간의 select()poll() 함수 중 가장 유사한 것을 예시 코드로 사용했습니다. 그래서 윈도에서는 WSAPoll()을 쓰고, 리눅스에서는 poll()을 씁니다.

 

마지막으로 논블록 accept 처리를 알아봅시다.

블로킹 모드인 경우 리스닝 소켓에 대해 accept()를 호출하면 accept()는 블로킹이 걸립니다. 그리고 TCP 연결이 들어오면 리턴을 하는데, 이때 accept()의 리턴 값은 새 TCP 연결에 대한 소켓 핸들입니다.

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