NTP校时源码(一个教完整的NTP服务项目示例,摘自国嵌实验手册)

ntp时间服务器源码安装 源码安装的ntp服务/etc/下是没有ntp.conf配置文件的,需要先yum安装ntp服务把/etc/ntp.conf文件备份后,在yum –y remove ntp*删除掉安装的ntp。 下面正式开始安装 1、首先创建一个ntp目录 mkdir /ntp cd /ntp 2.下载ntp源码安装包 wget http://www.eecis.udel.edu/~ntp/ntp_s 阅读详情

序号

功能需求

说明

1

基本功能

1.  根据NTP 服务协议,与外部 ntp 服务器进行通讯。

2.  解析ntp 协议包,从中提取有效信息。

3.  通过计算得到网络延时、本地时差,并计算出本地的标准时间。

4.  重新设定本地时间。

2

扩展功能

1.  设置校准时间间隔,即每隔指定时间校准一次。

2.  实现服务日志,对启动服务后的程序状态进行记录。

3.  实现后台运行,使程序脱离终端在后台运行,程序需通过解析配置文档获得配置信息。

3

服务模式

1.  交互式运行:在终端交互式运行服务程序,交互式获取配置信息。

2.  守护进程模式:作为守护进程在后台运行,通过配置文件获取配置信息,配置文件默认路劲:/etc/ntpclient/ntpclient.conf 。

4

启动脚本

1.  默认路径:/etc/ini.d/ntpclient 。

2.  启动选项:start ,后台启动服务。

3.  启动选项:stop ,终止后台服务。

4.  启动选项:status ,查看服务状态。

5.  启动选项:restart ,重启服务。

5

安装脚本

1.  安装选项:-i ,安装程序。

2.  安装选项:-d ,卸载程序。

实验要求视频讲解:

<<Linux应用程序开发班 >>/ 第 8 天 -NTP 网络协议实现 / 培训视频 /NTP网络协议实现 -项目要求 .avi

 

l  背景知识:
1.  培训视频:

《Linux 应用程序开发班》 / 第 8 天 -NTP 网络协议实现 /培训视频 /NTP网络协议实现 .avi 。

2.  NTP协议介绍:

网络时间协议(NTP )是一种通过因特网服务于计算机时钟的同步时间协议。它提供了一种同步时间机制,能在庞大而复杂多样的因特网中用光速调整时间分配。它使用的是可返回时间设计方案,其特点是:时间服务器是一种分布式子网,能自我组织操作、分层管理配置,经过有线或无线方式同步逻辑时钟达到国家标准时间。此外,通过本地路由选择运算法则及时间后台程序,服务器可以重新分配标准时间。

NTP 的校时涉及三个概念 — 时间偏差、时间延迟及差量,它们与指定参考时钟都是相关联的。时钟偏差表示本地时钟与参考时钟之间的偏差数;时间延迟表示在指定时间内由一方发送消息到另一方接收到消息间的延时时间;差量表示了相对于参考时钟本地时钟的最大偏差错误。因为大多数主机时间服务器通过其它对等时间服务器达到同步,所以这三个参量都有两个组成部分:其一是由对等决定的部分,这部分是相对于原始标准时间的参考来源而言;其二是由主机衡量的部分,这部分是相对于对等而言。每一部分在协议中都是独立维持的,从而可以使错误控制和子网本身的管理操作变得容易。它们不仅提供了偏移和延迟的精密测量,而且提供了明确的最大错误范围,这样用户接口不但可以决定时间,而且可以决定时间的准确度。

3.  NTP协议包结构:

进行网络协议实现时最重要的是了解协议数据格式。除了可扩展部分,基本的NTP 数据包有 48  个字节,其中 NTP 包头 16  字节,时间戳 32  个字节。其协议格式下表所示。

2

5

8

16

24

32bit

LI (2 )

VN (3 )

Mode (3 )

Stratum (8 )

Poll (8 )

Precision (8 )

Root Delay

Root Dispersion

Reference Identifier

Reference timestamp( 64 )

Originate Timestamp( 64 )

Receive Timestamp( 64 )

Transmit Timestamp( 64 )

Key Identifier( optional )( 32 )

Message digest( optional )( 128 )

·  LI:跳跃指示器,警告在当月最后一天的最终时刻插入的迫近闺秒(闺秒)。 

·  VN:版本号。 

·  Mode:模式。该字段包括以下值:0-预留;1-对称行为;3-客户机;4-服务器;5-广播;6-NTP 控制信息 

·  Stratum:对本地时钟级别的整体识别。 

·  Poll:有符号整数表示连续信息间的最大间隔。 

·  Precision:有符号整数表示本地时钟精确度。 

·  Root Delay:有符号固定点序号表示主要参考源的总延迟,很短时间内的位15到16间的分段点。 

·  Root Dispersion:无符号固定点序号表示相对于主要参考源的正常差错,很短时间内的位15到16间的分段点。 

·  Reference Identifier:识别特殊参考源。 

·  Originate Timestamp:这是向服务器请求分离客户机的时间,采用64位时标(Timestamp)格式。 

·  Receive Timestamp:这是向服务器请求到达服务器的时间,采用64位时标(Timestamp)格式。 

·  Transmit Timestamp:这是向客户机答复分离服务器的时间,采用64位时标(Timestamp)格式。 

Authenticator(Optional):当实现了 NTP 认证模式,主要标识符和信息数字域就包括已定义的信息认证代码(MAC)信息。 

4.  Daemon 进程概念:

Daemon是长时间运行的进程,通常在系统启动后就运行,在系统关闭时才结束。一般说Daemon程序在后台运行,是因为它没有控制终端,无法和前台的用户交互。Daemon程序一般都作为服务程序使用,等待客户端程序与它通信。我们也把运行的Daemon程序称作守护进程。

比如,我们的网络服务程序,可以在完成创建套接口,绑定套接口,设置套接口为监听模式后,变成守护进程进入后台执行而不占用控制终端,这是网络服务程序的常用模式。Linux下的网络服务程序,如samba、FTP、Telnet一般都是由守护进程(Daemon)来实现的。Linux的守护进程一般都命名为*d的形式,如httpd,telnetd等等。守护进程一旦脱离了终端,退出就成了问题。可以使用命令:ps aux|grep *,其中*号为进程名,找到相应进程的ID,再使用命令:kill -SIGTERM ID,终止它。

5.  Daemon 程序编写:

编写Daemon程序有一些基本的规则,以避免不必要的麻烦。

(1)  首先是程序运行后调用fork,并让父进程退出。子进程获得一个新的进程ID,但 继承了父进程的进程组ID。

(2)  调用setsid创建一个新的session,使自己成为新session和新进程组的leader,并使进程没有控制终端(tty)。

(3)  改变当前工作目录至根目录,以免影响可加载文件系统。或者也可以改变到某些特定的目录。

(4)  设置文件创建mask为0,避免创建文件时权限的影响。

(5)  关闭不需要的打开文件描述符。因为Daemon程序在后台执行,不需要于终端交互,通常就关闭STDIN、STDOUT和STDERR。其它根据实际情况处理。

另一个问题是Daemon程序不能和终端交互,也就无法使用printf方法输出信息了。我们可以使用syslog机制来实现信息的输出,方便程序的调试。当然,你也可以把这些信息输出到自己的日志文件中查看。

下面给出一段Daemon程序的例子:

 

#include <unistd.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <stdlib.h>

#include <stdio.h>

#include <syslog.h>

#include <signal.h>

 

int daemon_init(void)

{

    pid_t pid;

    if((pid = fork()) < 0)

        return(-1);

    else if(pid != 0)

        exit(0);  /* parent exit */

     /* child continues */

    setsid();  /* become session leader */

    chdir("/");  /* change working directory */

    umask(0);  /* clear file mode creation mask */

    close(0);  /* close stdin */

    close(1);  /* close stdout */

    close(2);  /* close stderr */

    return(0);

}

 

void sig_term(int signo)

{

    if(signo == SIGTERM)  //catched signal sent by kill(1) command 

    {

        syslog(LOG_INFO, "program terminated.");

        closelog();

        exit(0);

    }

}

 

int main(void)

{

    daemon_init();

    openlog("daemontest", LOG_PID, LOG_USER);

    syslog(LOG_INFO, "program started.");

    signal(SIGTERM, sig_term);  /* arrange to catch the signal */

    while(1)

    {

        sleep(1);  /* put your main program here */

    }

    return(0);

}

1.  src子目录:

实验代码stdinc.h,这是程序使用到的标准头文件的一个集合,这样做不仅可以减少编码工作量,也不至于因为修改了头文件的内容而减慢编译的速度。

#include   <stdio.h>

#include   <stdlib.h>

#include   <string.h>

#include   <stdarg.h>

#include   <unistd.h>

#include   <netinet/in.h>

#include   <sys/socket.h>

#include   <sys/types.h>

#include   <arpa/inet.h>

#include   <netdb.h>

#include   <sys/time.h>

#include   <time.h>

#include   <sys/select.h>

#include   <stdbool.h>

#include   <signal.h>

#include   <sys/param.h>

#include   <sys/stat.h>

#include   <fcntl.h>

实验代码def.h,这里主要是一些宏定义和结构类型定义。另外,调试宏函数PDEBUG的定义方式值得大家注意。

 

#ifndef  __DEF_H__

     #define  __DEF_H__

 

#define  CMD_NAME    "ntpclient"

//ntp时间从年开始,本地时间从年开始,这是两者之间的差值

#define  JAN_1970   0x83aa7e80      //3600s*24h*(365days*70years+17days)

//x*10^(-6)*2^32 微妙数转 NtpTime 结构的 fraction 部分

#define  NTPFRAC(x) (4294 * (x) + ((1981 * (x)) >> 11))  

//NTPFRAC的逆运算

#define  USEC(x) (((x) >> 12) - 759 * ((((x) >> 10) + 32768) >> 16))

 

#define  DEF_NTP_SERVER  "210.72.145.44"    //国家授时中心 ip

//#define DEF_NTP_SERVER "stdtime.gov.hk" //香港标准时间

//#define DEF_NTP_SERVER "pool.ntp.org"     //ntp官方时间

#define  DEF_NTP_PORT   123

#define  DEF_PSEC       10

#define  DEF_PMIN       0

#define  DEF_PHOUR      0

#define  DEF_TIMEOUT    10

#define  DEF_LOGEN      1

#define  DEF_LOGPATH     "/tmp/" CMD_NAME ".log"

 

#define  CONF_PATH       "/etc/" CMD_NAME "/" CMD_NAME ".conf"

#define  DAE_PID_PATH    "/var/run/" CMD_NAME ".pid"

#define  INIT_PATH       "/etc/init.d/" CMD_NAME

 

//ntp时间戳结构

typedef   struct   

{

     unsigned   int  integer;

     unsigned   int  fraction;

} NtpTime;

 

//校准信息结构

typedef   struct

{

     struct  timeval dlytime;

     struct  timeval offtime;

     struct  timeval newtime;

} NtpServResp;

 

//ntp客户端配置结构,对应 ntpclient.conf 中各项

typedef   struct

{

     char  servaddr[256];

     unsigned   int  port;

     int  psec;

     int  pmin;

     int  phour;

     int  timeout;

arm linux 添加ntp服务,移植ntp服务到arm-linux平台 转载自:http://blog.youkuaiyun.com/orange1988319/article/details/8880788,做了一些补充本文参考copy博客:,根据自己的编译环境进行了适当的修改,本人只使用ntp做客户端一、说明网络时间协议Network Time Protocol(NTP)是一种确保时钟保持准确的方法。如果可以访问互联网,只需安装ntp的客户端软件到互联网上的公共ntp服务器... 阅读详情

相关推荐

C++ ntp同步网络时间,代码实现

开源代码下载地址:https://codeload.github.com/yuanrw/tcp-server-client/zip/master 下载后可以直接根据Readme编译linux版本运行 ntp_client 使用NTP协议获取网络时间戳,提供的 C/C++ 源码支持 Windows 和 Linux(CentOS) 两大平台。 Winodws 平台上编译与测试 在 VC 的命令行环境下...

wubw0585的博客 8703

10.RT-thread项目实战--添加FTP和NTP网络服务

一.前言 上节我们完成了网络功能的添加,现在我们要添加一些网络实用的小功能。 添加RTC时钟,并添加NTP自动校时 添加ftp功能,通过网络对flash及sd卡内容进行读取写入操作 这两个功能是非常实用的,我们的设备记录一些报警信息的时候,时间是必不可少的,为了时间的准确性,我们需要添加NTP网络校时功能。 同时我们的报警文件,只要设备连网,通过ftp服务就可以实时导出设备内的文件,那岂不是非常的方便,炫酷。 二.添加RTC时钟,并添加NTP自动校时 1.确保板卡网络连接: 2..

lzs940320的博客 4527

基于NTP协议的网络校时系统设计与实现

当我们享受着云服务的无缝协同、物联网的精准联动、金融系统的毫秒决断时,别忘了背后有无数工程师在守护那一根叫做“时间”的红线。NTP 可能不像 AI、区块链那样耀眼,但它像空气一样重要——平时感觉不到,一旦缺失,整个系统就会窒息。下次当你看到或chronyd因为它,这个世界才不至于乱套 ❤️“在分布式系统中,时间不是真理,而是协商的结果。—— Leslie Lamport(图灵奖得主,分布式系统奠基人)本文还有配套的精品资源,点击获取。

weixin_35761094的博客 1037

ESP8266桌面时钟管理系统:从NTP校时到OLED显示完整实现

在嵌入式开发与物联网入门实践中,ESP8266因其自带WiFi、低成本和高性价比,成为众多DIY项目的理想主控。利用ESP8266搭建一套桌面时钟管理系统,不仅能够实现精准的NTP自动校时,还能通过OLED显示屏呈现时间、日期与温湿度信息,构建一个具备环境感知能力的桌面信息终端。该系统涉及GPIO控制、I2C通信、传感器数据采集与状态机交互等基础技术,是理解物联网设备从硬件接线到软件逻辑落地的绝佳范例。无论是高校实验室的嵌入式课程设计,还是个人创客空间的智能硬件改造,这类项目都能帮助开发者快速掌握WiFi联

weixin_29165465的博客 180

ntp源码包含服务器端和客户端

ntp源码包含服务器端和客户端,4种模式全有 组播,广播,对等,c/s

ntp-4.2.4p7源码包

ntp源码包

linux NTP客户端源码

该文件是简单版的NTP客户端的代码,可用于学习NTP协议,也可以正常编译,然后直接运行与NTP服务器进行时间同步。亲测可用。

从DC到DCG:手把手教你搭建物理感知综合流程(含DEF文件处理避坑指南)

本文详细介绍了从Design Compiler(DC)过渡到DC Topographical(DCT)和DC Graphical(DCG)的完整操作框架,特别针对DEF文件处理提供避坑方案。通过环境准备、工具升级、DEF文件处理、DCG综合配置等步骤,帮助开发者高效应对28nm以下工艺节点的物理感知综合挑战,显著提升时序收敛效率。

weixin_27966471的博客 381

V93000 SmarTest 8入门:从零搭建你的第一个半导体测试程序

半导体测试是芯片从设计走向量产的关键环节,而ATE(自动化测试设备)正是支撑这一环节的核心工具。理解ATE测试程序开发的基本原理,不仅需要掌握测试机台的硬件架构,还要熟悉其软件环境中的管脚映射、电平时序、测试流程等底层逻辑。V93000作为爱德万的主力平台,其SmarTest 8环境通过对象化与流程化设计,将复杂的芯片测试任务拆解为可配置、可复用的模块,极大提升了并行测试效率与调试的便利性。无论是数字逻辑芯片的功能验证,还是模拟混合信号器件的参数测量,掌握SmarTest 8的核心操作都能帮助你快速搭建出可

weixin_31476015的博客 244

AI 边缘计算控制器GEAC91

AI 边缘计算控制器GEAC91是AI边缘计算控制器是一款基于 NVIDIA Jetson AGX Xavier处理 器、面向智能边缘计算应用场景的解决方案。

weixin_45905610的博客 1199

PYTHON 打印三角形大全

用PYTHON语言打印各种三角形

世上无难事,只要肯攀登 1万+

IAR9.X半主模式异常解析:为何硬件复位后仍陷调试状态?

本文深入解析了IAR 9.X半主模式异常问题,探讨了硬件复位后MCU仍陷调试状态的原因及解决方案。通过分析半主模式工作机制,提供了禁用半主功能、重写低级IO函数等具体方法,并给出了版本兼容性处理和调试与量产配置分离的优化建议,帮助开发者有效解决复位异常问题。

oo7890的博客 605

工业以太网通讯Profinet协议详解

Profinet是通过西门子控制系统被广泛使用的工业通信协议,是一种较新的,基于以太网的工业通讯协议。

mydatai的专栏 8852

【深度学习新浪潮】ISP芯片算法技术简介及关键技术分析

ISP(Image Signal Processor)芯片作为现代影像系统的核心组件,负责对图像传感器输出的原始信号进行后期处理。ISP的主要功能包括线性纠正、噪声去除、坏点修复、色彩校正以及白平衡调整等,这些处理步骤对于提高图像质量和视觉效果至关重要。随着科技的进步,ISP芯片不仅提升了图像的清晰度和色彩准确性,还通过高效的算法增强了拍摄体验,尤其是在低光环境下的表现。

专注:太空算力、AI infra、异构调度、大模型成本工程 1223

NVIDIA Isaac Sim 入门教程(二)

Omniverse Isaac Sim 的工作空间非常容易自定义。调整用户界面的大小、停靠、取消停靠、添加和移除面板都非常容易。进入顶部菜单栏,单击下拉菜单最下方的窗口 > 视口 > 视口 2(现在工作区中应该会出现一个名为 "视口 2 "的新视口。如果您想创建更多的视口,请按照相机检查器扩展进行操作。单击并拖动视口 2 的顶部标题以激活停靠部件。拖放到原始视口的右侧,将两个视口并排放置。单击并向左拖动视口 2 的左侧,使视口大小相等。

机器人控制与仿真应用 6545

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

上一篇: linux c 实现目录拷贝
下一篇: Linux下静态链接库与动态链接库的区别
RICH_BABA
博客等级 码龄17年 51粉丝 17原创
评论 8
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值