2017-10-20 157 views
2

开始我的程序时,我需要检索运行它的机器的本地(LAN)地址。我这样做的方式如下:Boost Asio udp解析器返回错误的端点迭代器

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%的用户,但为少数人在最后一行崩溃。 Idk做什么,因为我测试返回的迭代器,错误代码,并且我用try ... catch(...)块封装了整个代码。

我甚至不能对待异常,程序只是崩溃,就是这样。 我使用Boost 1.64,但这个问题自始至终都会发生。

我没有注意到这种崩溃的任何模式,它似乎崩溃随机人与各种硬件/软件/操作系统。

我做错了什么?有没有人看到这个代码崩溃的原因?

回答

0

将endpointIter与默认构建的端点进行比较是正确的吗? 在我的消息来源,我比较反对的默认构造迭代器:

auto endpointIter = resolver.resolve(lanQuery, error); 
decltype(endpointIter) end; 

for(;endpointIter != end; ++endpointIter) 
{ 
    asio::udp::endpoint endpoint(*endpointIter); 
    ... 
} 
+0

也许这不是真正的答案,但征求意见我没有足够的声誉 – Dobby

+0

哦,是啊,它实际上是一个迭代器,我抄错了的问题,现在会纠正。 –