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 ...
随机推荐
- 【BZOJ4311】向量(线段树分治,斜率优化)
[BZOJ4311]向量(线段树分治,斜率优化) 题面 BZOJ 题解 先考虑对于给定的向量集,如何求解和当前向量的最大内积. 设当前向量\((x,y)\),有两个不同的向量\((u1,v1),(u2 ...
- 把lighttpd配置为系统服务
每次启动切换到 /usr/local/lighttpd/sbin 执行 ./lighttpd -f /usr/local/lighttpd/lighttpd.conf 比较麻烦, 而且不方便重新启动! ...
- 监听input内容改变的oninput与onpropertychange在ie9的bug
在做autocomplate的时候发现,ie9中,剪切.退格.删除不触发oninput事件,而ie9和ie9+已经移除了onpropertychange事件. 只好尝试添加退格.delete.剪切事件 ...
- 省选模拟赛 LYK loves rabbits(rabbits)
题目描述 LYK喜欢兔子,它在家中养了3只兔子. 有一天,兔子不堪寂寞玩起了游戏,3只兔子排成一排,分别站在a,b,c这3个位置. 游戏的规则是这样的,重复以下步骤k次:选择两个不同的兔子A和B,假如 ...
- 杨辉三角之c实现任意行输出
#include<stdio.h> #include<stdlib.h> int** fmalloc(int n){ int** array; //二维指针 int i; ar ...
- 「CSS」css基础
1. 文字水平居中 将一段文字置于容器的水平中点,只要设置text-align属性即可: text-align:center; 2. 容器水平居中 先该容器设置一个明确宽度,然后将margin的水平值 ...
- redis-cluster 集群搭建详细指南及常见问题集合
只当个搬运工吧 搭建篇:https://www.cnblogs.com/mafly/p/redis_cluster.html 测试能用 常见问题: 1 redis操作key时出现以下错误 (erro ...
- 【Hadoop】用web查看hadoop运行状态
博文已转移,请借一步说话.http://www.daniubiji.cn/archives/621 上一篇文章(去博客园),我们安装完hadoop,下面我们从视觉上看看hadoop怎么玩的. 我们可以 ...
- [转]C语言指针详解(经典,非常详细)
博文地址:https://blog.csdn.net/constantin_/article/details/79575638 写得很好啊! 这里写一下笔记好了 int p; //这是一个普通的整型变 ...
- 【BZOJ】1690: [Usaco2007 Dec]奶牛的旅行
[算法]01分数规划-最优比率环 [题意]给定有向图,点有收益,边有代价,重复经过的话收益不叠加而代价叠加,求从任意点开始最后回归该点的(收益/代价)最大. [题解] 和普通的分数规划不同,这里的方案 ...