39#ifndef _POSITION_LISTENER_H_
40#define _POSITION_LISTENER_H_
43#include <netinet/in.h>
44#include <sys/socket.h>
47#define SOCKET_TYPE int
48#define SET_SOCKOPT_TYPE void *
49#define SENDTO_TYPE const char *
50#define SOCKET_ERROR -1
84 "Starting position data listener on port " <<
m_Port);
86 m_SocketFD = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
88 throw std::runtime_error(
89 "PositionListener::ListenLoop()::socket()");
96 (SET_SOCKOPT_TYPE) &reuse,
98 throw std::runtime_error(
99 "PositionListener::ListenLoop::setsockopt::reuse");
102 int rx_buffer_size = 1024;
106 (SET_SOCKOPT_TYPE) &rx_buffer_size,
107 sizeof(rx_buffer_size)) == -1)
108 throw std::runtime_error(
109 "PositionListener::ListenLoop()::setsockopt::rcvbuf");
112 struct sockaddr_in dg_addr;
113 memset(&dg_addr, 0,
sizeof(dg_addr));
114 dg_addr.sin_family = AF_INET;
116 dg_addr.sin_addr.s_addr = htonl(INADDR_ANY);
117 dg_addr.sin_port = htons(
m_Port);
120 (
struct sockaddr *) &dg_addr,
121 sizeof(dg_addr)) == -1)
122 throw std::runtime_error(
123 "PositionListener::ListenLoop()::bind");
128 std::vector<char> incoming_buffer(pd.
size() * 2);
131 if (
p_Owner->debugLevel() >= 3)
132 LOG_MSG_INFO(
"Trying to read data from peer");
134 (
char *) incoming_buffer.data(),
135 (
int) incoming_buffer.size(),
139 if (num_bytes_read < 0) {
140 LOG_MSG_ERROR(
"Error reading from UDP port: "
144 if (
p_Owner->debugLevel() >= 3)
145 LOG_MSG_INFO(
"Received " << num_bytes_read
146 <<
" bytes from peer");
149 incoming_buffer.data(), incoming_buffer.size());
151 }
catch (
const std::exception &e) {
153 "Caught exception while reading position data: "
154 << e.what() <<
" - " << std::strerror(errno));
160 "Stopping position data listener on port " <<
m_Port);
161 }
catch (
const std::exception &e) {
162 LOG_MSG_ERROR(
"Caught exception in listening thread: "
163 << e.what() <<
" - " << std::strerror(errno));
181 int ret = select(nfds + 1, &fdset, NULL, NULL, &
m_ReadTimeout);
182 if (ret == SOCKET_ERROR) {
183 LOG_MSG_ERROR(
"Error on select: " << ret);
Definition position_listener.h:64
bool ReadyToRead()
Definition position_listener.h:172
virtual void Run()
Definition position_listener.h:79
virtual ~PositionListener()
Definition position_listener.h:72
SOCKET_TYPE m_SocketFD
Definition position_listener.h:188
timeval m_ReadTimeout
Definition position_listener.h:190
uint16_t m_Port
Definition position_listener.h:192
Owner * p_Owner
Definition position_listener.h:194
PositionListener(Owner *owner, uint16_t port, timeval read_timeout)
Definition position_listener.h:66
Definition stoppable_thread.h:50
bool StopRequested()
Definition stoppable_thread.h:127
Provides the definition of PositionData struct.
Provides the definition of PositionData struct.
Provides a simple C++11 thread the StoppableThread class.
Definition position_data.h:56
constexpr size_t size() const
Definition position_data.h:68
bool deserialize(char *buffer, size_t buffer_size)
Definition position_data.h:100