C++ boost:asio IPv4地址和UDP通信
问题已解决-请参见底部的解决方案注释 我正在尝试构建一个简单的应用程序来测试一个支持以太网的微控制器。我只想发送和接收小的UDP数据包。该代码使用boost::asio进行联网,非常简单。为了进行调试,我将所有初始化从构造函数中移出,以便检查每个步骤。以下是我的资料:C++ boost:asio IPv4地址和UDP通信,c++,windows,network-programming,boost-asio,C++,Windows,Network Programming,Boost Asio,问题已解决-请参见底部的解决方案注释 我正在尝试构建一个简单的应用程序来测试一个支持以太网的微控制器。我只想发送和接收小的UDP数据包。该代码使用boost::asio进行联网,非常简单。为了进行调试,我将所有初始化从构造函数中移出,以便检查每个步骤。以下是我的资料: boost::system::error_code myError; boost::asio::ip::address_v4 targetIP; targetIP.from_string("10.1.1.
boost::system::error_code myError;
boost::asio::ip::address_v4 targetIP;
targetIP.from_string("10.1.1.75", myError); // Configure output IP address. HACKHACK--Hardcoded for Debugging
std::cout << "GetIP - " << myError.message() << std::endl;
std::cout << "IP: " << targetIP << std::endl;
boost::asio::ip::udp::endpoint myEndpoint; // Create endpoint on specified IP.
myEndpoint.address(targetIP);
myEndpoint.port(0x1000);
std::cout << "Endpoint IP: " << myEndpoint.address().to_string() << std::endl;
std::cout << "Endpoint Port: " << myEndpoint.port() << std::endl;
boost::asio::io_service io_service; // Create socket and IO service, bind socket to endpoint.
udp::socket socket(io_service);
socket.open( myEndpoint.protocol(), myError );
std::cout << "Open - " << myError.message() << std::endl;
socket.bind( myEndpoint, myError );
std::cout << "Bind - " << myError.message() << std::endl;
char myMessage[] = "UDP Hello World!"; // Send basig string, enable socket level debugging.
socket.send(boost::asio::buffer(myMessage, sizeof(myMessage)), boost::asio::socket_base::debug(true), myError);
std::cout << "Send - " << myError.message() << std::endl;
boost::array<char, 128> recv_buf; // Receive something (hopefully an echo from the uP)
udp::endpoint sender_endpoint;
size_t len = socket.receive_from( boost::asio::buffer(recv_buf), myEndpoint );
std::cout.write(recv_buf.data(), len);
我假设发送错误是由于地址\u v4
设置不正确造成的,但我想不出发生这种情况的原因
对于那些在家玩游戏的人来说,我的电脑有两个以太网卡,其中一个是DHCP的10.1.1.7,因此目标IP应该可以在没有任何路由的情况下访问。我在32位Win7和MSVS 10上使用BOOST 1.46.1。当我尝试127.0.0.1
的IP时,它也会失败,如果我错了,请纠正我,但在这种情况下,这应该适用于环回
使用更新进行编辑:
因此,多亏了前面的回答,我已经将IP地址输入了我的地址\u v4
,当我打算使用connect时,我不再尝试绑定。代码中变化最大的部分是TX,它现在看起来像:
socket.open( targetEndpoint.protocol(), myError );
std::cout << "Open - " << myError.message() << std::endl;
char myMessage[] = "UDP Hello World!"; // Send basig string, enable socket level debugging.
socket.send_to(boost::asio::buffer(myMessage, sizeof(myMessage)), targetEndpoint, boost::asio::socket_base::debug(true), myError);
std::cout << "Send - " << myError.message() << std::endl;
socket.open(targetEndpoint.protocol(),myError);
在我的头顶上,您试图将套接字绑定到地址为10.1.1.75的端点,但这似乎是一个远程端点?我假设您希望将其绑定到本地并使用send_to,因为它是UDP您当前看到的问题似乎是您使用这一行:
targetIP.from_string("10.1.1.75", myError);
boost::asio::ip::address::from_string
是一个静态函数,返回构造的ip::address
对象。将其更改为如下所示:
targetIP = boost::asio::ip::address::from_string("10.1.1.75", myError);
并且您的IP地址应该正确填充。在这一行中有一个错误:
targetIP = boost::asio::ip::address::from_string("10.1.1.75", myError);
你应该说:
targetIP = boost::asio::ip::address_v4::from_string("10.1.1.75", myError);
然后targetIP具有正确的值 好的,进一步更新:如果我使用boost::asio::ip::address\u v4::bytes\u type
来表示ip,我可以成功地传入我选择的任何ip。我还可以使用boost::asio::ip::address\u v4::loopback()
作为参数构造端点,它的计算结果是ip为127.0.0.1。不幸的是,它不会改变发送时的错误,当我运行这些设置时……用这个信息编辑你的问题,它不应该是评论员Chad,我还是相当新的C++,我的背景是C上的微控制器。我必须学会留意像doumentation中的static
这样的神奇词汇。只要我使用boost::asio::IP::address\u v4::from\u string(“xxx”)
,该修复程序就会成功地获取我的IP集。发送数据仍然有问题,但至少我现在可以以合理的方式使用IP。为Rolle欢呼,我已经把bind
和connect
弄糊涂了。我的印象是boost仍然会使用socket.connect和UDP对socket对象中的目标端点进行编码,但为了安全起见,我已经改用send_。不幸的是,我现在得到一个当我尝试发送时,引用的对象类型不支持尝试的操作。有什么想法吗?
targetIP = boost::asio::ip::address_v4::from_string("10.1.1.75", myError);