X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fstreamsocket.cpp;fp=source%2Fstreamsocket.cpp;h=0000000000000000000000000000000000000000;hb=50e9f9ea7f7385a2c5931fca2b8fb1103078e67c;hp=8a262454eca173dfcc6ef93f0fcd0d45c10582f7;hpb=21c596567e3b6fd794ed6af73d304ce2bc70e58f;p=libs%2Fnet.git diff --git a/source/streamsocket.cpp b/source/streamsocket.cpp deleted file mode 100644 index 8a26245..0000000 --- a/source/streamsocket.cpp +++ /dev/null @@ -1,148 +0,0 @@ -#ifndef WIN32 -#include -#endif -#include -#include -#include -#include -#include -#include "sockaddr_private.h" -#include "socket_private.h" -#include "streamsocket.h" - -namespace Msp { -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); -} - -StreamSocket::StreamSocket(Family af, int proto): - ClientSocket(af, SOCK_STREAM, proto) -{ } - -bool StreamSocket::connect(const SockAddr &addr) -{ - if(connected) - 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_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); - } -#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(); - - delete local_addr; - SockAddr::SysAddr lsa; - getsockname(priv->handle, reinterpret_cast(&lsa.addr), &lsa.size); - local_addr = SockAddr::new_from_sys(lsa); - - if(err==0) - { - connected = true; - set_events(IO::P_INPUT); - signal_connect_finished.emit(0); - } - - 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) - { - int err; - socklen_t len = sizeof(err); - get_option(SOL_SOCKET, SO_ERROR, &err, &len); - - connecting = false; - connected = (err==0); - if(err) - { - system_error exc("connect", err); - signal_connect_finished.emit(&exc); - } - else - signal_connect_finished.emit(0); - - if(err!=0) - { - delete peer_addr; - peer_addr = 0; - } - -#ifdef WIN32 - WSAEventSelect(priv->handle, *priv->event, FD_READ|FD_CLOSE); -#endif - set_events((err==0) ? IO::P_INPUT : IO::P_NONE); - } -} - -} // namespace Net -} // namespace Msp