• 大小: 6KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-06-10
  • 语言: C/C++
  • 标签:

资源简介

C语言实现window(linux)平台的SNTP,本程序功能主要是实现电脑(或者设备)时间同步。摘录部分代码:   unsigned char liVnMode; /* LeapSecond(2bits:0), VersionNumber(3bits: 3), Mode(3bits: Client=3, Server=4) */    unsigned char stratum; /* 时间层级 (0-15) */    unsigned char poll; /* 表示连续信息间的最大间隔,8 bits,以2的x次幂秒的形式表示。实际填0即可 */    unsigned char precision; /* 时间精度,以2的负x次幂秒表示,8 bits。服务器返回时会填写实际精度 */    unsigned long rootDelay; /* 到主参考时间源的往返总延迟。32 bits固定小数点数,小数点在bit 15和bit 16之间 */    unsigned long rootDispersion; /* 相对于主参考时间源的正常离差。32 bits固定小数点数,小数点在bit 15和bit 16之间 */    char referenceID[4]; /* 用于识别特殊的参考源 */    NTP_TIME_FMT referenceTimestamp; /* 本地时中最后一次设置或修正时的时间,64bits,timestamp格式 */    NTP_TIME_FMT originateTimestamp; /* 客户端发送请求的时间 */    NTP_TIME_FMT receiveTimestamp; /* 服务器接收到请求的时间 */    NTP_TIME_FMT transmitTimestamp; /* 服务器发送响应的时间 */

资源截图

代码片段和文件信息

//SNTP协议,用于时间同步
//Download by http://www.codefans.net
#pragma comment(lib“ws2_32.lib“)
#ifndef WIN32
#include 
#else
#include 
#endif
#include 
#include 
//#include “common.h“

#ifdef WIN32

#include 
#define socklen_t unsigned long
#define close closesocket
#define tz 1
#define __PACKED_ALIGN__
#pragma pack(1)

BOOL EnableSetTimePriviledge()
{
  HANDLE hToken;
  TOKEN_PRIVILEGES tokenPriv;
  if( OpenProcessToken(GetCurrentProcess() TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY &hToken) == FALSE )
  {
    if (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) 
    {
      // Must be running on 95 or 98 not NT. In that case just ignore the error
      SetLastError(ERROR_SUCCESS);
      return TRUE;
    }
    printf(“Failed to get Adjust priviledge token\n“);
    return FALSE;
  }
  memset(&tokenPriv 0 sizeof(TOKEN_PRIVILEGES));
  if (!LookupPrivilegeValue(NULL SE_SYSTEMTIME_NAME &tokenPriv.Privileges[0].Luid))
  {
    printf(“Failed in callup to lookup priviledge\n“);
    return FALSE;
  }
  tokenPriv.PrivilegeCount = 1;
  tokenPriv.Privileges[0].Attributes |= SE_PRIVILEGE_ENABLED;

  if( AdjustTokenPrivileges(hToken FALSE &tokenPriv 0 NULL 0) == FALSE )
  {
    printf(“Failed to adjust SetTime priviledge\n“);
return FALSE;
  } else {
printf(“Set Privileges OK\r\n“);
return TRUE;
  }
}

#else

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#define WM_USER 0
#define WINAPI
#define __PACKED_ALIGN__ __attribute__((packed))

#endif
int g_bRunning;
#define SNTP_DBG
#define MSG_SNTP_QUIT         (WM_USER+100) /* 退出SNTP 线程 */
#define MSG_SNTP_SERVER             (WM_USER+101) /* 设置SNTP 服务器地址*/
#define MSG_SNTP_MODE         (WM_USER+102) /* 设置SNTP 模式 */

typedef struct NTP_TIME_FMT
{
time_t seconds;
time_t fractional;
} __PACKED_ALIGN__ NTP_TIME_FMT;

typedef struct NTP_PKT_base
{
  unsigned char liVnMode; /* LeapSecond(2bits:0) VersionNumber(3bits: 3) Mode(3bits: Client=3 Server=4) */
  unsigned char stratum; /* 时间层级 (0-15) */
  unsigned char poll; /* 表示连续信息间的最大间隔,8 bits,以2的x次幂秒的形式表示。实际填0即可 */
  unsigned char precision; /* 时间精度,以2的负x次幂秒表示,8 bits。服务器返回时会填写实际精度 */
  unsigned long rootDelay; /* 到主参考时间源的往返总延迟。32 bits固定小数点数,小数点在bit 15和bit 16之间 */
  unsigned long rootDispersion; /* 相对于主参考时间源的正常离差。32 bits固定小数点数,小数点在bit 15和bit 16之间 */
  char referenceID[4]; /* 用于识别特殊的参考源 */
  NTP_TIME_FMT referenceTimestamp; /* 本地时中最后一次设置或修正时的时间,64bits,timestamp格式 */
  NTP_TIME_FMT originateTimestamp; /* 客户端发送请求的时间 */
  NTP_TIME_FMT receiveTimestamp; /* 服务器接收到请求的时间 */
  NTP_TIME_FMT transmitTimestamp; /* 服务器发送响应的时间 */
} __PACKED_ALIGN__ NTP_PKT_base;

//The optional part of an NTP packet
typedef struct NTP_PKT_AUTHINFO
{
  unsigned long keyID;
  unsigned char messageDigest[128];
} __PACKED_ALIGN_

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

----------- ---------  ---------- -----  ----

                17253                    5


评论

共有 条评论

相关资源