summaryrefslogtreecommitdiffstats
path: root/src/lib/asiolink/tcp_socket.h
diff options
context:
space:
mode:
authorMarcin Siodelski <marcin@isc.org>2017-01-11 12:15:01 +0100
committerMarcin Siodelski <marcin@isc.org>2017-01-11 12:15:01 +0100
commitf3a43f9cb7e96e0021b16b18fd13b30fbb7dddde (patch)
tree65bc40159b2181015fba6863d194fa318f04f4e2 /src/lib/asiolink/tcp_socket.h
parent[5099] Implemented HttpListener and other classes. (diff)
downloadkea-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.h40
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