]> git.tdb.fi Git - libs/net.git/blobdiff - source/streamsocket.cpp
Add an overload for resolve that takes host and service separately
[libs/net.git] / source / streamsocket.cpp
index 3fa6b9a13daafda29f3cd47f8ee1ef7d01cc3953..8a262454eca173dfcc6ef93f0fcd0d45c10582f7 100644 (file)
@@ -26,47 +26,6 @@ StreamSocket::StreamSocket(Family af, int proto):
        ClientSocket(af, SOCK_STREAM, proto)
 { }
 
-bool StreamSocket::poll_connect(const Time::TimeDelta &timeout)
-{
-       if(!connecting)
-               throw bad_socket_state("not connecting");
-
-       int res = poll(*this, IO::P_OUTPUT, timeout);
-       if(res==-1)
-#ifdef WIN32
-               throw system_error("poll", WSAGetLastError());
-#else
-               throw system_error("poll");
-#endif
-       else if(res>0)
-       {
-               connecting = false;
-
-               int err;
-               socklen_t len = sizeof(int);
-               get_option(SOL_SOCKET, SO_ERROR, &err, &len);
-
-               if(err!=0)
-               {
-                       set_events(IO::P_NONE);
-#ifdef WIN32
-                       throw system_error("connect", WSAGetLastError());
-#else
-                       throw system_error("connect");
-#endif
-               }
-
-#ifdef WIN32
-               WSAEventSelect(priv->handle, *priv->event, FD_READ|FD_CLOSE);
-#endif
-               set_events(IO::P_INPUT);
-
-               connected = true;
-       }
-
-       return connected;
-}
-
 bool StreamSocket::connect(const SockAddr &addr)
 {
        if(connected)
@@ -74,8 +33,8 @@ bool StreamSocket::connect(const SockAddr &addr)
 
        SockAddr::SysAddr sa = addr.to_sys();
 
+       int err = ::connect(priv->handle, reinterpret_cast<sockaddr *>(&sa.addr), sa.size);
 #ifdef WIN32
-       int err = WSAConnect(priv->handle, reinterpret_cast<sockaddr *>(&sa.addr), sa.size, 0, 0, 0, 0);
        if(err==SOCKET_ERROR)
        {
                int err_code = WSAGetLastError();
@@ -89,7 +48,6 @@ bool StreamSocket::connect(const SockAddr &addr)
                        throw system_error("connect", err_code);
        }
 #else
-       int err = ::connect(priv->handle, reinterpret_cast<sockaddr *>(&sa.addr), sa.size);
        if(err==-1)
        {
                if(errno==EINPROGRESS)
@@ -108,7 +66,7 @@ bool StreamSocket::connect(const SockAddr &addr)
        delete local_addr;
        SockAddr::SysAddr lsa;
        getsockname(priv->handle, reinterpret_cast<sockaddr *>(&lsa.addr), &lsa.size);
-       local_addr = SockAddr::from_sys(lsa);
+       local_addr = SockAddr::new_from_sys(lsa);
 
        if(err==0)
        {
@@ -120,6 +78,41 @@ bool StreamSocket::connect(const SockAddr &addr)
        return connected;
 }
 
+bool StreamSocket::poll_connect(const Time::TimeDelta &timeout)
+{
+       if(!connecting)
+               return false;
+
+       IO::PollEvent res = poll(*this, IO::P_OUTPUT, timeout);
+       if(res&IO::P_OUTPUT)
+       {
+               connecting = false;
+
+               int err;
+               socklen_t len = sizeof(int);
+               get_option(SOL_SOCKET, SO_ERROR, &err, &len);
+
+               if(err!=0)
+               {
+                       set_events(IO::P_NONE);
+#ifdef WIN32
+                       throw system_error("connect", WSAGetLastError());
+#else
+                       throw system_error("connect");
+#endif
+               }
+
+#ifdef WIN32
+               WSAEventSelect(priv->handle, *priv->event, FD_READ|FD_CLOSE);
+#endif
+               set_events(IO::P_INPUT);
+
+               connected = true;
+       }
+
+       return connected;
+}
+
 void StreamSocket::on_event(IO::PollEvent ev)
 {
        if((ev&(IO::P_OUTPUT|IO::P_ERROR)) && connecting)
@@ -130,7 +123,13 @@ void StreamSocket::on_event(IO::PollEvent ev)
 
                connecting = false;
                connected = (err==0);
-               signal_connect_finished.emit(err);
+               if(err)
+               {
+                       system_error exc("connect", err);
+                       signal_connect_finished.emit(&exc);
+               }
+               else
+                       signal_connect_finished.emit(0);
 
                if(err!=0)
                {