#ifndef WIN32
-#include <errno.h>
+#include <cerrno>
#include <fcntl.h>
#include <sys/socket.h>
#endif
Socket::~Socket()
{
- close();
+ signal_flush_required.emit();
+#ifdef WIN32
+ closesocket(handle);
+ CloseHandle(event);
+#else
+ ::close(handle);
+#endif
+
+ delete local_addr;
+ delete peer_addr;
}
void Socket::set_block(bool b)
void Socket::bind(const SockAddr &addr)
{
- check_state(false);
-
sockaddr_storage sa;
unsigned size = addr.fill_sockaddr(sa);
local_addr = addr.copy();
}
-void Socket::close()
-{
- if(handle==MSP_NET_INVALID_SOCKET_HANDLE)
- return;
-
- set_events(IO::P_NONE);
-
- signal_flush_required.emit();
-#ifdef WIN32
- closesocket(handle);
- CloseHandle(event);
-#else
- ::close(handle);
-#endif
- handle = MSP_NET_INVALID_SOCKET_HANDLE;
- connected = false;
- signal_closed.emit();
-
- delete local_addr;
- local_addr = 0;
- delete peer_addr;
- peer_addr = 0;
-}
-
void Socket::set_timeout(const Time::TimeDelta &timeout)
{
#ifndef WIN32
return *peer_addr;
}
-void Socket::check_state(bool conn) const
-{
- if(handle==MSP_NET_INVALID_SOCKET_HANDLE)
- throw bad_socket_state("socket is closed");
- if(conn && !connected)
- throw bad_socket_state("not connected");
-}
-
int Socket::set_option(int level, int optname, const void *optval, socklen_t optlen)
{
#ifdef WIN32
unsigned Socket::do_write(const char *buf, unsigned size)
{
- check_state(true);
+ if(!connected)
+ throw bad_socket_state("not connected");
if(size==0)
return 0;
unsigned Socket::do_read(char *buf, unsigned size)
{
- check_state(true);
+ if(!connected)
+ throw bad_socket_state("not connected");
+
if(size==0)
return 0;