【发布时间】:2015-10-08 19:39:50
【问题描述】:
我是 ASIO 的新手,我正在尝试让一个相对简单的 UDP 广播工作,但我没有看到任何数据包离开我的电脑在 Wireshark 中。 io_service 或 socket 上是否有我缺少的配置?这是我的完整代码:
#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