16 #define _WINSOCK_DEPRECATED_NO_WARNINGS
24 #include <arpa/inet.h>
35 #ifndef INET6_ADDRSTRLEN // might not be defined in older Windows SDKs
36 #define INET6_ADDRSTRLEN 46
40 const char *inet_ntop(
int af,
const void *src,
char *dst, socklen_t size) {
48 const char *formatted = inet_ntoa(*
static_cast<const in_addr *
>(src));
49 if (formatted && strlen(formatted) <
static_cast<size_t>(size)) {
50 return ::strcpy(dst, formatted);
55 char tmp[INET6_ADDRSTRLEN] = {0};
57 int full_size = ::snprintf(
58 tmp,
sizeof(tmp),
"%x:%x:%x:%x:%x:%x:%x:%x", ntohs(src16[0]),
59 ntohs(src16[1]), ntohs(src16[2]), ntohs(src16[3]), ntohs(src16[4]),
60 ntohs(src16[5]), ntohs(src16[6]), ntohs(src16[7]));
61 if (full_size <
static_cast<int>(size)) {
62 return ::strcpy(dst, tmp);
107 return sizeof(
struct sockaddr_in);
109 return sizeof(
struct sockaddr_in6);
111 assert(0 &&
"Unsupported address family");
116 #if defined(__APPLE__) || defined(__FreeBSD__) || defined(__NetBSD__)
131 #if defined(__APPLE__) || defined(__FreeBSD__) || defined(__NetBSD__)
137 char str[INET6_ADDRSTRLEN] = {0};
180 if (addr_info && addr_info->ai_addr && addr_info->ai_addrlen > 0 &&
182 ::memcpy(&
m_socket_addr, addr_info->ai_addr, addr_info->ai_addrlen);
209 int ai_family,
int ai_socktype,
int ai_protocol,
213 auto addresses =
GetAddressInfo(host, service, ai_family, ai_socktype,
214 ai_protocol, ai_flags);
215 if (!addresses.empty())
216 *
this = addresses[0];
220 std::vector<SocketAddress>
222 int ai_family,
int ai_socktype,
int ai_protocol,
224 std::vector<SocketAddress> addr_list;
226 struct addrinfo hints;
227 memset(&hints, 0,
sizeof(hints));
228 hints.ai_family = ai_family;
229 hints.ai_socktype = ai_socktype;
230 hints.ai_protocol = ai_protocol;
231 hints.ai_flags = ai_flags;
233 struct addrinfo *service_info_list =
nullptr;
234 int err =
::getaddrinfo(hostname, servname, &hints, &service_info_list);
235 if (err == 0 && service_info_list) {
236 for (
struct addrinfo *service_ptr = service_info_list;
237 service_ptr !=
nullptr; service_ptr = service_ptr->ai_next) {
242 if (service_info_list)
243 ::freeaddrinfo(service_info_list);
321 return !(*
this == rhs);