Files

72 lines
1.5 KiB
C++
Raw Permalink Normal View History

2026-07-22 22:02:06 +08:00
#include <WinSock2.h>
#include <ws2tcpip.h>
#include <iphlpapi.h>
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;
}
};