Не удалось прослушать порт UDP с boost :: asio - PullRequest
4 голосов
/ 18 февраля 2012

У меня есть сервер, который собирает информацию и транслирует некоторые сообщения по локальной сети. Я использую boost::asio для передачи их через UDP через порт 8079, и я могу проверить с помощью WireShark, что эти пакеты действительно транслируются, как предполагалось.

Теперь, естественно, я хочу связаться со слушателем, который может реагировать на эти сообщения, но я изо всех сил пытаюсь получить что-нибудь. Мой текущий подход:

boost::asio::io_service io_service;
boost::asio::ip::udp::socket socket(io_service);
boost::asio::ip::udp::endpoint local(
    boost::asio::ip::address::from_string("192.168.2.102"),
    8079);
boost::system::error_code error;

std::cout << "Local bind: " << local << std::endl;

socket.open(boost::asio::ip::udp::v4(), error);
if(!error) {
    socket.bind(local);
    boost::array<char, 2048> buf;
    boost::asio::ip::udp::endpoint server;
    std::cout << "Listening..." << std::endl;
    while(true) {
        size_t len = socket.receive_from(boost::asio::buffer(buf), server);
        std::cout << "Received data:" << std::endl;
        std::cout.write(buf.data(), len);
        std::cout << std::endl;
    }
}

Но я никогда ничего не получаю. Используя отладчик, я обнаружил, что просто застрял в receive_from навсегда, и я не знаю почему.

Некоторая дополнительная информация (в основном от Wireshark), о которой я не уверен, может ли это быть причиной следующих проблем: Сервер и клиент работают на одной машине. Сервер отправляет сообщение 88 bytes каждые две секунды с порта 34050 (источник) на 8079 (пункт назначения). 192.168.2.102 - это IP-адрес аппарата в локальной сети.

Ответы [ 2 ]

4 голосов
/ 04 марта 2012

IIRC, вы должны привязаться к INADDR_ANY для получения широковещательных пакетов. В списках сообщений Linux обсуждается эта проблема довольно много. Кроме того, убедитесь, что маска сети совпадает на обоих компьютерах. Если широковещательная рассылка идет на 192.168.255.255, а ваша маска клиента 255.255.255.0, вы не будете получать пакеты.

0 голосов
/ 14 июня 2013

Вы не вызываете io_service :: run в любом потоке, поэтому обработчики завершения никогда не вызываются, даже если данные получены.

...