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 <boost/enable_shared_from_this.hpp>
29 #include <ndn-cpp/transport/transport.hpp>
30 #include "../c/encoding/element-reader.h"
31 #include "../encoding/element-listener.hpp"
32 #include "../util/dynamic-uint8-vector.hpp"
53 : impl_(new Impl(ioService))
70 (
const typename AsioProtocol::endpoint& endPoint,
71 ElementListener& elementListener,
const Transport::OnConnected& onConnected)
73 impl_->connect(endPoint, elementListener, onConnected);
84 send(
const uint8_t *data,
size_t dataLength)
86 impl_->send(data, dataLength);
92 return impl_->getIsConnected();
110 class Impl :
public boost::enable_shared_from_this<Impl> {
112 Impl(boost::asio::io_service& ioService)
113 : ioService_(ioService), socket_(new typename AsioProtocol::socket(ioService)),
116 ndn_ElementReader_initialize(&elementReader_, 0, elementBuffer_.get());
131 (
const typename AsioProtocol::endpoint& endPoint,
132 ElementListener& elementListener,
const Transport::OnConnected& onConnected)
136 ndn_ElementReader_reset(&elementReader_, &elementListener);
138 socket_->async_connect
140 boost::bind(&AsyncSocketTransport::Impl::connectHandler,
141 this->shared_from_this(), _1, onConnected));
150 send(
const uint8_t *data,
size_t dataLength)
153 throw std::runtime_error
154 (
"AsyncSocketTransport.send: The socket is not connected");
158 boost::system::error_code errorCode;
160 (*socket_, boost::asio::buffer(data, dataLength), errorCode);
161 if (errorCode != boost::system::errc::success)
162 throw std::runtime_error(
"AsyncSocketTransport.send: Error in write");
184 isConnected_ =
false;
193 (
const boost::system::error_code& errorCode,
194 const Transport::OnConnected& onConnected)
196 if (errorCode != boost::system::errc::success)
198 throw std::runtime_error(
"AsyncSocketTransport: Error in async_connect");
203 socket_->async_receive
204 (boost::asio::buffer(receiveBuffer_,
sizeof(receiveBuffer_)), 0,
205 boost::bind(&AsyncSocketTransport::Impl::readHandler,
206 this->shared_from_this(), _1, _2));
214 readHandler(
const boost::system::error_code& errorCode,
size_t nBytesReceived)
216 if (errorCode != boost::system::errc::success) {
217 if (errorCode == boost::system::errc::operation_canceled)
223 throw std::runtime_error(
"AsyncSocketTransport: Error in async_receive");
227 if ((error = ndn_ElementReader_onReceivedData
228 (&elementReader_, receiveBuffer_, nBytesReceived)))
229 throw std::runtime_error(ndn_getErrorString(error));
232 if (socket_->is_open())
233 socket_->async_receive
234 (boost::asio::buffer(receiveBuffer_,
sizeof(receiveBuffer_)), 0,
235 boost::bind(&AsyncSocketTransport::Impl::readHandler,
236 this->shared_from_this(), _1, _2));
239 boost::asio::io_service& ioService_;
240 boost::shared_ptr<typename AsioProtocol::socket> socket_;
241 uint8_t receiveBuffer_[MAX_NDN_PACKET_SIZE];
242 boost::shared_ptr<DynamicUInt8Vector> elementBuffer_;
247 boost::shared_ptr<Impl> impl_;
AsyncSocketTransport is a helper template class for AsyncTcpTransport and AsyncUnixTransport to imple...
Definition: async-socket-transport.hpp:44
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:70
void close()
Close the connection to the host.
Definition: async-socket-transport.hpp:99
void send(const uint8_t *data, size_t dataLength)
Send data to the host.
Definition: async-socket-transport.hpp:84
AsyncSocketTransport(boost::asio::io_service &ioService)
Create an AsyncSocketTransport in the unconnected state.
Definition: async-socket-transport.hpp:52
A DynamicUInt8Vector extends ndn_DynamicUInt8Array to hold a shared_ptr<vector<uint8_t> > 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