嵌入式Linux网络编程之:实验内容——NTP协议实现
ret_time-> 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 main()
{
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;
hints.ai_protocol = IPPROTO_UDP;
/*调用getaddrinfo()函数,获取地址信息*/
rc = getaddrinfo(NTP_SERVER_IP, NTP_PORT_STR, &hints, &res);
if (rc != 0)
{
perror("getaddrinfo");
return 1;
}
/* 创建套接字 */
sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
if (sockfd <0 )
{
perror("socket");
return 1;
}
/*调用取得NTP时间的函数*/
if (get_ntp_time(sockfd, res, &new_time_packet))
{
/*调整本地时间*/
if (!set_local_time(&new_time_packet))
{
printf("NTP client success!\n");
}
}
close(sockfd);
return 0;
}
为了更好地观察程序的效果,先用date命令修改一下系统时间,再运行实例程序。运行完了之后再查看系统时间,可以发现已经恢复准确的系统时间了。具体运行结果如下所示。
$ date -s "2001-01-01 1:00:00"
2001年 01月 01日 星期一 01:00:00 EST
$ date
2001年 01月 01日 星期一 01:00:00 EST
$ ./ntp
NTP client success!
$ date
能够显示当前准确的日期和时间了!
嵌入式Linux 网络编程 NTP协议 操作系统 相关文章:
- 嵌入式Linux技术在工业控制网络中的应用(10-30)
- 基于嵌入式Linux的组态软件实时数据库的设计(02-01)
- 基于ARM+DSP的嵌入式Linux数控系统设计(11-18)
- 基于嵌入式Linux的细胞特征提取算法设计(11-19)
- 基于S3C2410的嵌入式Linux系统构建(03-02)
- 嵌入式Linux网络编程之:网络基础编程(08-13)