FillSetFromVector()와 FillVectorFromSet()은 도우미 함수로 소켓의 vector를 fd_set으로, 또는 역으로 상호 변환해 준다. 굳이 체크하지 않아도 되는 부분에는 vector에 널을 지정하면 되는데, 그러면 fd_set도 널이 된다. 이 함수를 쓰면 직접 fd_set을 설정하는 것보다 약간 비효율적일 수는 있겠지만 실제 성능상 영향은 미미하다. 그보다는 소켓을 블로킹하는데 워낙 긴 시간이 걸리기 때문이다. fd_set을 그대로 쓰지 않고 vector로 래핑하는 이유는 리턴된 집합 내에 포함된 소켓을 쉽게 순회하기 위해서다. 그런데 여기서는 주어진 vector의 소켓은 원래대로 두고, 나중에 별도의 vector로 리턴하는데, 원래 select() 함수와는 달리 호출 시 원본이 변조되지 않도록 하기 위해서다.9
코드 3-11은 TCP 서버를 개설하고 리스닝한 다음, 새로 구현한 Select()를 사용해 루프를 돈다. 클라이언트가 접속하면 이를 받는 동시에 기존 클라이언트의 데이터를 받기도 한다. 이 코드는 메인 스레드에서 구동해도 되고, 전용 스레드를 하나 따로 두어 구동해도 좋다.
9 역주 select( )를 직접 써 보면 왜 이렇게 입력값을 건드려서 매번 다시 세팅해 주게 만들어 놨나, 하는 의문이 들 것이다.