'访问违规','错误分配':POCO NTPClient请求C ++

时间:2014-12-31 19:43:21

标签: c++ network-programming ntp poco-libraries

我想做一个简单的程序,它执行以下操作: '从互联网时钟获取原子时间'。 我已经做了另一个使用FTP的程序,我用Poco :: Net库做了这个。

我尝试使用NTPClient,因为我读到的是网络时间协议。 更详细地说,这是我使用过的信息:

  

' NIST服务器在端口123上侦听NTP请求,并作出响应   以NTP格式发送udp / ip数据包。数据包   包括一个64位时间戳,其中包含自UTC时间以来的时间   1900年1月1日,分辨率为200 ps。'

我的来源是这个网站:nist

另外,我从这里尝试了各种服务器,其状态为“所有可用的服务”#: servers

这是一个崩溃和/或抛出异常的小例子。这是一个例外的std :: bad_alloc,有时会因违反“访问冲突”而崩溃。 (见下文)。 我正在使用Windows 8上的VC ++ 12进行编译

我合作过的文档: NTPClient

#include <iostream>
#include <stdexcept>

#include <Poco/Net/NTPClient.h>

using namespace Poco::Net;

int main()
{
    try {
        NTPClient client { IPAddress::Family::IPv4 };

             // this is where the bad_alloc comes from:
        client.request("129.6.15.30:123");  // or any other server

    }
    catch (std::exception& e) {
        std::cerr << e.message() << '\n';
    }
}

我不知道为什么这段代码会导致bad_alloc异常或访问冲突,所以我希望有人可以指出我做错了什么。 我怀疑它是图书馆中的一个错误,我可能只是错误地使用它(也许是错误的?)。

更新 我有时也会得到&#39; ... 0xC0000005:访问冲突读取位置0x00E22CA9。&#39; (第二个内存位置不同)。但是,根据IP地址,有时仍会捕获bad_alloc错误(不会崩溃)。 因此,对于某些IP,它会因访问冲突而崩溃,有些会抛出bad_alloc异常并终止。不知道这条信息是否有用。 此外,即使我将完整的垃圾作为IP地址提供,它们也会发生错误,例如&#34; foobar的&#34;

在有人有想法之前,我会检查消息来源并尝试找到一些东西(尽管我的经验水平很难)。

Update2:将libs设置为调试libs之后(我想要更多信息,想要添加PocoNetd.pdb(我认为它也允许VS调试pocos代码吗?)它不会再发生了......很奇怪编程很奇怪......

2 个答案:

答案 0 :(得分:2)

我无法在这里找到POCO的问题。但是发布的代码存在问题 - 没有std :: exception :: message()这样的东西,所以代码不能编译。将message()更改为what()并执行,得到&#34; Host not found&#34;例外描述。将NTP服务器更改为&#34; pool.ntp.org&#34;,它执行正常。这是在Windows 8,VS2013,64位版本上运行良好的代码:

#include <iostream>
#include <stdexcept>
#include <Poco/Net/NTPClient.h>
using namespace Poco::Net;

int main()
{
    try {
        NTPClient client{ IPAddress::Family::IPv4 };
        client.request("pool.ntp.org");
    }
    catch (std::exception& e) {
        std::cerr << e.what() << '\n';
    }
}

编辑:&#34;主机未找到的原因&#34;原始代码中的异常是因为端口嵌入在传递给request()调用的字符串中,但实现hard codes端口并且只需要ip地址或主机名。

EDIT2:只是一个建议:如果你的目标是运行调试二进制文件,那么你可能会认为你的问题已经解决了。否则,您应该能够使用POCO库的发行版本构建和运行应用程序的发布版本。有关如何执行此操作的示例,请查看任何Poco::Net sample VS projects设置。

答案 1 :(得分:0)

将libs设置为调试libs之后(我想要更多信息,想要添加PocoNetd.pdb(我认为它也允许VS调试pocos代码吗?)它不会再发生了......很奇怪,编程很奇怪...... 我也能够成功编译并运行一个版本。

所以简而言之:我搞砸了我的设置,POCO对我来说仍然完美无缺。有趣的是,搞乱调试/发布会带来什么样的错误。