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 控制报文

时间: 2024-10-13 12:12:16

ntp 控制报文的相关文章

ICMP:Internet控制报文协议

ICMP:Internet控制报文协议. 是IP层的组成部分,传递差错报文或其他信息. ICMP报文被封装在IP数据报内部: 详细格式例如以下所看到的: 个字段含义例如以下: 8位类型.表示该ICMP报文的含义.如目的不可达.超时.请求回显等. 8为代码. 进一步描写叙述该ICMP报文.ICMP报文的类型由类型字段和代码字段共同决定. 16位检验和.和IP首部检验和的算法同样. 我们常常使用的ping程序就是基于ICMP报文进行的传输.pingclient发送一个ICMP回显请求报文,serve

《TCP/IP详解卷1:协议》第6章 ICMP:Internet控制报文协议-读书笔记

章节回顾: <TCP/IP详解卷1:协议>第1章 概述-读书笔记 <TCP/IP详解卷1:协议>第2章 链路层-读书笔记 <TCP/IP详解卷1:协议>第3章 IP:网际协议(1)-读书笔记 <TCP/IP详解卷1:协议>第3章 IP:网际协议(2)-读书笔记 <TCP/IP详解卷1:协议>第4章 ARP:地址解析协议-读书笔记 <TCP/IP详解卷1:协议>第5章 RARP:逆地址解析协议-读书笔记 <TCP/IP详解卷1:协

《TCP/IP详解卷2:实现》笔记--ICMP:Internet控制报文协议

ICMP在IP系统间传递差错和管理报文,是任何IP实现必须和要求的组成部分.可以把ICMP分成两类:差错和查询.查询报文 是用一对请求和回答定义的.差错报文通常包含了引起错误的IP包的第一个分片的IP首部(和选项),加上该分片数据部分 的前8个字节. 下图显示了所有目前定义的ICMP报文.双线上面的是请求和回答报文,双线下面的是差错报文. PRC_栏显示了Net/3处理的与协议无关的差错码和ICMP报文之间的映射.对请求和回答,这一列是空的.因为在这种情况 下不会产生差错.如果对一个ICMP差错

7.网际控制报文协议

1. 协议简介 IP协议缺少主机和管理查询所需要的机制.主机有时需要判断某个路由器或是对方主机是否活跃.网际控制报文协议ICMP是设计弥补上述两个缺点的,它是IP协议的伴侣.ICMP本身是一个网络层协议,但是它的报文并不是直接传递给数据链路层.实际上,ICMP报文首先要封装成IP数据报,然后才被传递到下一层.一个IP数据报,如果协议字段值为1,表示IP数据是ICMP报文 2. 报文 ICMP报文可划分为两大类:差错报告报文和查询报文.差错报告报文报告了路由器或主机在处理IP数据报时可能遇到的问题

TCP/IP详解,卷1:协议--第6章 ICMP:Internet控制报文协议

引言 I C M P经常被认为是 I P层的一个组成部分.它传递差错报文以及其他需要注意的信息. I C M P报文通常被I P层或更高层协议( T C P或U D P)使用.一些I C M P报文把差错报文返回给 用户进程. 在本章中,我们将一般地讨论 I C M P报文,并对其中一部分作详细介绍:地址掩码请求和 应答.时间戳请求和应答以及不可达端口 ICMP报文的类型 各种类型的I C M P报文如图6 - 3所示,不同类型由报文中的类型字段和代码字段来共同决定. 图中的最后两列表明 I C

国际控制报文协议ICMP

国际控制报文协议ICMP ICMP简介 ICMP 用于主机或路由器报告差错情况和提供有关异常情况的报告(检测网络错误). ICMP 不是高层协议,而是 IP 层的协议. ICMP 报文的格式 ICMP 报文的类型 ICMP 报文的前 4 个字节是统一的格式,共有三个字段:即类型.代码和检验和.接着的 4 个字节的内容与 ICMP 的类型有关. ICMP报文可分为两大类:一.有关信息采集和配置的ICMP报文(称为查询报文(query)或者信息类报文(information message)),二.

深入浅出网工第二个协议---Internet控制报文协议ICMP

ICMP简介 ICMP(Internet Control Message Protocol)是网络层的一个重要协议ICMP的作用:用来在网络设备间传递各种差错和控制信息,它对于收集各种网络信息.诊断和排除各种网络故障具有至关重要的作用ICMP协议中用到的报文类型:Echo-Request和Echo-Reply 两种报文 使用的都是单播报文 ICMP错误报告 ICMP定义了各种错误消息,用于诊断网络连接性问题:根据这些错误消息,源设备可以判断出数据传输失败的原因.比如,如果网络中发生了环路,导致报

ICMP:Internet控制报文协议实现学习笔记

ICMP是网络层的一个协议,可以看作IP协议的附属协议,因为它主要被IP用来与其他主机或路由器交换错误报文及其他需要注意的信息.当然,更高层协议(tcp/udp)甚至有些用户进程也可能用到ICMP报文 注册ICMP协议和ICMP协议的处理涉及以下文件: net/ipv4/icmp.c ICMP协议处理入口 net/ipv4/af_inet.c 网络层和传输层接口 ICMP报文结构 参见tcp/ip协议学习笔记(5)Internet Control Message Protocol(ICMP) 注

ICMP Internet控制报文协议

ICMP端口不可达验证. 1.准备 window上下载tftp32软件,并设置好服务器IP地址(window系统的ip),并关闭windows防火墙.如下图所示: 2.ubuntu虚拟机,安装tftp服务,并安装wireshark. sudo apt-get install tftp 3. 打开wireshark. 启动tftp服务,并连接window,指定8000端口,这个端口号是没有进程在使用的,当需要get文件,最终会显示端口不可达,超时. wireshark显示端口不可达.(window