]> git.tdb.fi Git - libs/net.git/blobdiff - source/socket.h
Add ClientSocket and ServerSocket abstractions
[libs/net.git] / source / socket.h
index f275a7e2b35a0712fd97f78fe6774e226fdce8fe..38d65da40da560ba3443d81d561cd38df71cea24 100644 (file)
@@ -1,49 +1,52 @@
-/* $Id$
-
-This file is part of libmspnet
-Copyright © 2008  Mikkosoft Productions, Mikko Rasa
-Distributed under the LGPL
-*/
-
 #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
+#ifdef WIN32
+typedef int socklen_t;
+#endif
+
+
+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:
+       struct Private;
+
+       Private *priv;
+       SockAddr *local_addr;
+
+       Socket(const Private &);
+       Socket(Family, int, int);
+public:
+       ~Socket();
+
        void set_block(bool);
-       IO::Handle get_event_handle();
+       const IO::Handle &get_event_handle();
 
-       bool get_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;
-       void close();
+
+       void set_timeout(const Time::TimeDelta &);
        const SockAddr &get_local_address() const;
-       const SockAddr &get_peer_address() const;
-       ~Socket();
 protected:
-       SocketHandle handle;
-#ifdef WIN32
-       IO::Handle event;
-#endif
-       bool       connected;
-       SockAddr   *local_addr;
-       SockAddr   *peer_addr;
-
-       Socket(SocketHandle, const SockAddr &);
-       Socket(Family, int, int);
-       void check_state(bool) const;
-       int get_option(int, int, void *, socklen_t *);
-       unsigned do_write(const char *, unsigned);
-       unsigned do_read(char *, unsigned);
+       int set_option(int, int, const void *, socklen_t);
+       int get_option(int, int, void *, socklen_t *) const;
 };
 
 } // namespace Net