From: Marcin Siodelski Date: Wed, 11 Jan 2017 11:15:01 +0000 (+0100) Subject: [5099] Implemented asyncSend variant without the 2-byte count. X-Git-Tag: trac1205_base~3^2~7 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=f3a43f9cb7e96e0021b16b18fd13b30fbb7dddde;p=thirdparty%2Fkea.git [5099] Implemented asyncSend variant without the 2-byte count. --- 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 @@ -248,6 +261,30 @@ TCPSocket::open(const IOEndpoint* endpoint, C& callback) { // Send a message. Should never do this if the socket is not open, so throw // an exception if this is the case. +template void +TCPSocket::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 void TCPSocket::asyncSend(const void* data, size_t length, const IOEndpoint*, C& callback) @@ -262,7 +299,8 @@ TCPSocket::asyncSend(const void* data, size_t length, uint16_t count = boost::numeric_cast(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 diff --git a/src/lib/http/connection.cc b/src/lib/http/connection.cc index 3fca6d9954..7aebb1de3b 100644 --- a/src/lib/http/connection.cc +++ b/src/lib/http/connection.cc @@ -67,9 +67,8 @@ HttpConnection::doRead() { void HttpConnection::doWrite() { if (!output_buf_.empty()) { - TCPEndpoint endpoint; socket_.asyncSend(output_buf_.data(), - output_buf_.length(), &endpoint, + output_buf_.length(), socket_write_callback_); } }