【发布时间】:2024-01-23 14:46:01
【问题描述】:
我想做一个简单的程序,它执行以下操作: '从互联网时钟获取原子时间'。 我已经编写了另一个使用 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 异常或访问冲突,所以我希望有人能指出我做错了什么。 我怀疑这是图书馆中的一个错误,我可能只是用错了(也许是?)。
更新 我有时也会收到“...0xC0000005:访问冲突读取位置 0x00E22CA9”。 (第二个内存位置不同)。但是,根据 IP 地址,有时仍会捕获 bad_alloc 错误(没有崩溃)。 因此,对于某些 IP,它会因访问冲突而崩溃,而某些 IP 会引发 bad_alloc 异常并终止。不知道那条信息是否有用。 此外,即使我将完整的垃圾作为 IP 地址提供,它们也会发生错误,例如“foobar”。
在有人有想法之前,我会检查来源并尝试找到一些东西(尽管以我的经验水平来说这很难)。
Update2:将库设置为调试库后(我想要更多信息,想要添加 PocoNetd.pdb(我认为它也允许 VS 调试 pocos 代码?)它不再发生......奇怪,编程好奇怪……
【问题讨论】:
-
Poco 是一个不成熟的库。它很可能有一个错误,尤其是在 Windows 上。您必须调试并查看
bad_alloc是从哪里抛出的。 -
@Puppy 感谢您指出这一点,实际上在我添加 try 块后它确实捕获了异常,谢谢,我错过了,会更正它。
-
@Collin Dauphinee:你能解释一下POCO“不成熟”的标准是什么吗?
-
顺便说一句,如果您正在混合发布和调试库(显然您这样做),您可能会遇到奇怪的行为。如果您将使用不同 VS 版本编译的二进制文件混合在一起,也是一样。
-
如果您找到了解决方案,请将其写为答案。不要在问题中提出解决方案。
标签: c++ network-programming ntp poco-libraries