]> git.tdb.fi Git - libs/net.git/blob - source/net/socket.h
Add a dynamic receiver class for more flexible packet handling
[libs/net.git] / source / net / socket.h
1 #ifndef MSP_NET_SOCKET_H_
2 #define MSP_NET_SOCKET_H_
3
4 #include <memory>
5 #include <msp/core/except.h>
6 #include <msp/io/eventobject.h>
7 #include <msp/io/handle.h>
8 #include "mspnet_api.h"
9 #include "sockaddr.h"
10
11 namespace Msp {
12 namespace Net {
13
14 class MSPNET_API bad_socket_state: public invalid_state
15 {
16 public:
17         bad_socket_state(const std::string &w): invalid_state(w) { }
18 };
19
20
21 class MSPNET_API Socket: public IO::EventObject
22 {
23 protected:
24         enum SocketEvent
25         {
26                 S_NONE = IO::P_NONE,
27                 S_INPUT = IO::P_INPUT,
28                 S_CONNECT = 4096,
29                 S_ACCEPT = 8192
30         };
31
32         struct Private;
33
34         std::unique_ptr<Private> priv;
35         std::unique_ptr<SockAddr> local_addr;
36
37         Socket(const Private &);
38         Socket(Family, int, int);
39 private:
40         void platform_init();
41         void platform_cleanup();
42 public:
43         ~Socket();
44
45         void set_block(bool) override;
46         void set_inherit(bool) override;
47         const IO::Handle &get_handle(IO::Mode) override;
48         const IO::Handle &get_event_handle() override;
49
50         /** Associates the socket with a local address.  There must be no existing
51         users of the address. */
52         void bind(const SockAddr &);
53
54         bool is_bound() const { return static_cast<bool>(local_addr); }
55         const SockAddr &get_local_address() const;
56
57         void set_timeout(const Time::TimeDelta &);
58 protected:
59         void set_socket_events(unsigned);
60         void set_platform_events(unsigned);
61 };
62
63 } // namespace Net
64 } // namespace Msp
65
66 #endif