Я пытаюсь реализовать NTP-клиент для вычисления смещения и задержки на плате cubietruck (ARM® Cortex ™ -A7 Dual-Core) с armbian (Debian 9.6 stretch) os.Я использовал библиотеку Poco (версия 1.7.8p2) и код, похожий на пример, который предоставляет poco.Ниже приведен файл main.cpp:
#include <sstream>
#include <iostream>
#include "NTPClientTest.h"
using namespace std;
using namespace NTP;
void NtpServerSynchronization::ntpTimeSync()
{
_ntpClient.request("pool.ntp.org");
}
void NtpServerSynchronization::onResponse(const void* pSender, NTPEventArgs& args)
{
auto t1 = args.packet().originateTime().epochMicroseconds();
auto t2 = args.packet().receiveTime().epochMicroseconds();
auto t3 = args.packet().transmitTime().epochMicroseconds();
}
int main()
{
try {
NtpServerSynchronization ntp;
ntp.ntpTimeSync();
}
catch (std::exception& e) {
std::cerr << e.what() << '\n';
}
}
Хотя заголовок NTPClientTest состоит из следующего:
#include <Poco/Net/NTPClient.h>
#include <Poco/Net/NTPEventArgs.h>
#include <Poco/Delegate.h>
using namespace Poco;
using namespace Poco::Net;
using namespace std;
namespace NTP {
class NtpServerSynchronization
/// Class for time synchronization with ntp server
{
public:
NtpServerSynchronization() :
_ntpClient(IPAddress::IPv4)
{
_ntpClient.response += Delegate<NtpServerSynchronization, NTPEventArgs>(this, &NtpServerSynchronization::onResponse);
}
~NtpServerSynchronization()
{
_ntpClient.response -= Delegate<NtpServerSynchronization, NTPEventArgs>(this, &NtpServerSynchronization::onResponse);
}
void ntpTimeSync();
void onResponse(const void* pSender, NTPEventArgs& args);
private:
NTPClient _ntpClient;
SocketAddress _sa;
};
}
Однако я получаю следующие значения:
t1 = 2085978496000000
t2 = 1549296374000000
t3 = 1549296374000000
Как видно, t1 не соответствует действительной метке времени эпохи, а t2 == t3 означает, что receiveTime и TransmitTime одинаковы, и я получил аналогичный результат, какой бы сервер ntp я ни использовал.Что я делаю неправильно в отношении t1 и является ли равенство t2, t3 логическим?