X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fsocket.cpp;h=6db6271a8a2710b01588a7ac9de4fa363cbe1727;hb=02a6ddf010b763c6b08e706bf0c771c0fd250d25;hp=decdbeb9e2fd663c05a7e07819a30bdd0ca6e4bb;hpb=f59eded7c3e162bbdfc6db424c9badc730017698;p=libs%2Fnet.git diff --git a/source/socket.cpp b/source/socket.cpp index decdbeb..6db6271 100644 --- a/source/socket.cpp +++ b/source/socket.cpp @@ -43,6 +43,39 @@ WinSockHelper wsh; namespace Msp { namespace Net { +Socket::Socket(SocketHandle h, const SockAddr &paddr): + handle(h), + connected(true), + local_addr(0), + peer_addr(paddr.copy()) +{ + sockaddr sa; + socklen_t size=sizeof(sockaddr); + getsockname(handle, &sa, &size); + local_addr=SockAddr::create(sa); + +#ifdef WIN32 + event=CreateEvent(0, false, false, 0); +#endif +} + +Socket::Socket(Family af, int type, int proto): + connected(false), + local_addr(0), + peer_addr(0) +{ + handle=socket(af, type, proto); + +#ifdef WIN32 + event=CreateEvent(0, false, false, 0); +#endif +} + +Socket::~Socket() +{ + close(); +} + void Socket::set_block(bool b) { mode=(mode&~IO::M_NONBLOCK); @@ -77,14 +110,14 @@ void Socket::bind(const SockAddr &addr) int err=::bind(handle, &sa, size); if(err==-1) - throw Exception(format("Unable to bind: %s", strerror(errno))); + throw SystemError("Unable to bind", errno); delete local_addr; local_addr=addr.copy(); } /** -Closes the socket. Most operations on the socket will return an error after +Closes the socket. Most operations on the socket will throw an exception after this. */ void Socket::close() @@ -102,6 +135,7 @@ void Socket::close() ::close(handle); #endif handle=MSP_NET_INVALID_SOCKET_HANDLE; + connected=false; signal_closed.emit(); delete local_addr; @@ -124,39 +158,6 @@ const SockAddr &Socket::get_peer_address() const return *peer_addr; } -Socket::~Socket() -{ - close(); -} - -Socket::Socket(SocketHandle h, const SockAddr &paddr): - handle(h), - connected(true), - local_addr(0), - peer_addr(paddr.copy()) -{ - sockaddr sa; - socklen_t size=sizeof(sockaddr); - getsockname(handle, &sa, &size); - local_addr=SockAddr::create(sa); - -#ifdef WIN32 - event=CreateEvent(0, false, false, 0); -#endif -} - -Socket::Socket(Family af, int type, int proto): - connected(false), - local_addr(0), - peer_addr(0) -{ - handle=socket(af, type, proto); - -#ifdef WIN32 - event=CreateEvent(0, false, false, 0); -#endif -} - void Socket::check_state(bool conn) const { if(handle==MSP_NET_INVALID_SOCKET_HANDLE) @@ -187,7 +188,7 @@ unsigned Socket::do_write(const char *buf, unsigned size) if(errno==EAGAIN) return 0; else - throw Exception(format("Writing to socket failed: %s", strerror(errno))); + throw SystemError("Writing to socket failed", errno); } return ret; @@ -206,7 +207,7 @@ unsigned Socket::do_read(char *buf, unsigned size) if(errno==EAGAIN) return 0; else - throw Exception(format("Reading from socket failed: %s", strerror(errno))); + throw SystemError("Reading from socket failed", errno); } else if(ret==0 && !eof_flag) {