大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全系列IDE稳定放心使用
本文出处:
Network Time Protocol(NTP)协议是用来使计算机时间同步化 的一种协议,它可以使计算机对其服务器或时钟源(如石英钟,GPS等)做同步化,它可以提供高精确度的时间校正(LAN上与标准时间差小于1毫秒,WAN上几十毫秒),且可用加密确认的 方式来防止协议攻击。
LI:跳跃指示器,警告在当月最后一天的最终时刻插入的迫近闺秒(闺秒)。
VN:版本号。
Mode:工作模式。该字段包括以下值:0-预留;1-对称行为;3-客户机;4-服务器;5-广播;6-NTP控制信息。NTP协议具有3种工作模式,分别为主/被动对称模式、客户/服务器模式、广播模式。在主/被动对称模式中,有一对一的连接,双方均可同步对方或被对方同步,先发出申请建立连接的一方工作在主动模式下,另一方工作在被动模式下; 客户/服务器模 式与主/被动模式基本相同,惟一区别在于客户方可被服务器同步,但服务器不能被客户同步;在广播模式中,有一对多的连接,服务器不论客户工作 在何种模式下,都会主动发出时间信息,客户根据此信息调整自己的时间。
Stratum:对本地时钟级别的整体识别。
Poll:有符号整数表示连续信息间的最大间隔。
Precision:有符号整数表示本地时钟精确度。
Root Delay:表示到达主参考源的一次往复的总延迟,它是有15~16位小数部分的符号定点小 数。
Root Dispersion:表示一次到达主参考源的标准误差,它是有15~16位小数部分的无符号 定点小数。
Reference Identifier:识别特殊参考源。
Originate Timestamp:这是向服务器请求分离客户机的时间,采用64位时标格式。
Receive Timestamp:这是向服务器请求到达客户机的时间,采用64位时标格式。
Transmit Timestamp:这是向客户机答复分离服务器的时间,采用64位时标格式。
Authenticator(Optional):当实现了NTP认证模式时,主要标识符和信息数字域就 包括已定义的信息认证代码(MAC)信息。
#define USEC(x) (((x) >> 12) – 759 * ((((x) >> 10) + 32768) >> 16))
unsigned int coarse;
unsigned int fine;
unsigned char leap_ver_mode;
unsigned char startum;
char poll;
char precision;
int reference_identifier;
ntp_time reference_timestamp;
ntp_time originage_timestamp;
ntp_time receive_timestamp;
ntp_time transmit_timestamp;
char version = 1;
long tmp_wrd;
if(!strcmp(protocol, NTPV1)||!strcmp(protocol, NTPV2)
||!strcmp(protocol, NTPV3)||!strcmp(protocol, NTPV4))
tmp_wrd = htonl((LI << 30)|(version << 27)
|(MODE << 24)|(STRATUM << 16)|(POLL << 8)|(PREC & 0xff));
memcpy(packet, &tmp_wrd, sizeof(tmp_wrd));
tmp_wrd = htonl(1<<16);
memcpy(&packet[4], &tmp_wrd, sizeof(tmp_wrd));
memcpy(&packet[8], &tmp_wrd, sizeof(tmp_wrd));
tmp_wrd = htonl(JAN_1970 + (long)timer);
memcpy(&packet[40], &tmp_wrd, sizeof(tmp_wrd));
tmp_wrd = htonl((long)NTPFRAC(timer));
memcpy(&packet[44], &tmp_wrd, sizeof(tmp_wrd));
return NTP_PCK_LEN;
else if (!strcmp(protocol, TIME))/* “TIME/UDP” */
int get_ntp_time(int sk, struct addrinfo *addr, struct ntp_packet *ret_time)
struct timeval block_time;
char data[NTP_PCK_LEN * 8];
int packet_len, data_len = addr->ai_addrlen, count = 0, result, i, re;
if (!(packet_len = construct_packet(data)))
return 0;
if ((result = sendto(sk, data,
packet_len, 0, addr->ai_addr, data_len)) < 0)
return 0;
FD_ZERO(&pending_data);
FD_SET(sk, &pending_data);
if (select(sk + 1, &pending_data, NULL, NULL, &block_time) > 0)
if ((count = recvfrom(sk, data,
NTP_PCK_LEN * 8, 0, addr->ai_addr, &data_len)) < 0)
perror(“recvfrom”);
return 0;
if (protocol == TIME)
memcpy(&ret_time->transmit_timestamp, data, 4);
return 1;
else if (count < NTP_PCK_LEN)
return 0;
/* 设置接收NTP包的数据结构 */
ret_time->leap_ver_mode = ntohl(data[0]);
ret_time->poll = ntohl(data[2]);
ret_time->precision = ntohl(data[3]);
ret_time->root_delay = ntohl(*(int*)&(data[4]));
ret_time->root_dispersion = ntohl(*(int*)&(data[8]));
ret_time->reference_identifier = ntohl(*(int*)&(data[12]));
ret_time->reference_timestamp.coarse = ntohl *(int*)&(data[16]));
ret_time->reference_timestamp.fine = ntohl(*(int*)&(data[20]));
ret_time->originage_timestamp.coarse = ntohl(*(int*)&(data[24]));
ret_time->originage_timestamp.fine = ntohl(*(int*)&(data[28]));
ret_time->receive_timestamp.coarse = ntohl(*(int*)&(data[32]));
ret_time->receive_timestamp.fine = ntohl(*(int*)&(data[36]));
ret_time->transmit_timestamp.coarse = ntohl(*(int*)&(data[40]));
ret_time->transmit_timestamp.fine = ntohl(*(int*)&(data[44]));
return 1;
} /* end of if select */
return 0;
int set_local_time(struct ntp_packet * pnew_time_packet)
struct timeval tv;
tv.tv_sec = pnew_time_packet->transmit_timestamp.coarse – JAN_1970;
tv.tv_usec = USEC(pnew_time_packet->transmit_timestamp.fine);
return settimeofday(&tv, NULL);
int sockfd, rc;
struct addrinfo hints, *res = NULL;
struct ntp_packet new_time_packet;
memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_DGRAM;
rc = getaddrinfo(NTP_SERVER_IP, NTP_PORT_STR, &hints, &res);
sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
}
if (get_ntp_time(sockfd, res, &new_time_packet))
(!set_local_time(&new_time_packet))
printf(“NTP client success!\n”);
return 0;
date -s “2001-01-01 1:00:00”
date
ntp
date
能够显示当前准确的日期和时间了!
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/182789.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...