]> git.tdb.fi Git - libs/net.git/blobdiff - source/socket.h
Don't close socket on Communicator error
[libs/net.git] / source / socket.h
index 1c5efda8d966b48e9eafa31b1d98a2a1ed03f0de..c2c17f07dc2d2f42611bbb818bbf45c920c6c04f 100644 (file)
@@ -1,7 +1,8 @@
 #ifndef MSP_NET_SOCKET_H_
 #define MSP_NET_SOCKET_H_
 
-#include <msp/io/base.h>
+#include <msp/io/eventobject.h>
+#include <msp/io/handle.h>
 #include "constants.h"
 #include "sockaddr.h"
 #include "types.h"
 namespace Msp {
 namespace Net {
 
-class Socket: public IO::Base
+class bad_socket_state: public std::logic_error
+{
+public:
+       bad_socket_state(const std::string &w): std::logic_error(w) { }
+       virtual ~bad_socket_state() throw() { }
+};
+
+
+class Socket: public IO::EventObject
 {
 protected:
        SocketHandle handle;
-#ifdef WIN32
        IO::Handle event;
-#endif
-       bool       connected;
-       SockAddr   *local_addr;
-       SockAddr   *peer_addr;
+       bool connected;
+       SockAddr *local_addr;
+       SockAddr *peer_addr;
 
        Socket(SocketHandle, const SockAddr &);
        Socket(Family, int, int);
@@ -26,12 +33,21 @@ public:
        ~Socket();
 
        void set_block(bool);
-       IO::Handle get_event_handle();
+       const IO::Handle &get_event_handle();
 
        bool is_connected() const { return connected; }
+       
+       /** Associates the socket with a local address.  There must be no existing
+       users of the address. */
        void bind(const SockAddr &);
-       virtual int connect(const SockAddr &) =0;
+
+       /** Connects to a remote address.  Exact semantics depend on the socket
+       type. */
+       virtual int connect(const SockAddr &) = 0;
+
+       /// Closes the socket.  Most operations will throw an exception after this.
        void close();
+
        void set_timeout(const Time::TimeDelta &);
        const SockAddr &get_local_address() const;
        const SockAddr &get_peer_address() const;