X-Git-Url: http://git.tdb.fi/?p=libs%2Fnet.git;a=blobdiff_plain;f=source%2Fnet%2Fresolve.cpp;fp=source%2Fnet%2Fresolve.cpp;h=e8aad664d3cb5c722f032874352c60c15a5309e9;hp=0000000000000000000000000000000000000000;hb=50e9f9ea7f7385a2c5931fca2b8fb1103078e67c;hpb=21c596567e3b6fd794ed6af73d304ce2bc70e58f diff --git a/source/net/resolve.cpp b/source/net/resolve.cpp new file mode 100644 index 0000000..e8aad66 --- /dev/null +++ b/source/net/resolve.cpp @@ -0,0 +1,90 @@ +#ifdef WIN32 +#define _WIN32_WINNT 0x0501 +#include +#else +#include +#endif +#include +#include +#include "sockaddr_private.h" +#include "socket.h" +#include "resolve.h" + +using namespace std; + +namespace Msp { +namespace Net { + +SockAddr *resolve(const string &host, const string &serv, Family family) +{ + const char *chost = (host.empty() ? 0 : host.c_str()); + const char *cserv = (serv.empty() ? 0 : serv.c_str()); + unsigned flags = 0; + if(host=="*") + { + flags = AI_PASSIVE; + chost = 0; + } + + addrinfo hints = { flags, family_to_sys(family), 0, 0, 0, 0, 0, 0 }; + addrinfo *res; + + int err = getaddrinfo(chost, cserv, &hints, &res); + if(err==0) + { + SockAddr::SysAddr sa; + sa.size = res->ai_addrlen; + const char *sptr = reinterpret_cast(res->ai_addr); + char *dptr = reinterpret_cast(&sa.addr); + copy(sptr, sptr+res->ai_addrlen, dptr); + SockAddr *addr = SockAddr::new_from_sys(sa); + freeaddrinfo(res); + return addr; + } + else +#ifdef WIN32 + throw system_error("getaddrinfo", WSAGetLastError()); +#else + throw system_error("getaddrinfo", gai_strerror(err)); +#endif +} + +SockAddr *resolve(const string &str, Family family) +{ + string host, serv; + if(str[0]=='[') + { + unsigned bracket = str.find(']'); + host = str.substr(1, bracket-1); + unsigned colon = str.find(':', bracket); + if(colon!=string::npos) + serv = str.substr(colon+1); + } + else + { + unsigned colon = str.find(':'); + if(colon!=string::npos) + { + host = str.substr(0, colon); + serv = str.substr(colon+1); + } + else + host = str; + } + + return resolve(host, serv, family); +} + + /*sockaddr sa; + unsigned size = fill_sockaddr(sa); + char hst[128]; + char srv[128]; + int err = getnameinfo(&sa, size, hst, 128, srv, 128, 0); + if(err==0) + { + host = hst; + serv = srv; + }*/ + +} // namespace Net +} // namespace Msp