From bd37a64260451bba86bf226913d60f750ca8782e Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Mon, 11 Jun 2018 00:05:07 +0200 Subject: [PATCH 1/3] Fix RTCM server Replace private member name from io_service to io_context, remove socket as private member in Tcp_Server class Improve messages printed in terminal --- src/core/system_parameters/rtcm.cc | 12 +++---- src/core/system_parameters/rtcm.h | 51 +++++++++++++++++++----------- 2 files changed, 38 insertions(+), 25 deletions(-) diff --git a/src/core/system_parameters/rtcm.cc b/src/core/system_parameters/rtcm.cc index 6fb5666bf..b255b5fb9 100644 --- a/src/core/system_parameters/rtcm.cc +++ b/src/core/system_parameters/rtcm.cc @@ -53,7 +53,7 @@ Rtcm::Rtcm(unsigned short port) reserved_field = std::bitset<6>("000000"); rtcm_message_queue = std::make_shared >(); boost::asio::ip::tcp::endpoint endpoint(boost::asio::ip::tcp::v4(), RTCM_port); - servers.emplace_back(io_service, endpoint); + servers.emplace_back(io_context, endpoint); server_is_running = false; } @@ -85,13 +85,13 @@ Rtcm::~Rtcm() // ***************************************************************************************************** void Rtcm::run_server() { - std::cout << "Starting a TCP Server on port " << RTCM_port << std::endl; + std::cout << "Starting a TCP/IP server of RTCM messages on port " << RTCM_port << std::endl; try { - std::thread tq([&] { std::make_shared(io_service, rtcm_message_queue, RTCM_port)->do_read_queue(); }); + std::thread tq([&] { std::make_shared(io_context, rtcm_message_queue, RTCM_port)->do_read_queue(); }); tq.detach(); - std::thread t([&] { io_service.run(); }); + std::thread t([&] { io_context.run(); }); server_is_running = true; t.detach(); } @@ -104,13 +104,13 @@ void Rtcm::run_server() void Rtcm::stop_service() { - io_service.stop(); + io_context.stop(); } void Rtcm::stop_server() { - std::cout << "Stopping TCP Server on port " << RTCM_port << std::endl; + std::cout << "Stopping TCP/IP server on port " << RTCM_port << std::endl; rtcm_message_queue->push("Goodbye"); // this terminates tq Rtcm::stop_service(); servers.front().close_server(); diff --git a/src/core/system_parameters/rtcm.h b/src/core/system_parameters/rtcm.h index 703d6a065..4cb7ff9df 100644 --- a/src/core/system_parameters/rtcm.h +++ b/src/core/system_parameters/rtcm.h @@ -749,21 +749,21 @@ private: : public std::enable_shared_from_this { public: - Tcp_Internal_Client(boost::asio::io_service& io_service, + Tcp_Internal_Client(boost::asio::io_service& io_context, boost::asio::ip::tcp::resolver::iterator endpoint_iterator) - : io_service_(io_service), socket_(io_service) + : io_context_(io_context), socket_(io_context) { do_connect(endpoint_iterator); } inline void close() { - io_service_.post([this]() { socket_.close(); }); + io_context_.post([this]() { socket_.close(); }); } inline void write(const Rtcm_Message& msg) { - io_service_.post( + io_context_.post( [this, msg]() { bool write_in_progress = !write_msgs_.empty(); write_msgs_.push_back(msg); @@ -827,7 +827,7 @@ private: }); } - boost::asio::io_service& io_service_; + boost::asio::io_service& io_context_; boost::asio::ip::tcp::socket socket_; Rtcm_Message read_msg_; std::deque write_msgs_; @@ -837,13 +837,13 @@ private: class Queue_Reader { public: - Queue_Reader(boost::asio::io_service& io_service, std::shared_ptr >& queue, int port) : queue_(queue) + Queue_Reader(boost::asio::io_service& io_context, std::shared_ptr >& queue, int port) : queue_(queue) { - boost::asio::ip::tcp::resolver resolver(io_service); + boost::asio::ip::tcp::resolver resolver(io_context); std::string host("localhost"); std::string port_str = std::to_string(port); auto queue_endpoint_iterator = resolver.resolve({host.c_str(), port_str.c_str()}); - c = std::make_shared(io_service, queue_endpoint_iterator); + c = std::make_shared(io_context, queue_endpoint_iterator); } inline void do_read_queue() @@ -871,8 +871,8 @@ private: class Tcp_Server { public: - Tcp_Server(boost::asio::io_service& io_service, const boost::asio::ip::tcp::endpoint& endpoint) - : acceptor_(io_service), socket_(io_service) + Tcp_Server(boost::asio::io_service& io_context, const boost::asio::ip::tcp::endpoint& endpoint) + : acceptor_(io_context) { acceptor_.open(endpoint.protocol()); acceptor_.set_option(boost::asio::ip::tcp::acceptor::reuse_address(true)); @@ -883,44 +883,57 @@ private: inline void close_server() { - socket_.close(); acceptor_.close(); } private: inline void do_accept() { - acceptor_.async_accept(socket_, [this](boost::system::error_code ec) { + acceptor_.async_accept([this](boost::system::error_code ec, boost::asio::ip::tcp::socket socket_) { if (!ec) { if (first_client) { - std::cout << "The TCP Server is up and running. Accepting connections ..." << std::endl; + std::cout << "The TCP/IP server of RTCM messages is up and running. Accepting connections ..." << std::endl; first_client = false; } else { - std::cout << "Starting RTCM TCP server session..." << std::endl; - std::cout << "Serving client from " << socket_.remote_endpoint().address() << std::endl; - LOG(INFO) << "Serving client from " << socket_.remote_endpoint().address(); + std::cout << "Starting RTCM TCP/IP server session..." << std::endl; + boost::system::error_code ec2; + boost::asio::ip::tcp::endpoint endpoint = socket_.remote_endpoint(ec2); + if (ec2) + { + // Error creating remote_endpoint + std::cout << "Error getting remote IP address, closing session." << std::endl; + LOG(INFO) << "Error getting remote IP address"; + start_session = false; + } + else + { + std::string remote_addr = endpoint.address().to_string(); + std::cout << "Serving client from " << remote_addr << std::endl; + LOG(INFO) << "Serving client from " << remote_addr; + } } - std::make_shared(std::move(socket_), room_)->start(); + if (start_session) std::make_shared(std::move(socket_), room_)->start(); } else { std::cout << "Error when invoking a RTCM session. " << ec << std::endl; } + start_session = true; do_accept(); }); } boost::asio::ip::tcp::acceptor acceptor_; - boost::asio::ip::tcp::socket socket_; Rtcm_Listener_Room room_; bool first_client = true; + bool start_session = true; }; - boost::asio::io_service io_service; + boost::asio::io_service io_context; std::shared_ptr > rtcm_message_queue; std::thread t; std::thread tq; From f10ea80c6199678218bdb4357c9ccf809c4d1d2e Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Mon, 11 Jun 2018 11:00:08 +0200 Subject: [PATCH 2/3] More fixes for the RTCM server --- src/core/system_parameters/rtcm.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/core/system_parameters/rtcm.h b/src/core/system_parameters/rtcm.h index 4cb7ff9df..c30c2b76a 100644 --- a/src/core/system_parameters/rtcm.h +++ b/src/core/system_parameters/rtcm.h @@ -677,10 +677,10 @@ private: { if (first == true) { - std::cout << "Client from " << socket_.remote_endpoint().address() << " says "; + LOG(INFO) << "Client says:"; first = false; } - std::cout << client_says.substr(0, 80) << std::endl; + LOG(INFO) << client_says; client_says = client_says.substr(80, client_says.length() - 80); } do_read_message_header(); From 36ac696a4612906583945adc8d74428558d0f38a Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Mon, 11 Jun 2018 11:13:02 +0200 Subject: [PATCH 3/3] More fixes --- src/core/system_parameters/rtcm.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/core/system_parameters/rtcm.h b/src/core/system_parameters/rtcm.h index c30c2b76a..d97ed6e24 100644 --- a/src/core/system_parameters/rtcm.h +++ b/src/core/system_parameters/rtcm.h @@ -872,7 +872,7 @@ private: { public: Tcp_Server(boost::asio::io_service& io_context, const boost::asio::ip::tcp::endpoint& endpoint) - : acceptor_(io_context) + : acceptor_(io_context), socket_(io_context) { acceptor_.open(endpoint.protocol()); acceptor_.set_option(boost::asio::ip::tcp::acceptor::reuse_address(true)); @@ -883,13 +883,14 @@ private: inline void close_server() { + socket_.close(); acceptor_.close(); } private: inline void do_accept() { - acceptor_.async_accept([this](boost::system::error_code ec, boost::asio::ip::tcp::socket socket_) { + acceptor_.async_accept(socket_, [this](boost::system::error_code ec) { if (!ec) { if (first_client) @@ -928,6 +929,7 @@ private: } boost::asio::ip::tcp::acceptor acceptor_; + boost::asio::ip::tcp::socket socket_; Rtcm_Listener_Room room_; bool first_client = true; bool start_session = true;