65.9K
CodeProject 正在变化。 阅读更多。
Home

CSNTPClient - SNTP 实现

starIconstarIconstarIconstarIconstarIcon

5.00/5 (23投票s)

2000 年 4 月 8 日

viewsIcon

179656

downloadIcon

5506

封装SNTP协议的免费MFC类集合。

  • 下载源代码文件 - 17 Kb
  • 欢迎使用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日


    © . All rights reserved.