"访问冲突"、"分配错误":POCO NTPClient 请求C++

'Access Violation', 'bad allocation': POCO NTPClient request C++

本文关键字:NTPClient 请求 C++ POCO 错误 访问冲突 分配      更新时间:2023-10-16

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

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

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

我的来源是这个网站: nist

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

下面是一个崩溃和/或引发异常的小示例。这是一个例外 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异常或访问冲突,所以我希望有人能指出我做错了什么。我怀疑这是库中的错误,我可能只是用错了它(也许是?

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

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

更新2:在设置库以调试库之后(我想要更多信息,想要添加 PocoNetd.pdb(我认为它也允许 VS 调试 pocos 代码?奇怪,编程很奇怪...

我在这里找不到 POCO 的问题。但是发布的代码存在问题 - 没有 std::exception::message() 这样的东西,所以代码无法编译。将 message() 更改为 what() 并执行,得到"找不到主机"异常描述。将NTP服务器更改为"pool.ntp.org",它执行正常。以下是在 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';
    }
}

编辑:原始代码中"找不到主机"异常的原因是端口嵌入在传递给request()调用的字符串中,但实现对端口进行硬编码并仅期望IP地址或主机名。

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

在设置库以调试库之后(我想要更多信息,想要添加 PocoNetd.pdb(我认为它也允许 VS 调试 pocos 代码?奇怪,编程很奇怪...我也能够如此成功地编译和运行一个实现版本。

简而言之:我搞砸了我的设置,而 POCO 却为我完美地工作。有趣的是,通过搞砸调试/发布会得到什么样的错误。