더북(TheBook)

writefds는 쓰기용으로 체크하고 싶은 소켓을 담은 fd_set이다. select()가 리턴한 뒤 writefds에 아직 남아있는 소켓은 쓰기 작업을 해도 호출 스레드가 블로킹 걸리지 않는다. nullptr를 넘기면 쓰기 가능한 소켓이 있는지 체크하지 않고 넘어간다. 소켓은 내부의 전송용 버퍼가 가득 차면 보통 블로킹 상태에 빠진다.

exceptfds는 에러를 점검하고자 하는 소켓을 담은 fd_set이다. select()가 리턴한 뒤 exceptfds에 아직 남아있는 소켓은 에러가 발생한 것들이다. nullptr를 넘겨 에러 검사를 건너뛸 수 있다.

timeout에는 최대 제한 시간을 지정한다. readfds 중 읽을 수 있는 것이 없고, writefds 중 쓸 수 있는 것도 없으며, exceptfds에 에러난 것 또한 없는 상태로 시간이 초과되면, 모든 집합의 내용이 제거되고 select()는 호출 스레드로 리턴한다. 시간제한을 두고 싶지 않다면 nullptr를 넘기면 된다.

select() 함수는 리턴하는 시점에서 readfds, writefds, exceptfds에 남아있는 소켓의 개수를 리턴한다. 그러니까 세 집합에 남은 개수의 총합계가 되는 셈이다. 시간 초과인 경우엔 집합을 싹 비우므로 리턴값이 0이 된다.

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