더북(TheBook)

호스트 네임을 IP 주소로 리졸브(resolve), 즉 해석하기 위해, getaddrinfo() 함수는 운영체제에 설정된 대로 DNS 프로토콜 패킷을 만든 다음 UDP나 TCP로 DNS 서버에 보내게 된다. 이후 응답받기를 기다렸다 파싱해서 addrinfo 구조체의 연결 리스트를 만들어 이것을 호출자에게 돌려준다. 이 과정에서 원격 호스트에 정보를 보내고 받는 단계가 포함되므로 시간이 많이 지체될 수 있다. 몇 밀리초 내에 끝나는 경우도 있지만, 대개의 경우 초 단위의 지연이 수반될 수 있다. getaddrinfo()에는 비동기 동작을 하게끔 하는 옵션이 없으므로 호출 스레드는 응답을 받을 때까지 마냥 블로킹되어야 있어야 한다. 이는 사용자 입장에서 바람직하지 않으므로 호스트네임을 IP 주소로 리졸브할 일이 있다면, getaddrinfo()가 메인 스레드를 붙잡고 있지 않도록 별도의 스레드에서 돌리는 방안을 생각해야 한다. 윈도에선 대신 전용 함수인 GetAddrInfoEx()를 쓸 수 있는데 여기에는 스레드를 따로 만들지 않아도 비동기식으로 동작하게 하는 옵션이 있다.

이제 코드 3-4와 같이 getaddrinfo() 기능을 SocketAddressFactory 클래스에 깔끔하게 캡슐화할 수 있다.

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