2012-05-26 4 views
6

Кажется, проблема у многих людей, но все ответы, которые я нашел до сих пор, не помогли.Прослушивание udp-трансляции с помощью библиотеки ускорения

Проблема: Я пытаюсь слушать Velodyne HDL32, который посылает свои пакеты через UDP на моем компьютере. ОС - это 32-разрядная библиотека Ubuntu и Boost v1.46.

данные я получаю с помощью Wireshark выглядит следующим образом:

Time  | Source   | Destination | Protocol | Length | Source Port | Destination Port 
0.000000 | 192.168.17.212 | 192.168.3.255 | UDP  | 1248 | https  | opentable 

Но с этим кодом, никаких данных не показал мне (порт правильно):

receiver(boost::asio::io_service& io_service, 
    const boost::asio::ip::address& listen_address) 
: m_socket(io_service) 
{ 

boost::asio::ip::address ipAddr = boost::asio::ip::address_v4::any(); 
boost::asio::ip::udp::endpoint listen_endpoint(
     ipAddr, 2368); 

m_socket.open(listen_endpoint.protocol()); 
m_socket.bind(listen_endpoint); 

m_socket.async_receive_from(
    boost::asio::buffer(m_data, max_length), m_sender_endpoint, 
    boost::bind(&receiver::handle_receive_from, this, 
     boost::asio::placeholders::error, 
     boost::asio::placeholders::bytes_transferred)); 
} 

void handle_receive_from(const boost::system::error_code& error, 
    size_t bytes_recvd) 
{ 
std::cout << "receive" << bytes_recvd << std::endl; 


    m_socket.async_receive_from(
     boost::asio::buffer(m_data, max_length), m_sender_endpoint, 
     boost::bind(&receiver::handle_receive_from, this, 
     boost::asio::placeholders::error, 
     boost::asio::placeholders::bytes_transferred)); 
} 

Можно ли определить проблему или вам нужна дополнительная информация? Я ценю любую помощь, которую я могу получить.

ПРИМЕЧАНИЕ: Я НЕ запускаю программу с привилегиями root!

Некоторые мысли: Может быть возможно, что повышение :: ASIO :: IP :: address_v4 :: любой() не будет слушать IP .. *. 255 когда есть подсетьмаска 255.255.255.0?

При использовании netcat данные не отображаются. Когда я использую Windows netcat, он работает отлично. То же самое с Wireshark в Linux и Windows - отлично работает. Пробовал это также, но с тем же эффектом - никаких данных.

+0

Действительно ли приложение отправляет вам многоадресные данные? Если это так, попробуйте без привязки к конечной точке прослушивания. – Chad

+0

Вы назвали io_service :: run()? Вы только показали фрагмент своего кода, поэтому я должен спросить. – Sean

+0

@Sean io_service.run() вызывается в основной функции. Программа работает нормально при получении данных на конкретном IP-адресе и конкретном порту. Но никакие данные не получены, когда я пытаюсь прослушать широковещательную передачу. –

ответ

2

Спасибо всем, что вы пытаетесь мне помочь. Код был в порядке, но проблема была в стороне от velodyne и сети с ним.

Объяснение для всех тех, кто пытается работать с Velodyne:

Velodyne имеет собственную подсеть (192.168.17.x). Все записанные данные теперь отправляются в подсеть 192.168.3.x по широковещательной передаче. При нормальных обстоятельствах данные должны быть получены на всех IP-адресах в этой подсети, но это кажется невозможным. Единственным IP-адресом, который вы можете получить, является IP 255, и только если вы используете одно из этих двух решений. (или использовать окно или дамп файл с Wireshark)

1. Глупо, но рабочим раствором

Установите ворота 192.168.3.1. Да нет, но это не имеет значения. С этого момента, который вы будете получать данные по IP 255.

2. Очищенный раствор

Установить новый маршрут, который ведет весь трафик из подсети Velodyne в 192.168.3.x. подсети

Я действительно не знаю, почему это так усложняется, но нам потребовалось некоторое время, чтобы открыть этот «секрет». Надеюсь, некоторые из вас получат прибыль от нашей кропотливой работы.

0

Вы пробовали установить параметр широковещания?

// do this before binding 
boost::asio::socket_base::broadcast option(true); 
m_socket.set_option(option); 
+0

thx BatchyX для ответа, но когда я посмотрел этот параметр, он сказал: «Опция сокета, позволяющая отправлять широковещательные сообщения». Но мне нужно получить данные, чтобы не отправлять их. –

+0

Для меня исходный код говорит, что он включает SO_BROADCAST, который необходим на linux для приема широковещательных данных. – BatchyX

Смежные вопросы