14 #include <LibCyberRadio/Common/VitaIqUdpPort.h> 22 VitaIqUdpPort::VitaIqUdpPort(
const std::string& host,
26 Debuggable(debug,
""),
29 packet_size(packet_size),
36 std::ostringstream oss;
37 oss <<
"VitaIqUdpPort " << port;
38 _debugName = oss.str();
40 recv_buffer =
new unsigned char[packet_size];
41 memset(recv_buffer, 0, packet_size);
43 boost::system::error_code error = boost::asio::error::host_not_found;
44 std::string s_port = (boost::format(
"%d") % port).str();
47 boost::asio::ip::udp::resolver resolver(io_service);
48 auto query = resolver.resolve(boost::asio::ip::udp::v4(),host, s_port, boost::asio::ip::resolver_base::passive);
53 endpoint = *query.begin();
56 printf(
"cannot resolve host IP %s error: %s\n", host.c_str(),
61 socket =
new boost::asio::ip::udp::socket(io_service);
62 socket->open(endpoint.protocol());
63 boost::asio::socket_base::linger loption(
true, 0);
64 socket->set_option(loption);
65 boost::asio::socket_base::reuse_address roption(
true);
66 socket->set_option(roption);
67 boost::asio::socket_base::receive_buffer_size boption(33554432);
68 socket->set_option(boption);
69 boost::asio::socket_base::receive_buffer_size boption2;
70 socket->get_option(boption2);
71 if (boption2.value()!=33554432) {
72 printf(
"\nCould not set UDP buffer size!\n");
73 printf(
"Please run 'sudo sysctl net.core.rmem_max=50000000'.\n\n");
75 socket->bind(endpoint);
81 VitaIqUdpPort::~VitaIqUdpPort()
92 if (recv_buffer != NULL)
93 delete [] recv_buffer;
96 void VitaIqUdpPort::read_data()
98 int socket_fd, result, num_received;
100 struct timeval timeout;
102 timeout.tv_usec = 100;
104 socket_fd = socket->native_handle();
109 FD_SET(socket_fd, &readset);
110 result = select(socket_fd + 1, &readset, NULL, NULL, &timeout);
111 }
while (result == -1 && errno == EINTR);
115 if (FD_ISSET(socket_fd, &readset))
120 num_received = socket->receive(
122 (
void*)(recv_buffer + bytes_recvd),
123 packet_size - bytes_recvd
126 bytes_recvd += num_received;
128 while ( (num_received != 0) && (bytes_recvd < packet_size));
138 void VitaIqUdpPort::clear_buffer()
140 memset(recv_buffer, 0, packet_size);
144 bool VitaIqUdpPort::is_packet_ready()
const 146 return (bytes_recvd == packet_size);
Defines functionality for LibCyberRadio applications.