8 #ifndef SRC_IO_USOCK_SERVER_H_
9 #define SRC_IO_USOCK_SERVER_H_
15 #include <boost/array.hpp>
16 #include <boost/bind/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>
22 using namespace boost::placeholders;
24 #if defined(BOOST_ASIO_HAS_LOCAL_SOCKETS)
26 class UnixDomainSocketSession :
27 public boost::enable_shared_from_this<UnixDomainSocketSession> {
29 static const int kPDULen = 4096;
30 static const int kPDUHeaderLen = 4;
31 static const int kPDUDataLen = 4092;
39 typedef boost::function <void (UnixDomainSocketSession *,
Event)>
42 explicit UnixDomainSocketSession(boost::asio::io_context *io_service)
43 : socket_(*io_service), session_id_(0) {
46 ~UnixDomainSocketSession();
48 boost::asio::local::stream_protocol::socket &socket() {
52 void set_observer(EventObserver observer) { observer_ = observer; }
53 uint64_t session_id() {
return session_id_; }
54 void set_session_id(uint64_t
id) { session_id_ = id; }
56 void Send(
const uint8_t * data,
int data_len);
59 typedef std::list <boost::asio::mutable_buffer> BufferQueue;
62 void AppendBuffer(
const uint8_t * data,
int len);
63 void DeleteBuffer(boost::asio::mutable_buffer);
64 void HandleRead(
const boost::system::error_code & error,
size_t bytes);
65 void HandleWrite(
const boost::system::error_code & error);
67 boost::asio::local::stream_protocol::socket socket_;
68 BufferQueue buffer_queue_;
69 uint8_t data_[kPDULen];
70 EventObserver observer_;
74 typedef boost::shared_ptr <UnixDomainSocketSession> SessionPtr;
76 class UnixDomainSocketServer {
84 typedef boost::function <void (UnixDomainSocketServer *,
85 UnixDomainSocketSession *,
Event) >
88 UnixDomainSocketServer(boost::asio::io_context *io_service,
89 const std::string &file);
91 void HandleAccept(SessionPtr new_session,
92 const boost::system::error_code &error);
94 void set_observer(EventObserver observer) { observer_ = observer; }
97 boost::asio::io_context *io_service_;
98 EventObserver observer_;
99 boost::asio::local::stream_protocol::acceptor acceptor_;
100 uint64_t session_idspace_;
104 #error Local sockets not available on this platform.