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 boost::asio::ip::udp::resolver::query query(boost::asio::ip::udp::v4(),
50 boost::asio::ip::resolver_query_base::passive);
52 endpoint = *resolver.resolve(query);
55 printf(
"cannot resolve host IP %s error: %s\n", host.c_str(),
60 socket =
new boost::asio::ip::udp::socket(io_service);
61 socket->open(endpoint.protocol());
62 boost::asio::socket_base::linger loption(
true, 0);
63 socket->set_option(loption);
64 boost::asio::socket_base::reuse_address roption(
true);
65 socket->set_option(roption);
66 boost::asio::socket_base::receive_buffer_size boption(33554432);
67 socket->set_option(boption);
68 boost::asio::socket_base::receive_buffer_size boption2;
69 socket->get_option(boption2);
70 if (boption2.value()!=33554432) {
71 printf(
"\nCould not set UDP buffer size!\n");
72 printf(
"Please run 'sudo sysctl net.core.rmem_max=50000000'.\n\n");
74 socket->bind(endpoint);
80 VitaIqUdpPort::~VitaIqUdpPort()
91 if (recv_buffer != NULL)
92 delete [] recv_buffer;
95 void VitaIqUdpPort::read_data()
97 int socket_fd, result, num_received;
99 struct timeval timeout;
101 timeout.tv_usec = 100;
103 socket_fd = socket->native_handle();
108 FD_SET(socket_fd, &readset);
109 result = select(socket_fd + 1, &readset, NULL, NULL, &timeout);
110 }
while (result == -1 && errno == EINTR);
114 if (FD_ISSET(socket_fd, &readset))
119 num_received = socket->receive(
121 (
void*)(recv_buffer + bytes_recvd),
122 packet_size - bytes_recvd
125 bytes_recvd += num_received;
127 while ( (num_received != 0) && (bytes_recvd < packet_size));
137 void VitaIqUdpPort::clear_buffer()
139 memset(recv_buffer, 0, packet_size);
143 bool VitaIqUdpPort::is_packet_ready()
const 145 return (bytes_recvd == packet_size);
Defines functionality for LibCyberRadio applications.