#include #include #include struct AddrInfoPtr { struct addrinfo *info; AddrInfoPtr() noexcept: info(nullptr) {} ~AddrInfoPtr() noexcept { freeaddrinfo(info); } addrinfo** operator&() noexcept { return &info; } addrinfo& operator*() noexcept { return *info; } addrinfo* operator->() noexcept { return info; } const addrinfo& operator*() const noexcept { return *info; } operator addrinfo*() noexcept { return info; } }; struct AddrInfo { struct addrinfo info; static AddrInfoPtr get_local_addrinfo(PCSTR port) { AddrInfo hints; hints->ai_family = AF_INET; hints->ai_socktype = SOCK_STREAM; hints->ai_protocol = IPPROTO_TCP; hints->ai_flags = AI_PASSIVE; return hints.get_addrinfo(NULL, port); } AddrInfo() noexcept { ZeroMemory(&info, sizeof(info)); } ~AddrInfo() noexcept = default; addrinfo* operator->() noexcept { return &info; } addrinfo* operator&() noexcept { return &info; } operator const addrinfo&() const noexcept { return info; } operator addrinfo&() noexcept { return info; } AddrInfoPtr get_addrinfo(PCSTR node, PCSTR service) { AddrInfoPtr ptr; int result = getaddrinfo(node, service, &info, &ptr); if (result == SOCKET_ERROR) throw result; return ptr; } };