22 #ifndef NDN_ASYNC_SOCKET_TRANSPORT_HPP
23 #define NDN_ASYNC_SOCKET_TRANSPORT_HPP
26 #include <boost/bind.hpp>
27 #include <boost/asio.hpp>
28 #include <ndn-cpp/transport/transport.hpp>
29 #include "../c/encoding/element-reader.h"
30 #include "../encoding/element-listener.hpp"
31 #include "../util/dynamic-uint8-vector.hpp"
43 template<
class AsioProtocol>
class AsyncSocketTransport {
52 : ioService_(ioService), socket_(new typename AsioProtocol::socket(ioService)),
55 ndn_ElementReader_initialize(&elementReader_, 0, elementBuffer_.get());
71 (
const typename AsioProtocol::endpoint& endPoint,
72 ElementListener& elementListener,
const Transport::OnConnected& onConnected)
76 ndn_ElementReader_reset(&elementReader_, &elementListener);
78 socket_->async_connect
80 boost::bind(&AsyncSocketTransport::connectHandler,
this, _1, onConnected));
91 send(
const uint8_t *data,
size_t dataLength)
94 throw std::runtime_error
95 (
"AsyncSocketTransport.send: The socket is not connected");
99 boost::system::error_code errorCode;
101 (*socket_, boost::asio::buffer(data, dataLength), errorCode);
102 if (errorCode != boost::system::errc::success)
103 throw std::runtime_error(
"AsyncSocketTransport.send: Error in write");
125 isConnected_ =
false;
134 (
const boost::system::error_code& errorCode,
135 const Transport::OnConnected& onConnected)
137 if (errorCode != boost::system::errc::success)
139 throw std::runtime_error(
"AsyncSocketTransport: Error in async_connect");
144 socket_->async_receive
145 (boost::asio::buffer(receiveBuffer_,
sizeof(receiveBuffer_)), 0,
146 boost::bind(&AsyncSocketTransport::readHandler,
this, _1, _2));
154 readHandler(
const boost::system::error_code& errorCode,
size_t nBytesReceived)
156 if (errorCode != boost::system::errc::success) {
157 if (errorCode == boost::system::errc::operation_canceled)
163 throw std::runtime_error(
"AsyncSocketTransport: Error in async_receive");
167 if ((error = ndn_ElementReader_onReceivedData
168 (&elementReader_, receiveBuffer_, nBytesReceived)))
169 throw std::runtime_error(ndn_getErrorString(error));
172 socket_->async_receive
173 (boost::asio::buffer(receiveBuffer_,
sizeof(receiveBuffer_)), 0,
174 boost::bind(&AsyncSocketTransport::readHandler,
this, _1, _2));
177 boost::asio::io_service& ioService_;
178 ptr_lib::shared_ptr<typename AsioProtocol::socket> socket_;
179 uint8_t receiveBuffer_[MAX_NDN_PACKET_SIZE];
180 ptr_lib::shared_ptr<DynamicUInt8Vector> elementBuffer_;
Copyright (C) 2013-2016 Regents of the University of California.
Definition: common.hpp:35
An ElementListener extends an ndn_ElementListener struct to proved an abstract virtual onReceivedElem...
Definition: element-listener.hpp:33
void connect(const typename AsioProtocol::endpoint &endPoint, ElementListener &elementListener, const Transport::OnConnected &onConnected)
Connect according to the info in connectionInfo, and use elementListener.
Definition: async-socket-transport.hpp:71
void close()
Close the connection to the host.
Definition: async-socket-transport.hpp:116
void send(const uint8_t *data, size_t dataLength)
Set data to the host.
Definition: async-socket-transport.hpp:91
AsyncSocketTransport(boost::asio::io_service &ioService)
Create an AsyncSocketTransport in the unconnected state.
Definition: async-socket-transport.hpp:51
A DynamicUInt8Vector extends ndn_DynamicUInt8Array to hold a shared_ptr > for use wit...
Definition: dynamic-uint8-vector.hpp:37
A ndn_ElementReader lets you call ndn_ElementReader_onReceivedData multiple times which uses an ndn_T...
Definition: element-reader-types.h:59