]> git.tdb.fi Git - libs/net.git/commitdiff
Add an overload for resolve that takes host and service separately
authorMikko Rasa <tdb@tdb.fi>
Wed, 10 Aug 2011 17:49:39 +0000 (20:49 +0300)
committerMikko Rasa <tdb@tdb.fi>
Wed, 10 Aug 2011 17:49:39 +0000 (20:49 +0300)
source/resolve.cpp
source/resolve.h

index 6e17a1abb38a1318bfacf8e4b2fa8adf09a58583..e8aad664d3cb5c722f032874352c60c15a5309e9 100644 (file)
@@ -15,40 +15,20 @@ using namespace std;
 namespace Msp {
 namespace Net {
 
-SockAddr *resolve(const string &s, Family family)
+SockAddr *resolve(const string &host, const string &serv, Family family)
 {
-       string host, serv;
-       if(s[0]=='[')
-       {
-               unsigned bracket = s.find(']');
-               host = s.substr(1, bracket-1);
-               unsigned colon = s.find(':', bracket);
-               if(colon!=string::npos)
-                       serv = s.substr(colon+1);
-       }
-       else
-       {
-               unsigned colon = s.find(':');
-               if(colon!=string::npos)
-               {
-                       host = s.substr(0, colon);
-                       serv = s.substr(colon+1);
-               }
-               else
-                       host = s;
-       }
-
+       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;
-               host = string();
+               chost = 0;
        }
 
        addrinfo hints = { flags, family_to_sys(family), 0, 0, 0, 0, 0, 0 };
        addrinfo *res;
-       const char *chost = (host.empty() ? 0 : host.c_str());
-       const char *cserv = (serv.empty() ? 0 : serv.c_str());
+
        int err = getaddrinfo(chost, cserv, &hints, &res);
        if(err==0)
        {
@@ -69,6 +49,32 @@ SockAddr *resolve(const string &s, Family family)
 #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];
index 0afc9adb78257c5a67c640e4665d5cae29f38995..256455fcb18febb08384fd7e6f50e17d35064310 100644 (file)
@@ -9,6 +9,15 @@ namespace Net {
 
 class SockAddr;
 
+/** Resolves host and service names into a socket address.  If host is empty,
+the loopback address will be used.  If host is "*", the wildcard address will
+be used.  If service is empty, a socket address with a null service will be
+returned.  With the IP families, these are not very useful. */
+SockAddr *resolve(const std::string &, const std::string &, Family = UNSPEC);
+
+/** And overload of resolve() that takes host and service as a single string,
+separated by a colon.  If the host part contains colons, such as is the case
+with a numeric IPv6 address, it must be enclosed in brackets. */
 SockAddr *resolve(const std::string &, Family = UNSPEC);
 
 } // namespace Net