2015-10-08 2 views
0

Я новичок в ASIO, и я пытаюсь получить относительно простую широковещательную рассылку UDP для работы, и я не вижу, чтобы какие-либо пакеты покидали мой компьютер в Wireshark. Есть ли конфигурация на io_service или socket, которой я не хватает? Вот мой полный код:Boost Asio не отправляет широковещательные пакеты UDP

#include <iostream> 
#include <boost/asio.hpp> 
#include <array> 

using boost::asio::ip::udp; 
namespace asio = boost::asio; 

const char* idnMsg = "*IDN?;"; 

int main(int argc, char* argv[]) 
{ 
    try 
    { 
     asio::io_service serv; 

     boost::system::error_code err; 

     udp::socket socket(serv); 
     socket.open(asio::ip::udp::v4(), err); 
     if (!err) 
     { 
      socket.set_option(udp::socket::reuse_address(true)); 
      socket.set_option(asio::socket_base::broadcast(true)); 

      asio::ip::udp::endpoint senderEndpoint(asio::ip::address_v4::broadcast(), 7777); 

      socket.send_to(asio::buffer(idnMsg, 6), senderEndpoint); 
      //socket.close(err); 

      std::array<char, 128> buf; 

      while (socket.available()) 
      { 
       asio::ip::udp::endpoint remote; 

       size_t len = socket.receive_from(asio::buffer(buf), remote); 

       std::cout << "Received: "; 
       std::cout.write(buf.data(), len); 

       buf.fill(0); 
      } 
     } 
     else 
      std::cerr << "Error connecting: " << err.message() << std::endl; 
    } 
    catch (std::exception& e) 
    { 
     std::cerr << e.what() << std::endl; 
    } 

    return 0; 
} 

Вы можете заметить, что он имеет поразительное сходство с комбинацией ASIO примера и another SO answer.

Я использую Boost.Asio от NuGet в Visual Studio 2015 в Windows 7 x64. Если переключение на ручной скомпилированный автономный Asio поможет, я сделаю это. В любом случае, я планирую сделать это в будущем, так как мне не нужно для дальнейшего повышения моих текущих планов.

Как я уже сказал, я не видел, чтобы пакеты не покидали мой компьютер в Wireshark, и у меня даже было несколько устройств в моей сети, которые отвечали бы на этот пакет, и я не видел ответов.

EDIT: Этот код с автономным ASIO в Linux работает нормально. Но я буду нуждаться в ASIO, работающем в Windows, если в конце концов я буду отправлять код с ним; кросс-платформа отличная, и я нацелен на это, но Windows - самый большой рынок.

ответ

0

Отвечая на мой вопрос, чтобы предоставить информацию другим, у кого может быть такая же проблема. Я решил, что виновником стал адаптер VirtualBox Host-Only Network, добавленный VirtualBox. Похоже, что он проглотил все пакеты широковещательной передачи UDP, отправленные с моей машины. Отключение этого адаптера позволило моему коду Asio работать, и это не помешало мне настроить мои виртуальные машины на Bridged Adapter.

1

Мне кажется, что лучшее, что вы можете ожидать, это один небольшой пакет. Вы должны проверить возврат из вызова send_to, который скажет вам, сколько байтов было отправлено.

if(socket.send_to(asio::buffer(idnMsg, 6), senderEndpoint) != 6) 
{ std::cerr << "send_to failed" << std::endl; exit(1); } 
else 
{ std::cerr << "one packet sent" << std::endl; } 

Я скомпилировал и побежал код: он работает просто отлично -

enter image description here

Возможно, вы пропустили этот один пакет в потоке других?

+0

Это возвращение 6; поэтому Asio утверждает, что отправил 6 байтов. Я использовал фильтр 'udp и src или dst-порт 7777', чтобы увидеть выход пакета или ответ, возвращенный, и он был пустым; нет пакетов. Я попробую скомпилировать его с автономным Asio и посмотреть, работает ли это. – PrinceBilliard

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