c++ - '访问冲突', 'bad allocation' : POCO NTPClient request C++

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

我想制作一个简单的程序来执行以下操作: “从互联网时钟获取原子时间”。 我已经完成了另一个使用 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/

相关文章:

c++ - 用于服务器编程的 wxwidgets (ftp apachelike)

networking - 关于网络浏览器和文件下载/上传的问题?

linux - NTPD : how to protect the connection of client with a Symmetric key?

web-services - 通过 Web 服务调用进行时间同步

c++ - 从ubuntu上的utc时间计算unix时间

c++ - 如何在 C++ 的 boost::regex_replace() 中插入格式 str 并且不删除输入字符串中匹配的正则表达式?

c++ - 使用 boost locale 将 wchar_t 转换为 char

perl - IO::Select线程中的select()包装器安全吗?如何解决?

python - 在 windows 上为 gpu 安装 Theano - 怀疑是 nvcc 版本问题

java - Android 应用程序和 Java 服务器问题。连接被拒绝