X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fnet%2Fstreamsocket.cpp;h=9e2d79afe7e1b27dd87d81c5a6b2f7db2f6103b6;hb=HEAD;hp=1dab2e3aba39ebbcc77bbb5b7927ddcc7f7b654a;hpb=dd8b0e7471bb85d26cc63da2f0819ceeff30550f;p=libs%2Fnet.git diff --git a/source/net/streamsocket.cpp b/source/net/streamsocket.cpp index 1dab2e3..9e2d79a 100644 --- a/source/net/streamsocket.cpp +++ b/source/net/streamsocket.cpp @@ -1,16 +1,11 @@ -#ifdef WIN32 -#include -#else -#include -#endif -#include +#include "platform_api.h" +#include "streamsocket.h" #include #include #include #include #include "sockaddr_private.h" #include "socket_private.h" -#include "streamsocket.h" namespace Msp { namespace Net { @@ -18,10 +13,7 @@ namespace Net { StreamSocket::StreamSocket(const Private &p, const SockAddr &paddr): ClientSocket(p, paddr) { -#ifdef WIN32 - WSAEventSelect(priv->handle, *priv->event, FD_READ|FD_CLOSE); -#endif - set_events(IO::P_INPUT); + set_socket_events(S_INPUT); } StreamSocket::StreamSocket(Family af, int proto): @@ -34,46 +26,24 @@ bool StreamSocket::connect(const SockAddr &addr) throw bad_socket_state("already connected"); SockAddr::SysAddr sa = addr.to_sys(); - - int err = ::connect(priv->handle, reinterpret_cast(&sa.addr), sa.size); -#ifdef WIN32 - if(err==SOCKET_ERROR) + int err = ::connect(priv->handle, reinterpret_cast(&sa.addr), sa.size); + bool finished = check_sys_connect_error(err); + if(!finished) { - int err_code = WSAGetLastError(); - if(err_code==WSAEWOULDBLOCK) - { - connecting = true; - WSAEventSelect(priv->handle, *priv->event, FD_CONNECT); - set_events(IO::P_OUTPUT); - } - else - throw system_error("connect", err_code); + connecting = true; + set_socket_events(S_CONNECT); } -#else - if(err==-1) - { - if(errno==EINPROGRESS) - { - connecting = true; - set_events(IO::P_OUTPUT); - } - else - throw system_error("connect"); - } -#endif - delete peer_addr; - peer_addr = addr.copy(); + peer_addr.reset(addr.copy()); - delete local_addr; SockAddr::SysAddr lsa; getsockname(priv->handle, reinterpret_cast(&lsa.addr), &lsa.size); - local_addr = SockAddr::new_from_sys(lsa); + local_addr.reset(SockAddr::new_from_sys(lsa)); - if(err==0) + if(finished) { connected = true; - set_events(IO::P_INPUT); + set_socket_events(S_INPUT); signal_connect_finished.emit(0); } @@ -96,18 +66,11 @@ bool StreamSocket::poll_connect(const Time::TimeDelta &timeout) if(err!=0) { - set_events(IO::P_NONE); -#ifdef WIN32 - throw system_error("connect", WSAGetLastError()); -#else - throw system_error("connect"); -#endif + set_socket_events(S_NONE); + throw system_error("connect", err); } -#ifdef WIN32 - WSAEventSelect(priv->handle, *priv->event, FD_READ|FD_CLOSE); -#endif - set_events(IO::P_INPUT); + set_socket_events(S_INPUT); connected = true; } @@ -134,15 +97,9 @@ void StreamSocket::on_event(IO::PollEvent ev) signal_connect_finished.emit(0); if(err!=0) - { - delete peer_addr; - peer_addr = 0; - } + peer_addr.reset(); -#ifdef WIN32 - WSAEventSelect(priv->handle, *priv->event, FD_READ|FD_CLOSE); -#endif - set_events((err==0) ? IO::P_INPUT : IO::P_NONE); + set_socket_events((err==0) ? S_INPUT : S_NONE); } }