]> git.tdb.fi Git - libs/net.git/blob - source/resolve.cpp
Don't close socket on Communicator error
[libs/net.git] / source / resolve.cpp
1 #ifdef WIN32
2 #define _WIN32_WINNT 0x0501
3 #include <ws2tcpip.h>
4 #else
5 #include <netdb.h>
6 #endif
7 #include <msp/core/systemerror.h>
8 #include <msp/strings/format.h>
9 #include "socket.h"
10 #include "resolve.h"
11
12 using namespace std;
13
14 namespace Msp {
15 namespace Net {
16
17 SockAddr *resolve(const string &s, Family family)
18 {
19         string host, serv;
20         if(s[0]=='[')
21         {
22                 unsigned bracket = s.find(']');
23                 host = s.substr(1, bracket-1);
24                 unsigned colon = s.find(':', bracket);
25                 if(colon!=string::npos)
26                         serv = s.substr(colon+1);
27         }
28         else
29         {
30                 unsigned colon = s.find(':');
31                 if(colon!=string::npos)
32                 {
33                         host = s.substr(0, colon);
34                         serv = s.substr(colon+1);
35                 }
36                 else
37                         host = s;
38         }
39
40         addrinfo hints = {0, family, 0, 0, 0, 0, 0, 0};
41         addrinfo *res;
42         const char *chost = (host.empty() ? 0 : host.c_str());
43         const char *cserv = (serv.empty() ? 0 : serv.c_str());
44         int err = getaddrinfo(chost, cserv, &hints, &res);
45         if(err==0)
46         {
47                 SockAddr *addr = SockAddr::create(*res->ai_addr);
48                 freeaddrinfo(res);
49                 return addr;
50         }
51         else
52 #ifdef WIN32
53                 throw system_error("getaddrinfo", WSAGetLastError());
54 #else
55                 throw system_error("getaddrinfo", gai_strerror(err));
56 #endif
57 }
58
59                 /*sockaddr sa;
60                 unsigned size = fill_sockaddr(sa);
61                 char hst[128];
62                 char srv[128];
63                 int err = getnameinfo(&sa, size, hst, 128, srv, 128, 0);
64                 if(err==0)
65                 {
66                         host = hst;
67                         serv = srv;
68                 }*/
69
70 } // namespace Net
71 } // namespace Msp