问题已解决 - 请参阅底部的解决方案说明
我正在尝试构建一个简单的应用程序来测试支持以太网的微控制器。我想做的就是发送和接收小 UDP 数据包。该代码使用 boost::asio 进行网络连接,并且非常简单。为了调试,我将所有初始化移出构造函数,以便我可以检查每个步骤。这是我的东西的主体:
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);
障碍就在一开始就发生了。 address_v4 不想接受我传递给它的 IP。该应用程序的输出是:
GetIP - The operation completed successfully
IP: 0.0.0.0
Endpoint IP: 0.0.0.0
Endpoint Port: 4096
Open - The operation completed successfully
Bind - The operation completed successfully
Send - A request to send or receive data was disallowed because the socket is not connected and (when sending on a datagram socket using a sendto call) no address was supplied
我假设发送错误是由于address_v4
设置不正确,但我想不出有什么理由会发生这样的事情。
对于那些在家玩的人来说,我的电脑有双以太网卡,其中一张已被 DHCP 指定为 10.1.1.7,因此目标 IP 应该无需任何路由即可访问。我在 32 位 Win7 和 MSVS 10 上使用 BOOST 1.46.1。当我尝试 IP 时,它也会失败127.0.0.1
,如果我错了,请纠正我,但这应该适用于这种情况下的环回?
编辑更新:
因此,感谢之前的回答,我已将 IP 地址添加到我的address_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;
(我将 myEndpoint 重命名为 targetEndpoint 以帮助减少混乱......)
我现在在尝试发送时收到错误:
The attempted operation is not supported for the type of object referenced
此时我会给我的长子提供信息丰富的错误消息!无论我使用哪个目标端口,错误都是一致的。我唯一能想到的是我需要在某个地方设置源端口,但我不知道如何在任何地方做到这一点boost::asio
文档。
最终决议
我已经成功地完成了这项工作,所以我将把我在一个漂亮的整洁列表中发现的问题发布给那些偶然发现这个答案并与我有类似问题的人。我认为我遇到的主要问题是没有一个 boost 示例显示如何连接到指定的 IP,它们都使用解析器。这让我更难理解这些例子。
我还想告诉大家,在整个练习中我最有价值的调试工具是 Wireshark。也许这只是因为我在处理这样的通信时习惯了使用 CRO 或协议分析器,但我发现能够看到在线字节显示可以帮助我整理出一大堆我想要的东西。否则永远不会被追踪到。
为您在 IP 问题上的帮助干杯,并帮助我认识到连接和绑定之间的区别。