2 #define _WIN32_WINNT 0x0501
7 #include <msp/core/systemerror.h>
8 #include <msp/strings/format.h>
9 #include "sockaddr_private.h"
18 SockAddr *resolve(const string &host, const string &serv, Family family)
20 const char *chost = (host.empty() ? 0 : host.c_str());
21 const char *cserv = (serv.empty() ? 0 : serv.c_str());
29 addrinfo hints = { flags, family_to_sys(family), 0, 0, 0, 0, 0, 0 };
32 int err = getaddrinfo(chost, cserv, &hints, &res);
36 sa.size = res->ai_addrlen;
37 const char *sptr = reinterpret_cast<const char *>(res->ai_addr);
38 char *dptr = reinterpret_cast<char *>(&sa.addr);
39 copy(sptr, sptr+res->ai_addrlen, dptr);
40 SockAddr *addr = SockAddr::new_from_sys(sa);
46 throw system_error("getaddrinfo", WSAGetLastError());
48 throw system_error("getaddrinfo", gai_strerror(err));
52 SockAddr *resolve(const string &str, Family family)
57 unsigned bracket = str.find(']');
58 host = str.substr(1, bracket-1);
59 string::size_type colon = str.find(':', bracket);
60 if(colon!=string::npos)
61 serv = str.substr(colon+1);
65 string::size_type colon = str.find(':');
66 if(colon!=string::npos)
68 host = str.substr(0, colon);
69 serv = str.substr(colon+1);
75 return resolve(host, serv, family);
79 unsigned size = fill_sockaddr(sa);
82 int err = getnameinfo(&sa, size, hst, 128, srv, 128, 0);