OpenSDN source code
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
usock_server.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2016 Juniper Networks, Inc. All rights reserved.
3  */
4 
5 /*
6  * Implement a UNIX domain socket interface using boost::asio.
7  */
8 #ifndef SRC_IO_USOCK_SERVER_H_
9 #define SRC_IO_USOCK_SERVER_H_
10 
11 #include <cstdio>
12 #include <iostream>
13 #include <list>
14 #include <string>
15 #include <boost/array.hpp>
16 #include <boost/bind.hpp>
17 #include <boost/enable_shared_from_this.hpp>
18 #include <boost/shared_ptr.hpp>
19 #include <boost/asio.hpp>
20 #include <boost/function.hpp>
21 
22 #if defined(BOOST_ASIO_HAS_LOCAL_SOCKETS)
23 
24 class UnixDomainSocketSession :
25 public boost::enable_shared_from_this<UnixDomainSocketSession> {
26 public:
27  static const int kPDULen = 4096;
28  static const int kPDUHeaderLen = 4;
29  static const int kPDUDataLen = 4092;
30 
31  enum Event {
32  EVENT_NONE,
33  READY,
34  CLOSE
35  };
36 
37  typedef boost::function <void (UnixDomainSocketSession *, Event)>
38  EventObserver;
39 
40  explicit UnixDomainSocketSession(boost::asio::io_context *io_service)
41  : socket_(*io_service), session_id_(0) {
42  }
43 
44  ~UnixDomainSocketSession();
45 
46  boost::asio::local::stream_protocol::socket &socket() {
47  return socket_;
48  }
49 
50  void set_observer(EventObserver observer) { observer_ = observer; }
51  uint64_t session_id() { return session_id_; }
52  void set_session_id(uint64_t id) { session_id_ = id; }
53  void Start();
54  void Send(const uint8_t * data, int data_len);
55 
56 private:
57  typedef std::list <boost::asio::mutable_buffer> BufferQueue;
58 
59  void WriteToSocket();
60  void AppendBuffer(const uint8_t * data, int len);
61  void DeleteBuffer(boost::asio::mutable_buffer);
62  void HandleRead(const boost::system::error_code & error, size_t bytes);
63  void HandleWrite(const boost::system::error_code & error);
64 
65  boost::asio::local::stream_protocol::socket socket_;
66  BufferQueue buffer_queue_;
67  uint8_t data_[kPDULen];
68  EventObserver observer_;
69  uint64_t session_id_;
70 };
71 
72 typedef boost::shared_ptr <UnixDomainSocketSession> SessionPtr;
73 
74 class UnixDomainSocketServer {
75 public:
76  enum Event {
77  EVENT_NONE,
78  NEW_SESSION,
79  DELETE_SESSION
80  };
81 
82  typedef boost::function <void (UnixDomainSocketServer *,
83  UnixDomainSocketSession *, Event) >
84  EventObserver;
85 
86  UnixDomainSocketServer(boost::asio::io_context *io_service,
87  const std::string &file);
88 
89  void HandleAccept(SessionPtr new_session,
90  const boost::system::error_code &error);
91 
92  void set_observer(EventObserver observer) { observer_ = observer; }
93 
94 private:
95  boost::asio::io_context *io_service_;
96  EventObserver observer_;
97  boost::asio::local::stream_protocol::acceptor acceptor_;
98  uint64_t session_idspace_;
99 };
100 
101 #else // defined(BOOST_ASIO_HAS_LOCAL_SOCKETS)
102 #error Local sockets not available on this platform.
103 #endif // defined(BOOST_ASIO_HAS_LOCAL_SOCKETS)
104 
105 #endif // SRC_IO_USOCK_SERVER_H_
Event
Definition: http_client.h:27