ntp 控制报文
//make the procedure into block
//2014.7.23 OK
//
#include "CSocket.h"
#define NTP_SERVER_IP "192.168.1.12" /*ntp service IP*/
int sendpkt(int sockfd,struct addrinfo * res)
{
struct ntp_control ntppack,newpack;
//put the date into the ntppack
ntppack.li_vn_mode = 0x26;
ntppack.r_m_e_op = 0x03;
ntppack.sequence = 0x01;
ntppack.status = 0x00;
ntppack.associd = 0x00;
ntppack.offset = 0x00;
ntppack.count = 0x00;
int i;
for(i=0; i<1; i++)
{
int ret = sendto(sockfd,&ntppack,sizeof(ntppack),0, res->ai_addr, res->ai_addrlen);
if(ret < 0){
perror("sendto");
return 1;
}
}
}
int getresponse(int sockfd,struct addrinfo * res)
{
struct ntp_control rpkt;
fd_set pending_data;
struct timeval block_time;
char *refid ;
/*调用select()函数,并设定超时时间为1s*/
FD_ZERO(&pending_data);
FD_SET(sockfd, &pending_data);
block_time.tv_sec=10;//how time to ask
block_time.tv_usec=0;
if (select(sockfd + 1, &pending_data, NULL, NULL, &block_time) > 0)
{
int num;
/*接收服务器端的信息*/
if ((num = recvfrom(sockfd, &rpkt,
sizeof(rpkt), 0, res->ai_addr, &res->ai_addrlen)) < 0)
{
perror("recvfrom");
return 0;
}
/* 设置接收NTP包的数据结构 */
int mode = PKT_MODE(rpkt.li_vn_mode);
int version = PKT_VERSION(rpkt.li_vn_mode);
int leap = PKT_LEAP(rpkt.li_vn_mode);
int response = CTL_ISRESPONSE(rpkt.r_m_e_op);
int error = CTL_ISERROR(rpkt.r_m_e_op);
int more = CTL_ISMORE(rpkt.r_m_e_op);
int readvar = CTL_OP(rpkt.r_m_e_op);
int sequence = ntohs(rpkt.sequence);
int status = ntohs(rpkt.status);
int associd = ntohs(rpkt.associd);
int offset = ntohs(rpkt.offset);
int count = ntohs(rpkt.count);
printf("li=%d,version=%d,mode=%d\n",leap,version,mode);
printf("response=%d,error=%d,more=%d,readvar=%d\n",response,error,more,readvar);
printf("sequence=%d\n",sequence);
printf("status=%d,associd=%d\n",status,associd);
printf("offset=%d,count=%d\n",offset,count);
printf("################ data ####################\n");
char *version_1 = strtok(rpkt.data,",");
char *processor = strtok(NULL,",");
char *system = strtok(NULL,",");
char *leap_1 = strtok(NULL,",");
char * stratum = strtok(NULL, ",");
char *precision = strtok(NULL,",");
char *rootdelay = strtok(NULL,",");
char *rootdispersion = strtok(NULL,",");
char *peer = strtok(NULL,",");
char *refid = strtok(NULL,",");
char *reftime = strtok(NULL,",");
char *poll = strtok(NULL,",");
char *clock = strtok(NULL ,",");
char *state = strtok(NULL, ",");
char *offset1 = strtok(NULL,",");
char *frequency = strtok(NULL,",");
char *jitter = strtok(NULL,",");
char *stability = strtok(NULL,",");
// printf("refid : ---%s----\n",refid);
}
if(strcmp(refid+6,"GPS")==0)
printf("ok\n");
return 1;
}
int main()
{
struct addrinfo *res = NULL,hints;
memset(&hints,0,sizeof(hints));
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_DGRAM;
hints.ai_protocol = IPPROTO_UDP;
/*调用getaddrinfo()函数,获取地址信息*/
int rc = getaddrinfo(NTP_SERVER_IP, NTP_PORT_STR, &hints, &res);
if (rc != 0)
{
perror("getaddrinfo");
return 1;
}
int fd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
if(fd < 0){
perror("socket");
return 0;
}
sendpkt(fd,res);
int i;
i = getresponse(fd,res);
printf("nihao=%d",i);
close(fd);
}
http://www.gpstime.com.cn/
ntp 控制报文的更多相关文章
- 《TCP/IP详解卷1:协议》第6章 ICMP:Internet控制报文协议-读书笔记
章节回顾: <TCP/IP详解卷1:协议>第1章 概述-读书笔记 <TCP/IP详解卷1:协议>第2章 链路层-读书笔记 <TCP/IP详解卷1:协议>第3章 IP ...
- ICMP Internet控制报文协议
ICMP是(Internet Control Message Protocol)Internet控制报文协议.它是TCP/IP协议族的一个子协议,用于在IP主机.路由器之间传递控制消息.控制消息是指网 ...
- TCP/IP详解学习笔记(5)-- ICMP:internet 控制报文协议
1.概述 ICMP是(Internet Control Message Protocol)Internet控制报文协议.它是TCP/IP协议族的一个子协议,用于在IP主机.路由器之间传递控制 ...
- ICMP:Internet控制报文协议
ICMP:Internet控制报文协议. 是IP层的组成部分.传递差错报文或其他信息. ICMP报文被封装在IP数据报内部: 详细格式例如以下所看到的: 个字段含义例如以下: 8位类型. 表示该ICM ...
- ICMP:internet 控制报文协议
ICMP:internet 控制报文协议 1.概述 ICMP是(Internet Control Message Protocol)Internet控制报文协议.它是TCP/IP协议族的一个 ...
- ICMP(网际控制报文协议)
为了更有效的提高ip数据报的成功转发和交付的效率,在网际层使用了icmp网际控制报文协议,这个协议允许主机和路由器提供差错和异常情况的报告,icmp不是高层协议,而是网际层的协议,加在ip数据报中一起 ...
- MQTT——控制报文格式
解控制报文格式是学习MQTT中,笔者认为最为重要的一个知识点.MQTT的所有行为都离不开他.控制报文可以分为三个部分组成,分别为:固定报头.可以变报头.有效载荷部分. 注意:上面的说的报文的类型.是指 ...
- 【RL-TCPnet网络教程】第24章 RL-TCPnet之网络控制报文协议ICMP
第24章 RL-TCPnet之网络控制报文协议ICMP 本章节为大家讲解ICMP(Internet Control Message Protocol,网络控制报文协议),通过前面章节对TCP和 ...
- TCP/IP 笔记 - ICMPv4和ICMPv6 : Internet控制报文协议
ICMP是一种面向无连接的协议,负责传递可能需要注意的差错和控制报文,差错指示通信网络是否存在错误(如目的主机无法到达.IP路由器无法正常传输数据包等.注意,路由器缓冲区溢出导致的丢包不包括在ICMP ...
随机推荐
- HBase多租户机制分析
在HBase1.1.0发布之前,HBase同一集群上的用户.表都是平等的,没有优劣之分.这种’大同’社会看起来完美,实际上有很多问题.最棘手的主要有这么两个,其一是某些业务较其他业务重要,需要在资源有 ...
- 【loj6059】Sum
Portal --> loj6059 Solution 看过去第一反应是..大力数位dp!然后看了一眼数据范围... 但是这没有什么关系!注意到我们不需要考虑前导零了,可以直接快乐dp ...
- 【bzoj4004】装备购买
Portal-->bzoj4004 Solution 这题的话..其实就是求\(n\)个\(m\)维向量的极大线性无关组,并且要求权值最大 然后套路什么的跟Portal-->bzoj310 ...
- 【数论】数论进阶-Preknowledge
数论进阶-Preknowledge 参考资料:洛谷网校2018夏季省选基础班SX-3数论进阶课程及课件 一.整除与取整除法 1.1 定义 1.整除 \(\forall~x,y~\in~Z^+,\) 若 ...
- Python3 字典 update() 方法
Python3 字典 描述 Python 字典 update() 函数把字典dict2的键/值对更新到dict里. 语法 update()方法语法: dict.update(dict2) 参数 di ...
- 最近遇到的DISCUZ一些问题解决方法
“抱歉,您的请求来路不正确或表单验证串不符,无法提交” 打开“source\class\helper\helper_form.php”, 然后把“$_GET[‘formhash’] == formha ...
- poj2549 Sumsets
Sumsets Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 11886 Accepted: 3273 Descript ...
- bzoj 4347 [POI2016]Nim z utrudnieniem DP
4347: [POI2016]Nim z utrudnieniem Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 733 Solved: 281[Su ...
- 011. C++ friend使用
1.friend 友元 将一个函数定义为friend,可以读取private数据: 显然,friend提供便利的同时,会破坏C++的封装性,因此,建议谨慎使用,朋友多了也许是个困扰. class co ...
- Linux下调整根目录的空间大小
原文 一.目的 在使用CentOS6.3版本Linux系统的时候,发现根目录(/)的空间不是很充足,而其他目录空间有很大的空闲,所以本文主要是针对现在已有的空间进行调整.首先,先来查看一下系统的空间分 ...