diff options
author | Marcin Siodelski <marcin@isc.org> | 2017-01-11 12:15:01 +0100 |
---|---|---|
committer | Marcin Siodelski <marcin@isc.org> | 2017-01-11 12:15:01 +0100 |
commit | f3a43f9cb7e96e0021b16b18fd13b30fbb7dddde (patch) | |
tree | 65bc40159b2181015fba6863d194fa318f04f4e2 /src/lib/asiolink/tcp_socket.h | |
parent | [5099] Implemented HttpListener and other classes. (diff) | |
download | kea-f3a43f9cb7e96e0021b16b18fd13b30fbb7dddde.tar.xz kea-f3a43f9cb7e96e0021b16b18fd13b30fbb7dddde.zip |
[5099] Implemented asyncSend variant without the 2-byte count.
Diffstat (limited to 'src/lib/asiolink/tcp_socket.h')
-rw-r--r-- | src/lib/asiolink/tcp_socket.h | 40 |
1 files changed, 39 insertions, 1 deletions
diff --git a/src/lib/asiolink/tcp_socket.h b/src/lib/asiolink/tcp_socket.h index e47e222318..a97739ddef 100644 --- a/src/lib/asiolink/tcp_socket.h +++ b/src/lib/asiolink/tcp_socket.h @@ -113,6 +113,19 @@ public: virtual void asyncSend(const void* data, size_t length, const IOEndpoint* endpoint, C& callback); + /// \brief Send Asynchronously without count. + /// + /// This variant of the method sends data over the TCP socket without + /// preceding the data with a data count. Eventually, we should migrate + /// the virtual method to not insert the count but there are existing + /// classes using the count. Once this migration is done, the existing + /// virtual method should be replaced by this method. + /// + /// \param data Data to send + /// \param length Length of data to send + /// \param callback Callback object. + void asyncSend(const void* data, size_t length, C& callback); + /// \brief Receive Asynchronously /// /// Calls the underlying socket's async_receive() method to read a packet @@ -249,6 +262,30 @@ TCPSocket<C>::open(const IOEndpoint* endpoint, C& callback) { // an exception if this is the case. template <typename C> void +TCPSocket<C>::asyncSend(const void* data, size_t length, C& callback) +{ + if (socket_.is_open()) { + + try { + send_buffer_.reset(new isc::util::OutputBuffer(length)); + send_buffer_->writeData(data, length); + + // Send the data. + socket_.async_send(boost::asio::buffer(send_buffer_->getData(), + send_buffer_->getLength()), + callback); + } catch (boost::numeric::bad_numeric_cast&) { + isc_throw(BufferTooLarge, + "attempt to send buffer larger than 64kB"); + } + + } else { + isc_throw(SocketNotOpen, + "attempt to send on a TCP socket that is not open"); + } +} + +template <typename C> void TCPSocket<C>::asyncSend(const void* data, size_t length, const IOEndpoint*, C& callback) { @@ -262,7 +299,8 @@ TCPSocket<C>::asyncSend(const void* data, size_t length, uint16_t count = boost::numeric_cast<uint16_t>(length); // Copy data into a buffer preceded by the count field. - send_buffer_.reset(new isc::util::OutputBuffer(length)); + send_buffer_.reset(new isc::util::OutputBuffer(length + 2)); + send_buffer_->writeUint16(count); send_buffer_->writeData(data, length); // ... and send it |