Я хотел сделать простую программу, которая делает следующее:
«Получить атомное время из интернет-часов».
Я уже сделал другую программу, которая использует FTP, и я сделал это с библиотекой Poco :: Net.
Я попытался использовать NTPClient, так как я прочитал, что это протокол сетевого времени.
Более подробно, вот информация, с которой я работал:
«Серверы NIST прослушивают запрос NTP на порту 123 и отвечают
отправка пакета данных udp / ip в формате NTP. Пакет данных
включает в себя 64-битную метку времени, содержащую время в секундах UTC с
1 января 1900 года с разрешением 200 пс.
Мой источник этого сайта: NIST
Кроме того, я пробовал различные серверы отсюда со статусом «все доступные сервисы»:
серверы
Вот небольшой пример, который дает сбой и / или выдает исключение. Это исключение std :: bad_alloc и иногда происходит сбой с «нарушением доступа» (см. Ниже).
Я компилирую с VC ++ 12 на Windows 8
Документы, с которыми я работал:
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-адресов происходит сбой с нарушением прав доступа, а для некоторых он вызывает исключение bad_alloc и завершается. Не знаю, может ли эта информация быть полезной.
Также возникает ошибка, даже если я передаю полный мусор как IP-адрес, например «Foobar».
Пока у кого-то не возникнет идея, я буду изучать источники и пытаться что-то найти (хотя это сложно с моим уровнем опыта).
Обновление 2: После установки libs для отладки libs (я хотел больше информации, хотел добавить PocoNetd.pdb (я думаю, что это позволяет VS также отлаживать код pocos?), Это больше не происходит … странно, программирование странно. ..
Я не смог найти проблему с POCO здесь. Но есть проблема с размещенным кодом — нет такой вещи, как std :: exception :: message (), поэтому код не компилируется. Изменив message () на what () и выполнив, вы получите описание исключения «Host not found». Меняя 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';
}
}
РЕДАКТИРОВАТЬ: причина исключения «Хост не найден» в исходном коде заключается в том, что порт встроен в строку, переданную в запросе (), но реализация жесткие коды порт и ожидает только IP-адрес или имя хоста.
РЕДАКТИРОВАТЬ 2: Просто совет: если ваша цель — запустить отладочные двоичные файлы, то вы можете считать, что ваша проблема решена. В противном случае вы сможете создавать и запускать сборку выпуска вашего приложения с выпусками версий библиотек POCO. Для примера, как это сделать, посмотрите на любой из Poco :: Чистые примеры проектов VS Настройки.
После установки libs для отладки libs (я хотел больше информации, хотел добавить PocoNetd.pdb (я думаю, что это позволяет VS также отлаживать код pocos?), Это больше не происходит … странно, программирование странно …
Я также могу так успешно скомпилировать и запустить версию выпуска.
Итак, в двух словах: я испортил свои настройки, и POCO все же сработал для меня безупречно. Интересно, какие ошибки вы получаете, путаясь в Debug / Release.