Goby3 3.2.3
2025.05.13
Loading...
Searching...
No Matches
tcp_client.h
Go to the documentation of this file.
1// Copyright 2019-2021:
2// GobySoft, LLC (2013-)
3// Community contributors (see AUTHORS file)
4// File authors:
5// Toby Schneider <toby@gobysoft.org>
6//
7//
8// This file is part of the Goby Underwater Autonomy Project Libraries
9// ("The Goby Libraries").
10//
11// The Goby Libraries are free software: you can redistribute them and/or modify
12// them under the terms of the GNU Lesser General Public License as published by
13// the Free Software Foundation, either version 2.1 of the License, or
14// (at your option) any later version.
15//
16// The Goby Libraries are distributed in the hope that they will be useful,
17// but WITHOUT ANY WARRANTY; without even the implied warranty of
18// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19// GNU Lesser General Public License for more details.
20//
21// You should have received a copy of the GNU Lesser General Public License
22// along with Goby. If not, see <http://www.gnu.org/licenses/>.
23
24#ifndef GOBY_MIDDLEWARE_IO_LINE_BASED_TCP_CLIENT_H
25#define GOBY_MIDDLEWARE_IO_LINE_BASED_TCP_CLIENT_H
26
27#include <istream> // for istream
28#include <memory> // for make_shared
29#include <string> // for basic_st...
30
31#include <boost/asio/read_until.hpp> // for async_re...
32#include <boost/asio/streambuf.hpp> // for streambuf
33#include <boost/system/error_code.hpp> // for error_code
34
35#include "goby/middleware/io/detail/io_interface.h" // for PubSubLayer
36#include "goby/middleware/io/detail/tcp_client_interface.h" // for TCPClien...
37#include "goby/middleware/io/line_based/common.h" // for match_regex
38#include "goby/middleware/protobuf/io.pb.h" // for IOData
39
40namespace goby
41{
42namespace middleware
43{
44class Group;
45}
46} // namespace goby
47namespace goby
48{
49namespace middleware
50{
51namespace protobuf
52{
53class TCPClientConfig;
54}
55} // namespace middleware
56} // namespace goby
57
58namespace goby
59{
60namespace middleware
61{
62namespace io
63{
67template <const goby::middleware::Group& line_in_group,
68 const goby::middleware::Group& line_out_group,
70 PubSubLayer subscribe_layer = PubSubLayer::INTERTHREAD,
72 template <class> class ThreadType = goby::middleware::SimpleThread,
73 bool use_indexed_groups = false>
75 : public detail::TCPClientThread<line_in_group, line_out_group, publish_layer, subscribe_layer,
76 Config, ThreadType, use_indexed_groups>
77{
78 using Base = detail::TCPClientThread<line_in_group, line_out_group, publish_layer,
79 subscribe_layer, Config, ThreadType, use_indexed_groups>;
80
81 public:
86 int index = -1)
87 : Base(config, index), eol_matcher_(this->cfg().end_of_line())
88 {
89 }
90
92
93 private:
95 void async_read() override;
96
97 private:
98 match_regex eol_matcher_;
99 boost::asio::streambuf buffer_;
100};
101} // namespace io
102} // namespace middleware
103} // namespace goby
104
105template <const goby::middleware::Group& line_in_group,
106 const goby::middleware::Group& line_out_group,
108 goby::middleware::io::PubSubLayer subscribe_layer, typename Config,
109 template <class> class ThreadType, bool use_indexed_groups>
110void goby::middleware::io::TCPClientThreadLineBased<line_in_group, line_out_group, publish_layer,
111 subscribe_layer, Config, ThreadType,
112 use_indexed_groups>::async_read()
113{
114 boost::asio::async_read_until(
115 this->mutable_socket(), buffer_, eol_matcher_,
116 [this](const boost::system::error_code& ec, std::size_t bytes_transferred) {
117 if (!ec && bytes_transferred > 0)
118 {
119 auto io_msg = std::make_shared<goby::middleware::protobuf::IOData>();
120 auto& bytes = *io_msg->mutable_data();
121 bytes = std::string(bytes_transferred, 0);
122 std::istream is(&buffer_);
123 is.read(&bytes[0], bytes_transferred);
124 this->insert_endpoints(io_msg);
125 this->handle_read_success(bytes_transferred, io_msg);
126 this->async_read();
127 }
128 else
129 {
130 this->handle_read_error(ec);
131 }
132 });
133}
134
135#endif
Class for grouping publications in the Goby middleware. Analogous to "topics" in ROS,...
Definition group.h:60
Implements Thread for a three layer middleware setup ([ intervehicle [ interprocess [ interthread ] ]...
Reads/Writes strings from/to a TCP connection using a line-based (typically ASCII) protocol with a de...
Definition tcp_client.h:77
TCPClientThreadLineBased(const goby::middleware::protobuf::TCPClientConfig &config, int index=-1)
Constructs the thread.
Definition tcp_client.h:85
Provides a matching function object for the boost::asio::async_read_until based on a std::regex.
Definition common.h:53
The global namespace for the Goby project.