Ocu*_*mer 8 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.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);
Run Code Online (Sandbox Code Playgroud)
障碍恰好在开始时发生.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
Run Code Online (Sandbox Code Playgroud)
我假设发送错误是由于address_v4没有正确设置,但没有理由我可以想到这样的事情发生.
对于那些在家里玩的人来说,我的电脑有双以太网卡,其中一个是DHCP'd 10.1.1.7,所以目标IP应该可以在没有任何路由的情况下到达.我在32位Win7和MSVS 10上使用BOOST 1.46.1.当我尝试IP时它也失败了127.0.0.1,如果我错了,请纠正我,但是在这种情况下这应该适用于环回?
使用更新进行编辑:
所以,由于早期的答案,我已经将IP地址输入了我的内容address_v4,而且当我打算使用连接时,我不再尝试绑定.有意义的代码部分是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;
Run Code Online (Sandbox Code Playgroud)
(我将myEndpoint重命名为targetEndpoint以帮助减少混淆.....)
我现在在尝试发送时收到错误:此时
The attempted operation is not supported for the type of object referenced
我会给我的长子提供一条信息错误消息!无论我使用哪个目标端口,错误都是一致的.我唯一能想到的是我需要在某处设置源端口,但我不知道如何在任何boost::asio文档中执行此操作.
最终决议
我已经成功完成了这项工作,所以我将发布我在一个漂亮整齐的清单中找到的陷阱,以便其他任何人在遇到类似问题时偶然发现这个问题.我认为我遇到的主要问题是没有一个提升示例显示如何连接到指定的IP,它们都使用解析器.这让我很难理解这些例子.
from_string调用转换文本IP时,请使用下面第一个答案的语法,而不是上面的语法!设置UDP套接字时,操作顺序至关重要!如果您不想在构造函数中执行此操作,则需要:
尝试在连接后绑定将导致绑定失败.传输将运行得很好,但您的数据包将从任意端口号发送.
boost::asio::socket_base::debug(true)!所有这个标志似乎都是在一个功能上发送错误消息!我还想分享一下,在整个练习中我最有价值的调试工具是Wireshark.也许这只是因为我习惯使用CRO或协议分析器来处理这样的通信时,但是我发现能够看到线上字节显示有助于我整理出一大堆东西我否则将永远不会被追踪.
为IP问题提供帮助,帮助我实现连接和绑定之间的区别.
您目前看到的问题似乎是您对此行的使用:
targetIP.from_string("10.1.1.75", myError);
Run Code Online (Sandbox Code Playgroud)
boost::asio::ip::address::from_string是一个静态函数,它返回一个构造ip::address对象.将其更改为如下所示:
targetIP = boost::asio::ip::address::from_string("10.1.1.75", myError);
Run Code Online (Sandbox Code Playgroud)
并且您的IP地址应该正确填充.
| 归档时间: |
|
| 查看次数: |
9819 次 |
| 最近记录: |