【问题标题】:Boost Asio not sending UDP broadcast packetsBoost Asio 不发送 UDP 广播数据包
【发布时间】:2015-10-08 19:39:50
【问题描述】:

我是 ASIO 的新手,我正在尝试让一个相对简单的 UDP 广播工作,但我没有看到任何数据包离开我的电脑在 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 会有所帮助,我会的。无论如何,我计划在未来这样做,因为我目前的计划中不需要其他的提升。

正如我所说,我在 Wireshark 中没有看到任何数据包离开我的 PC,而且我的网络上什至有多个设备会响应该数据包,但我没有看到任何响应。

编辑:此代码在 Linux 中使用独立 ASIO 可以正常工作。但是,如果我最终要使用它来交付代码,我将需要 ASIO 在 Windows 上工作;跨平台很棒,我的目标是,但 Windows 是最大的市场。

【问题讨论】:

    标签: c++ sockets networking boost


    【解决方案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; }
    

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

    也许您在大量其他数据包中错过了这个单个数据包?

    【讨论】:

    • 返回 6;所以 Asio 声称已经发送了 6 个字节。我正在使用过滤器udp and src or dst port 7777 来查看数据包发出或返回的响应,它是空白的;没有数据包。我会尝试用独立的 Asio 编译它,看看是否可行。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2012-03-07
      • 1970-01-01
      • 2020-10-24
      • 1970-01-01
      • 2018-05-29
      • 1970-01-01
      • 1970-01-01
      • 2015-03-14
      • 2016-07-26
      相关资源
      最近更新 更多