summaryrefslogtreecommitdiff
path: root/gr-blocks/lib/tcp_connection.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gr-blocks/lib/tcp_connection.cc')
-rw-r--r--gr-blocks/lib/tcp_connection.cc101
1 files changed, 0 insertions, 101 deletions
diff --git a/gr-blocks/lib/tcp_connection.cc b/gr-blocks/lib/tcp_connection.cc
deleted file mode 100644
index 76f42614e9..0000000000
--- a/gr-blocks/lib/tcp_connection.cc
+++ /dev/null
@@ -1,101 +0,0 @@
-/* -*- c++ -*- */
-/*
- * Copyright 2013 Free Software Foundation, Inc.
- *
- * This file is part of GNU Radio
- *
- * SPDX-License-Identifier: GPL-3.0-or-later
- *
- */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include "tcp_connection.h"
-#include <gnuradio/basic_block.h>
-#include <gnuradio/blocks/pdu.h>
-
-namespace gr {
-namespace blocks {
-
-tcp_connection::sptr tcp_connection::make(boost::asio::io_service& io_service,
- int MTU /*= 10000*/,
- bool no_delay /*=false*/)
-{
- return sptr(new tcp_connection(io_service, MTU, no_delay));
-}
-
-tcp_connection::tcp_connection(boost::asio::io_service& io_service,
- int MTU /*= 10000*/,
- bool no_delay /*=false*/)
- : d_socket(io_service), d_buf(MTU), d_block(NULL), d_no_delay(no_delay)
-{
- try {
- d_socket.set_option(boost::asio::ip::tcp::no_delay(no_delay));
- } catch (...) {
- // Silently ignore failure (socket might be current in accept stage) and try again
- // in 'start'
- }
-}
-
-void tcp_connection::send(pmt::pmt_t vector)
-{
- size_t len = pmt::blob_length(vector);
-
- // Asio async_write() requires the buffer to remain valid until the handler is called.
- auto txbuf = std::make_shared<std::vector<char>>(len);
-
- size_t temp = 0;
- memcpy(txbuf->data(), pmt::uniform_vector_elements(vector, temp), len);
-
- size_t offset = 0;
- while (offset < len) {
- // Limit the size of each write() to the MTU.
- // FIXME: Note that this has the effect of breaking a large PDU into several
- // smaller PDUs, each containing <= MTU bytes. Is this the desired behavior?
- size_t send_len = std::min((len - offset), d_buf.size());
- boost::asio::async_write(
- d_socket,
- boost::asio::buffer(txbuf->data() + offset, send_len),
- [txbuf](const boost::system::error_code& error, size_t bytes_transferred) {});
- offset += send_len;
- }
-}
-
-void tcp_connection::start(gr::basic_block* block)
-{
- d_block = block;
- d_socket.set_option(boost::asio::ip::tcp::no_delay(d_no_delay));
- d_socket.async_read_some(boost::asio::buffer(d_buf),
- boost::bind(&tcp_connection::handle_read,
- this,
- boost::asio::placeholders::error,
- boost::asio::placeholders::bytes_transferred));
-}
-
-void tcp_connection::handle_read(const boost::system::error_code& error,
- size_t bytes_transferred)
-{
- if (!error) {
- if (d_block) {
- pmt::pmt_t vector =
- pmt::init_u8vector(bytes_transferred, (const uint8_t*)&d_buf[0]);
- pmt::pmt_t pdu = pmt::cons(pmt::PMT_NIL, vector);
-
- d_block->message_port_pub(pdu::pdu_port_id(), pdu);
- }
-
- d_socket.async_read_some(
- boost::asio::buffer(d_buf),
- boost::bind(&tcp_connection::handle_read,
- this,
- boost::asio::placeholders::error,
- boost::asio::placeholders::bytes_transferred));
- } else {
- d_socket.shutdown(boost::asio::ip::tcp::socket::shutdown_both);
- d_socket.close();
- }
-}
-} /* namespace blocks */
-} /* namespace gr */