资源简介
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
评论
共有 条评论