сетевое программирование — «нарушение прав доступа», «неправильное распределение»: запрос POCO NTPClient переполнение стека

Я хотел сделать простую программу, которая делает следующее:
«Получить атомное время из интернет-часов».
Я уже сделал другую программу, которая использует 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?), Это больше не происходит … странно, программирование странно. ..

1

Решение

Я не смог найти проблему с 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 Настройки.

2

Другие решения

После установки libs для отладки libs (я хотел больше информации, хотел добавить PocoNetd.pdb (я думаю, что это позволяет VS также отлаживать код pocos?), Это больше не происходит … странно, программирование странно …
Я также могу так успешно скомпилировать и запустить версию выпуска.

Итак, в двух словах: я испортил свои настройки, и POCO все же сработал для меня безупречно. Интересно, какие ошибки вы получаете, путаясь в Debug / Release.

0

По вопросам рекламы [email protected]