]> git.tdb.fi Git - libs/net.git/blob - source/socket.h
Hide platform details of Socket behind pimpl
[libs/net.git] / source / socket.h
1 #ifndef MSP_NET_SOCKET_H_
2 #define MSP_NET_SOCKET_H_
3
4 #include <msp/io/eventobject.h>
5 #include <msp/io/handle.h>
6 #include "constants.h"
7 #include "sockaddr.h"
8
9 namespace Msp {
10 namespace Net {
11
12 #ifdef WIN32
13 typedef int socklen_t;
14 #endif
15
16
17 class bad_socket_state: public std::logic_error
18 {
19 public:
20         bad_socket_state(const std::string &w): std::logic_error(w) { }
21         virtual ~bad_socket_state() throw() { }
22 };
23
24
25 class Socket: public IO::EventObject
26 {
27 protected:
28         struct Private;
29
30         Private *priv;
31         bool connected;
32         SockAddr *local_addr;
33         SockAddr *peer_addr;
34
35         Socket(const Private &, const SockAddr &);
36         Socket(Family, int, int);
37 public:
38         ~Socket();
39
40         void set_block(bool);
41         const IO::Handle &get_event_handle();
42
43         bool is_connected() const { return connected; }
44         
45         /** Associates the socket with a local address.  There must be no existing
46         users of the address. */
47         void bind(const SockAddr &);
48
49         /** Connects to a remote address.  Exact semantics depend on the socket
50         type. */
51         virtual int connect(const SockAddr &) = 0;
52
53         void set_timeout(const Time::TimeDelta &);
54         const SockAddr &get_local_address() const;
55         const SockAddr &get_peer_address() const;
56 protected:
57         int set_option(int, int, const void *, socklen_t);
58         int get_option(int, int, void *, socklen_t *) const;
59         unsigned do_write(const char *, unsigned);
60         unsigned do_read(char *, unsigned);
61 };
62
63 } // namespace Net
64 } // namespace Msp
65
66 #endif