我想制作一个简单的程序来执行以下操作: “从互联网时钟获取原子时间”。 我已经完成了另一个使用 FTP 的程序,并且我使用 Poco::Net 库完成了这个。
我尝试使用 NTPClient,因为我读到它是网络时间协议(protocol)。 更详细地说,这是我使用的信息:
'The NIST servers listen for a NTP request on port 123, and respond by sending a udp/ip data packet in the NTP format. The data packet includes a 64-bit timestamp containing the time in UTC seconds since January 1, 1900 with a resolution of 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”。
在有人有想法之前,我会检查来源并尝试找到一些东西(尽管这对我的经验水平来说很难)。
更新 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() 调用的字符串中,但实现 hard codes端口并仅需要 IP 地址或主机名。
EDIT2:只是一个建议:如果您的目标是运行调试二进制文件,那么您可能认为您的问题已解决。否则,您应该能够使用发布版本的 POCO 库构建和运行应用程序的发布版本。有关如何执行此操作的示例,请查看 Poco::Net sample VS projects 中的任何一个。设置。
关于c++ - '访问冲突', 'bad allocation' : POCO NTPClient request C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27725682/