//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 控制报文的更多相关文章

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

    章节回顾: <TCP/IP详解卷1:协议>第1章 概述-读书笔记 <TCP/IP详解卷1:协议>第2章 链路层-读书笔记 <TCP/IP详解卷1:协议>第3章 IP ...

  2. ICMP Internet控制报文协议

    ICMP是(Internet Control Message Protocol)Internet控制报文协议.它是TCP/IP协议族的一个子协议,用于在IP主机.路由器之间传递控制消息.控制消息是指网 ...

  3. TCP/IP详解学习笔记(5)-- ICMP:internet 控制报文协议

    1.概述      ICMP是(Internet Control Message Protocol)Internet控制报文协议.它是TCP/IP协议族的一个子协议,用于在IP主机.路由器之间传递控制 ...

  4. ICMP:Internet控制报文协议

    ICMP:Internet控制报文协议. 是IP层的组成部分.传递差错报文或其他信息. ICMP报文被封装在IP数据报内部: 详细格式例如以下所看到的: 个字段含义例如以下: 8位类型. 表示该ICM ...

  5. ICMP:internet 控制报文协议

    ICMP:internet 控制报文协议 1.概述      ICMP是(Internet Control Message Protocol)Internet控制报文协议.它是TCP/IP协议族的一个 ...

  6. ICMP(网际控制报文协议)

    为了更有效的提高ip数据报的成功转发和交付的效率,在网际层使用了icmp网际控制报文协议,这个协议允许主机和路由器提供差错和异常情况的报告,icmp不是高层协议,而是网际层的协议,加在ip数据报中一起 ...

  7. MQTT——控制报文格式

    解控制报文格式是学习MQTT中,笔者认为最为重要的一个知识点.MQTT的所有行为都离不开他.控制报文可以分为三个部分组成,分别为:固定报头.可以变报头.有效载荷部分. 注意:上面的说的报文的类型.是指 ...

  8. 【RL-TCPnet网络教程】第24章 RL-TCPnet之网络控制报文协议ICMP

    第24章     RL-TCPnet之网络控制报文协议ICMP 本章节为大家讲解ICMP(Internet Control Message Protocol,网络控制报文协议),通过前面章节对TCP和 ...

  9. TCP/IP 笔记 - ICMPv4和ICMPv6 : Internet控制报文协议

    ICMP是一种面向无连接的协议,负责传递可能需要注意的差错和控制报文,差错指示通信网络是否存在错误(如目的主机无法到达.IP路由器无法正常传输数据包等.注意,路由器缓冲区溢出导致的丢包不包括在ICMP ...

随机推荐

  1. 已知UIScrollView放大后的Frame和放大之前的Frame计算放大的瞄点坐标

    有时候在缩放后,需要知道该次缩放是在哪个坐标开始缩放的.如上篇已知缩放的点,然后在该点对其缩放.本篇其实是逆运算 (x,y)就是当初在该点进行缩放 化简之后很简单,代码如下: func getZoom ...

  2. bzoj2962 序列操作

    2962: 序列操作 Time Limit: 50 Sec  Memory Limit: 256 MBSubmit: 1145  Solved: 378[Submit][Status][Discuss ...

  3. Ubuntu在vncviewer下Tab键失效

    打开命令行,运行如下命令即可解决: xfconf-query -c xfce4-keyboard-shortcuts -p /xfwm4/custom/'<'Super'>'Tab -r ...

  4. git 列出两个 commit 之间变更的文件列表

    git diff <commit1> <commit2> --stat 如: git diff 74ecf17dc 1ee25ed3c --stat src/assets 上面 ...

  5. Chocolatey - Windows Software Management Automation

    What is Chocolatey? Chocolatey is a software management solution unlike anything else you've ever ex ...

  6. oracle,sqlserver,mysql常见数据库jdbc连接

    发现JDBC连接字符串总是容易忘记,特此整理一下常用的几种数据的连接 ORACLE: /** * ORACLE * */ public static Connection getOracleConne ...

  7. centos7通过yum安装MySQL

    一:去官网查看最新安装包 https://dev.mysql.com/downloads/repo/yum/ 二:下载MySQL源安装包 wget http://dev.mysql.com/get/m ...

  8. JAVA 日期处理工具类 DateUtils

    package com.genlot.common.utils; import java.sql.Timestamp;import java.text.ParseException;import ja ...

  9. HDU 6205 尺取

    容易看出来,扩增一倍,找最长的区间就行了 /** @Date : 2017-09-11 12:43:11 * @FileName: 1012.cpp * @Platform: Windows * @A ...

  10. Python学习笔记(四十八)POP3收取邮件

    收取邮件就是编写一个MUA作为客户端,从MDA把邮件获取到用户的电脑或者手机上.收取邮件最常用的协议是POP协议,目前版本号是3,俗称POP3. Python内置一个poplib模块,实现了POP3协 ...