CSNTPClient - SNTP 实现





5.00/5 (23投票s)
2000 年 4 月 8 日

179656

5506
封装SNTP协议的免费MFC类集合。
欢迎使用CSNTPClient
,这是一个封装SNTP协议的免费MFC类集合。
特点 |
用法 |
历史 |
API 参考 |
计划增强功能 |
联系作者 |
特点
- 简洁的 C++ 接口。
- 提供的接口是同步的,这提供了一种比使用异步套接字更简单的编程模型。
- 代码使用了原始套接字而不是MFC套接字。这意味着该代码可以在控制台应用程序中毫无问题地工作。
- 可以通过类API设置可配置的连接超时。
- 类完全符合 Unicode 标准,并在工作区文件中包含 Unicode 构建选项。
用法
- 要将此类集成到您的代码中,只需将sntp.cpp包含到您的项目中,并在任何需要调用此类模块的地方
#include sntp.h
。 - 您的代码需要静态或动态地包含 MFC。
- 您需要安装一个正常工作的Winsock堆栈,因为代码链接到winsock.dll。
- 您还需要在预编译头文件中包含winsock.h或afxsock.h和afxpriv.h。该代码也应该可以在多线程应用程序中工作,尽管在这种场景下尚未经过显式测试。
历史
V1.0 (1998年8月8日)- 首次公开发布。
V1.01 (1998年11月16日)
- m_nOriginateTime在SNTP响应中设置不正确。现已修复。
- 发生超时时,
GetLastError()
现在可以正常工作。
API 参考
API由以下类组成:CNtpTime
这是SNTP协议中使用的时间实例的封装。它包含一个64位无符号整数,其中高32位包含自1900年1月1日以来的秒数,低32位包含秒的小数部分。
CNtpTime
operator=
operator-
operator+
operator SYSTEMTIME
operator CNtpTimePacket
operator unsigned __int64
秒
Fraction
GetCurrentTime
MsToNtpFraction
NtpFractionToMs
NtpFractionToSecond
NtpServerResponse
这是从SNTP服务器检索信息的简单封装。它包含:
m_nLeapIndicator
m_nStratum
m_OriginateTime
m_ReceiveTime
m_TransmitTime
m_DestinationTime
m_RoundTripDelay
m_LocalClockOffset
CSNTPClient
执行时间查找的实际类是CSNTPClient,它包含:
CSNTPClient
GetServerTime
GetTimeout
SetTimeout
SetClientTime
- CNtpTime::CNtpTime
- CNtpTime();
CNtpTime(const CNtpTime& time);
CNtpTime(CNtpTimePacket& packet);
CNtpTime(const SYSTEMTIME& st);参数
- time -- 另一个CNtpTime实例。
- packet -- CNtpTimePacket实例。这是一个简单的结构,表示通过网络发送的数据。
- st -- Win32 SDK SYSTEMTIME实例。
备注
标准C++构造函数。 - CNtpTime::operator=
- CNtpTime& operator=(const CNtpTime& time);
备注
类的标准赋值运算符。 - CNtpTime::operator-
- double operator-(const CNtpTime& time) const;
备注
类的标准减法运算符。 - CNtpTime::operator+
- CNtpTime operator+(const double& timespan) const;
备注
类的标准加法运算符。 - CNtpTime::operator SYSTEMTIME
- operator SYSTEMTIME() const;
备注
返回Ntp时间的SDK SYSTEMTIME表示。 - CNtpTime::operator CNtpTimePacket
- operator CNtpTimePacket() const;
备注
返回Ntp时间的CNtpTimePacket表示。该结构是实际传输到SNTP服务器的值。 - CNtpTime::operator unsigned __int64
- operator unsigned __int64() const;
备注
返回Ntp时间的unsigned int64表示。 - CNtpTime::Seconds
- DWORD Seconds() const;
备注
返回此Ntp时间表示的总秒数。 - CNtpTime::Fraction
- DWORD Fraction() const;
备注
返回此Ntp时间表示的秒分数。 - CNtpTime::GetCurrentTime
- static CNtpTime GetCurrentTime();
备注
构造一个表示计算机当前UTC时间的NtpTime实例。 - CNtpTime::MsToNtpFraction
- static DWORD MsToNtpFraction(WORD wMilliSeconds);
备注
将毫秒数转换为Ntp小数部分。 - CNtpTime::NtpFractionToMs
- static WORD NtpFractionToMs(DWORD dwFraction);
备注
将Ntp小数部分转换为毫秒数。 - CNtpTime::NtpFractionToSecond
- static double NtpFractionToSecond(DWORD dwFraction);
备注
将Ntp小数部分转换为浮点数形式的秒分数。 - CNtpTime::m_nLeapIndicator
- int m_nLeapIndicator;
备注
此值将包含以下值之一:- 0:无警告
- 1:一天中的最后1分钟有61秒
- 2:最后1分钟有59秒
- 3:时钟未同步
- CNtpTime::m_nStratum
- int m_nStratum;
备注
此值将包含服务器的stratum级别。它将是以下值之一:- 0:未指定或不可用
- 1:主要参考(例如,无线电时钟)
- 2-15:次要参考(通过NTP或SNTP)
- 16-255:保留
- CNtpTime::m_nOriginateTime
- CNtpTime m_OriginateTime;
备注
这是客户端发送请求到SNTP服务器的时间。 - CNtpTime::m_ReceiveTime
- CNtpTime m_ReceiveTime;
备注
这是SNTP服务器从客户端接收请求的时间。 - CNtpTime::m_TransmitTime
- CNtpTime m_TransmitTime;
备注
这是服务器将请求发送回客户端的时间。 - CNtpTime::m_DestinationTime
- CNtpTime m_DestinationTime;
备注
这是客户端接收到回复的时间。 - CNtpTime::m_RoundTripDelay
- double m_RoundTripDelay;
备注
这是Ntp请求的往返时间(秒)。计算如下:
m_RoundTripDelay = (m_DestinationTime - m_OriginateTime) - (m_ReceiveTime - m_TransmitTime);
- CNtpTime::m_LocalClockOffset
- double m_LocalClockOffset;
备注
这是相对于服务器的本地时钟偏移。计算如下:
LocalClockOffset = ((m_ReceiveTime - m_OriginateTime) + (m_TransmitTime - m_DestinationTime)) / 2;
然后可以使用以下调用来设置本地时间:
CNtpTime newSynchronizedTime(CNtpTime::GetCurrentTime() + m_LocalClockOffset);
- CSNTPClient::CSNTPClient
- CSNTPClient();
备注
标准的C++构造函数,将超时初始化为默认值5秒。 - CSNTPClient::GetServerTime
- BOOL GetServerTime(LPCTSTR pszHostName, NtpServerResponse& response, int nPort = 123);
返回值
如果函数成功,返回值为非零。如果函数失败,返回值为零。要获取扩展错误信息,请调用GetLastError()
。参数
- pszHostName -- 要连接的SNTP服务器的网络地址:机器名,如“ntp.maths.tcd.ie”,或点分十进制地址,如“128.56.22.8”,都可以。
- response -- 在成功调用此函数后,这里将包含所有与SNTP服务器相关的信息。
- nPort -- 这是发起SNTP请求的端口号。默认值为123。
备注
此函数执行实际的SNTP查询,并将相关信息返回到response结构中。然后您可以自由决定是否使用检索到的值来设置本地时间。 - CSNTPClient::GetTimeout
- DWORD GetTimeout() const;
返回值
用于套接字调用的当前超时时间,在进行SNTP查询时会阻塞。 - CSNTPClient::SetTimeout
- void SetTimeout(DWORD dwTimeout);
参数
- dwTimeout -- 用于套接字调用的新超时时间,在进行SNTP查询时会阻塞。
- CSNTPClient::SetClientTime
- BOOL SetClientTime(const CNtpTime& NewTime);
返回值
如果函数成功,返回值为非零。如果函数失败,返回值为零。要获取扩展错误信息,请调用GetLastError()
。参数
- NewTime -- 要用于设置客户端时间的Ntp时间表示。
备注
给定一个时间,此函数将设置客户端系统时间。它会在内部处理NT上设置权限,因为NT有安全模式要求。
计划增强功能
- 如果您有任何其他改进建议,请告诉我,以便我将其纳入下一个版本。
联系作者
PJ Naughter电子邮件:pjn@indigo.ie
网址:http://www.naughter.com/a>
1998年11月16日