启动程序后,我需要检索运行该程序的计算机的本地(LAN)地址。我这样做的方式如下:
try {
asio::io_service ioService;
asio::udp::resolver resolver(ioService);
asio::udp::query lanQuery(asio::udp::v4(), asio::ip::host_name(), "");
boost::system::error_code error;
auto endpointIter = resolver.resolve(lanQuery, error);
if (error || endpointIter == endpoint_iterator()) {
//TREATS ERROR
return;
}
//BUILD ENDPOINT
asio::udp::endpoint endpoint(*endpointIter); //CRASHES HERE FOR SOME PPL
catch (...) {//TREATS ERROR}
这对90%的用户有效,但对于少数人来说,它在最后一行崩溃了。
因为我测试了返回的迭代器,错误代码,并且还用try ... catch(...)块将整个代码括起来,所以该怎么做。
我什至无法处理异常,程序只是崩溃而已。
我正在使用Boost 1.64,但此问题永远存在。
我没有注意到这种崩溃的任何模式,对于拥有各种硬件/软件/操作系统的随机人群来说,它似乎崩溃了。
难道我做错了什么?有人看到该代码崩溃的原因吗?
最佳答案
将EndpointIter与默认构造的端点进行比较是否正确?
在我的资料中,我将与默认构造的迭代器进行比较:
auto endpointIter = resolver.resolve(lanQuery, error);
decltype(endpointIter) end;
for(;endpointIter != end; ++endpointIter)
{
asio::udp::endpoint endpoint(*endpointIter);
...
}