2016-11-10 2 views
0

У меня возникают проблемы с подразделением вещания udp приложения. Я использую импульс 1.62.0 под окнами 10.udp broadcast using boost :: asio под окнами

void test_udp_broadcast(void) 
{ 
    boost::asio::io_service io_service; 
    boost::asio::ip::udp::socket socket(io_service); 
    boost::asio::ip::udp::endpoint remote_endpoint; 

    socket.open(boost::asio::ip::udp::v4()); 
    socket.set_option(boost::asio::ip::udp::socket::reuse_address(true)); 
    socket.set_option(boost::asio::socket_base::broadcast(true)); 
    remote_endpoint = boost::asio::ip::udp::endpoint(boost::asio::ip::address_v4::any(), 4000); 

    try { 
    socket.bind(remote_endpoint); 
    socket.send_to(boost::asio::buffer("abc", 3), remote_endpoint); 
    } catch (boost::system::system_error e) { 
    std::cout << e.what() << std::endl; 
    } 
} 

я получаю: send_to: Запрошенный адрес не является действительным в контексте Из улова.

Я попытался изменить конечную точку из любого() в broadcast(), однако это только порождает ту же ошибку при bind().

Я обычно программирую под linux, и этот код работает на моей обычной цели. Поэтому я почесываю голову о том, что я здесь делаю неправильно. Может ли кто-нибудь дать мне совать в правильном направлении?

ответ

3

Я считаю, что вы хотите привязать свой сокет к локальной конечной точке любым() (если вы хотите получать широковещательные пакеты - см. this question) и отправить на удаленную конечную точку с помощью широковещательной() (см. this question).

Следующая компилирует для меня и не бросать какие-либо ошибки:

void test_udp_broadcast(void) 
{ 
    boost::asio::io_service io_service; 
    boost::asio::ip::udp::socket socket(io_service); 
    boost::asio::ip::udp::endpoint local_endpoint; 
    boost::asio::ip::udp::endpoint remote_endpoint; 

    socket.open(boost::asio::ip::udp::v4()); 
    socket.set_option(boost::asio::ip::udp::socket::reuse_address(true)); 
    socket.set_option(boost::asio::socket_base::broadcast(true)); 
    local_endpoint = boost::asio::ip::udp::endpoint(boost::asio::ip::address_v4::any(), 4000); 
    remote_endpoint = boost::asio::ip::udp::endpoint(boost::asio::ip::address_v4::broadcast(), 4000); 

    try { 
    socket.bind(local_endpoint); 
    socket.send_to(boost::asio::buffer("abc", 3), remote_endpoint); 
    } catch (boost::system::system_error e) { 
    std::cout << e.what() << std::endl; 
    } 
} 
+0

Спасибо, что это то, что мне не хватало. – Aumnayan

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