資源簡介
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
評論
共有 條評論