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);
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()
::close(handle);
#endif
handle=MSP_NET_INVALID_SOCKET_HANDLE;
+ connected=false;
signal_closed.emit();
delete local_addr;
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)
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;
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)
{