Boost Asio不发送UDP广播包

时间:2015-10-08 19:39:50

标签: c++ sockets networking boost

我是ASIO的新手,我试图让一个相对简单的UDP广播工作,我没有看到任何数据包离开我的PC在Wireshark。我错过了io_servicesocket的配置文件吗?这是我的完整代码:

#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的组合具有惊人的相似性。

我在Windows 7 x64的Visual Studio 2015中使用NuGet中的Boost.Asio。如果切换到手动编译的独立Asio会有所帮助,我会的。无论如何,我计划在未来做到这一点,因为我不需要在我目前的计划中进行其余的提升。

正如我所说的,我看到没有数据包离开我的PC在Wireshark,我甚至在我的网络上有几个响应该数据包的设备,我没有看到任何响应。

编辑:这个在Linux中使用独立ASIO的代码工作正常。但是如果我最终要用它来运送代码,我将需要ASIO在Windows上工作;跨平台是伟大的,我的目标,但Windows是最大的市场。

2 个答案:

答案 0 :(得分:1)

在我看来,你能想到的最好的是一个小包。你应该检查send_to调用的返回值,它将告诉你发送了多少字节。

keydown

我编译并运行了你的代码:它运行得很好 -

enter image description here

也许你在其他人中错过了这一包?

答案 1 :(得分:1)

回答我自己的问题,向可能遇到同样问题的其他人提供信息。我确定罪魁祸首是VirtualBox添加的“VirtualBox Host-Only Network”适配器。看起来它正在吞噬从我的机器发送的所有UDP广播数据包。禁用该适配器允许我的Asio代码工作,并且没有事件干扰我设置为Bridged Adapter的VM。