이 코드에는 사용자가 직접 UDPSocket을 만들 수 있는 함수가 없다. UDPSocket의 생성자는 private이다. SocketAddressFactory와 비슷한 패턴으로, 어떤 UDPSocket 객체가 있다면 그 mSocket은 반드시 살아 있는 것이게 된다.7 UDPSocket을 만들려면 코드 3-6의 SocketUtil::CreateUDPSocket() 함수를 호출하여 만드는데, 이 함수는 내부의 소켓 생성 동작이 성공해야만 객체를 리턴해 준다.
코드 3-6 UDPSocket 객체 생성하기
enum SocketAddressFamily { INET = AF_INET, INET6 = AF_INET6 }; UDPSocketPtr SocketUtil::CreateUDPSocket(SocketAddressFamily inFamily) { SOCKET s = socket(inFamily, SOCK_DGRAM, IPPROTO_UDP); if (s != INVALID_SOCKET) return UDPSocketPtr(new UDPSocket(s)); ReportError(L"SocketUtil::CreateUDPSocket"); return nullptr; }
7 역주 UDPSocket에 명시적인 Close( ) 함수가 없는 것도 같은 이유이다.