我想做一个简单的程序,它执行以下操作: '从互联网时钟获取原子时间'。 我已经做了另一个使用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代码吗?)它不会再发生了......很奇怪编程很奇怪......
答案 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对我来说仍然完美无缺。有趣的是,搞乱调试/发布会带来什么样的错误。