udp_server.cpp
Go to the documentation of this file.
1 /*
2 * Unpublished Copyright (c) 2009-2021 AutonomouStuff, LLC, All Rights Reserved.
3 *
4 * This file is part of the network_interface ROS 1.0 driver which is released under the MIT license.
5 * See file LICENSE included with this software or go to https://opensource.org/licenses/MIT for full license details.
6 */
7 
9 
10 #include <string>
11 #include <vector>
12 
13 using namespace AS::Network; // NOLINT
14 using boost::asio::ip::udp;
15 
17  socket_(io_service_)
18 {
19 }
20 
21 ReturnStatuses UDPServer::open(const std::string& ip_address, uint32_t port)
22 {
23  if (socket_.is_open())
24  {
25  return ReturnStatuses::OK;
26  }
27 
28  std::stringstream sPort;
29  sPort << port;
30  udp::resolver res(io_service_);
31  udp::resolver::query query(udp::v4(), ip_address.c_str(), sPort.str());
32  server_endpoint_ = *res.resolve(query);
33  boost::system::error_code ec;
34 
35  socket_.open(boost::asio::ip::udp::v4(), ec);
36  socket_.bind(server_endpoint_, ec);
37 
38  if (ec.value() == boost::system::errc::success)
39  {
40  return ReturnStatuses::OK;
41  }
42  else if (ec.value() == boost::asio::error::invalid_argument)
43  {
45  }
46  else
47  {
48  close();
50  }
51 }
52 
54 {
55  if (!socket_.is_open())
56  {
58  }
59 
60  boost::system::error_code ec;
61  socket_.close(ec);
62 
63  if (ec.value() == boost::system::errc::success)
64  {
65  return ReturnStatuses::OK;
66  }
67  else
68  {
70  }
71 }
72 
74 {
75  return socket_.is_open();
76 }
77 
78 void UDPServer::registerReceiveHandler(std::function<std::vector<uint8_t>(const std::vector<uint8_t>&)> callback)
79 {
80  receive_callback_ = callback;
81  startReceive();
82 }
83 
85 {
86  socket_.async_receive_from(
87  boost::asio::null_buffers(), client_endpoint_,
88  boost::bind(&UDPServer::handleReceive, this,
89  boost::asio::placeholders::error,
90  boost::asio::placeholders::bytes_transferred));
91 }
92 
93 void UDPServer::handleReceive(const boost::system::error_code& error, std::size_t bytes_transferred)
94 {
95  // unused
96  (void)bytes_transferred;
97 
98  if (!error || error == boost::asio::error::message_size)
99  {
100  std::vector<uint8_t> payload;
101  boost::system::error_code ec;
102  uint32_t available = socket_.available();
103  payload.resize(available, 0);
104 
105  socket_.receive_from(boost::asio::buffer(payload, available),
106  client_endpoint_, 0, ec);
107 
108  // User callback
109  std::vector<uint8_t> response = receive_callback_(payload);
110 
111  // Send response
112  if (response.size() > 0)
113  {
114  socket_.async_send_to(boost::asio::buffer(response), client_endpoint_,
115  boost::bind(&UDPServer::handleSend, this, response,
116  boost::asio::placeholders::error,
117  boost::asio::placeholders::bytes_transferred));
118  }
119  else
120  {
121  startReceive();
122  }
123  }
124 }
125 
126 void UDPServer::handleSend(std::vector<uint8_t> sent_payload,
127  const boost::system::error_code& ec, std::size_t bytes_transferred)
128 {
129  // unused
130  (void)sent_payload;
131  (void)ec;
132  (void)bytes_transferred;
133 
134  startReceive();
135 }
136 
138 {
139  io_service_.run();
140 }
141 
143 {
144  io_service_.stop();
145 }
AS::Network::UDPServer::run
void run()
Definition: udp_server.cpp:137
AS::Network::UDPServer::handleReceive
void handleReceive(const boost::system::error_code &error, std::size_t bytes_transferred)
Definition: udp_server.cpp:93
AS::Network::UDPServer::UDPServer
UDPServer()
Definition: udp_server.cpp:16
udp_server.h
AS::Network::UDPServer::stop
void stop()
Definition: udp_server.cpp:142
AS::Network::UDPServer::receive_callback_
std::function< std::vector< uint8_t >const std::vector< uint8_t > &)> receive_callback_
Definition: udp_server.h:70
AS::Network::ReturnStatuses::OK
@ OK
AS::Network::UDPServer::client_endpoint_
boost::asio::ip::udp::endpoint client_endpoint_
Definition: udp_server.h:69
AS::Network::ReturnStatuses::INIT_FAILED
@ INIT_FAILED
AS::Network::UDPServer::registerReceiveHandler
void registerReceiveHandler(std::function< std::vector< uint8_t >(const std::vector< uint8_t > &)> callback)
Definition: udp_server.cpp:78
AS::Network::UDPServer::handleSend
void handleSend(std::vector< uint8_t > sent_payload, const boost::system::error_code &ec, std::size_t bytes_transferred)
Definition: udp_server.cpp:126
AS::Network::UDPServer::is_open
bool is_open()
Definition: udp_server.cpp:73
AS::Network::UDPServer::server_endpoint_
boost::asio::ip::udp::endpoint server_endpoint_
Definition: udp_server.h:68
AS::Network::ReturnStatuses::SOCKET_CLOSED
@ SOCKET_CLOSED
AS::Network::ReturnStatuses::BAD_PARAM
@ BAD_PARAM
AS::Network::UDPServer::open
ReturnStatuses open(const std::string &ip_address, uint32_t port)
Definition: udp_server.cpp:21
AS::Network::UDPServer::close
ReturnStatuses close()
Definition: udp_server.cpp:53
AS::Network::UDPServer::startReceive
void startReceive()
Definition: udp_server.cpp:84
AS::Network
Definition: common.h:13
AS::Network::ReturnStatuses::CLOSE_FAILED
@ CLOSE_FAILED
AS::Network::UDPServer::socket_
boost::asio::ip::udp::socket socket_
Definition: udp_server.h:67
AS::Network::UDPServer::io_service_
boost::asio::io_service io_service_
Definition: udp_server.h:66
AS::Network::ReturnStatuses
ReturnStatuses
Definition: common.h:16


network_interface
Author(s): Joshua Whitley , Daniel Stanek , Joe Kale
autogenerated on Wed Mar 2 2022 00:35:33