NTP协议代码实现

article/2025/10/6 17:15:15

本文将讲解NTP的代码实现和调试过程的一些记录。
首先,进行NTP报文结构体的构建。

 //宏定义
#define NTP_TIMESTAMP_DELTA 2208988800ull //number of seconds between 1900 and 1970,1900-1970的时间差
#define SEC_TIME_ZONE         + (8*60*60)  //Beijing,GMT+8, 时区差typedef struct
{uint8_t li_vn_mode;      // Eight bits. li, vn, and mode.// li.   Two bits.   Leap indicator.// vn.   Three bits. Version number of the protocol.// mode. Three bits. Client will pick mode 3 for client.uint8_t stratum;         // Eight bits. Stratum level of the local clock.uint8_t poll;            // Eight bits. Maximum interval between successive messages.uint8_t precision;       // Eight bits. Precision of the local clock.uint32_t rootDelay;      // 32 bits. Total round trip delay time.uint32_t rootDispersion; // 32 bits. Max error aloud from primary clock source.uint32_t refId;          // 32 bits. Reference clock identifier.uint32_t refTm_s;        // 32 bits. Reference time-stamp seconds.uint32_t refTm_f;        // 32 bits. Reference time-stamp fraction of a second.uint32_t origTm_s;       // 32 bits. Originate time-stamp seconds.uint32_t origTm_f;       // 32 bits. Originate time-stamp fraction of a second.uint32_t rxTm_s;         // 32 bits. Received time-stamp seconds.uint32_t rxTm_f;         // 32 bits. Received time-stamp fraction of a second.uint32_t txTm_s;         // 32 bits and the most important field the client cares about. Transmit time-stamp seconds.uint32_t txTm_f;         // 32 bits. Transmit time-stamp fraction of a second.} ntp_packet;              // Total:  48 bytes.

接着进行NTP报文数据的发送、接收、接收数据处理、时间打印。

void NTP_Func(void)
{uint8_t addr[4]={192,168,4,9};//本地模拟开启的一个服务器uint8_t i;uint8_t buf[48];uint16_t port=0;uint16_t *Pport=&port;uint32_t local_timestamp; ntp_packet packet ;struct tm * Net_time; uint8_t NTP_Data[48]; //48字节的报文NTP_Data[0]=0xa3; //00100011, 0xa3,100 版本4//00011011, 0x1b,011 版本3//00010011, 0x13,010 版本2//00001011, 0x0b,001 版本1//后面分别发送了4个不同版本,都可以收到数据。for(i=1;i<48;i++)NTP_Data[i]=0;//剩余的47字节为0socket(3,Sn_MR_UDP,8080,0x00);//本地打开一个socket3,协议是UDP协议,端口是8080sendto(3,NTP_Data,48,addr,123);//向addr的123端口发送报文,NTP使用的是UDP和123端口。recvfrom(3,buf,48,addr,Pport);//接收返回的数据,48字节
//其中,sendto和recvfrom是w5500网口芯片自带的socket.c中的函数
//注意:UDP模式发送和接收使用sendto和recvfrom函数,TCP模式使用send和recv函数,当时调试时不知道,使用send和recv函数一直无法收到数据,卡了好久。packet.txTm_s = buf[40]<<24 | buf[40+1]<<16|buf[40+2]<<8 |buf[40+3];//由于本文的时间精度要求不高,故自己用服务器返回的时间作为对时的时间,并未用公式:时间差offset=((T2-T1)+(T3-T4))/2。而是用T3作为对时基准时间。  local_timestamp = packet.txTm_s - NTP_TIMESTAMP_DELTA;//减去1970和1900的差值local_timestamp +=SEC_TIME_ZONE; //加上北京的时间差,GMT+8Net_time = localtime(&local_timestamp); //秒数转换位标准时间,下一篇将详细讲解Time.h中的时间转换函数 printf("%d-%d-%d %d:%d:%d\r\n",(Net_time->tm_year)+1900, (Net_time->tm_mon)+1, Net_time->tm_mday, Net_time->tm_hour,Net_time->tm_min,Net_time->tm_sec); //打印出时间
}

在主函数中调用void NTP_Func(void)打印出收到的时间。收到的时间如下:
这里写图片描述

自己电脑的123端口的打开方式见链接:https://zhidao.baidu.com/question/520907069418583765.html?qbl=relate_question_6&word=%D4%F5%C3%B4%CD%A8%B9%FD123%B6%CB%BF%DA%B2%E9%D1%AF%CA%B1%BC%E4&qq-pf-to=pcqq.c2c
打开123端口后,可以用网络调试助手小软件进行NTP的数据模拟,如下。
这里写图片描述
报文的第一个字节分别改为0x1b,0x13,0x0b,也是可以收到服务器返回的报文,说明UDP向老版本兼容。

NTP实例的源码:https://download.csdn.net/download/u014470361/10234803


http://chatgpt.dhexx.cn/article/tPkLBRt8.shtml

相关文章

什么是Ntrip?Ntrip协议简介

文章目录 Ntrip通讯协议1.0Ntrip是什么&#xff1f;Ntrip系统组成NtripServerNtripClient4.1 获取源列表4.2 获取差分数据 其他资料 Ntrip通讯协议1.0 Ntrip是什么&#xff1f; NTRIP是在互联网上进行RTK数据传输的协议。所有的 RTK数据格式&#xff08;NCT&#xff0c;RTCM&…

网络时间协议NTP介绍

定义 网络时间协议NTP&#xff08;Network Time Protocol&#xff09;是TCP/IP协议族里面的一个应用层协议。NTP用于在一系列分布式时间服务器与客户端之间同步时钟。NTP的实现基于IP和UDP。NTP报文通过UDP传输&#xff0c;端口号是123。 目的 随着网络拓扑的日益复杂&#xf…

计算机网络中网络时间协议NTP是什么原理?

NTP是网络时间协议(Network Time Protocol)&#xff0c;它是用来同步网络中各个计算机的时间的协议。在计算机的世界里&#xff0c;时间非常地重要&#xff0c;例如对于火箭发射这种科研活动&#xff0c;对时间的统一性和准确性要求就非常地高&#xff0c;是按照A这台计算机的时…

NTP协议实现

本文出处&#xff1a; http://www.eefocus.com/html/10-04/94667s.shtml 10.4 实验内容 ——NTP协议实现 1&#xff0e;实验目的 通过实现NTP协议的练习&#xff0c;进一步掌握Linux网络编程&#xff0c;并且提高协议的分析与实现能力&#xff0c;为参与完成综合性项目打下良好…

NTP

NTP(Network Time Protocol) 网络时间协议 NTP是网络时间协议(Network Time Protocol)&#xff0c;它是用来同步网络中各个计算机的时间的协议。它的用途是把计算机的时钟同步到世界协调时UTC&#xff0c;其精度在局域网内可达0.1ms&#xff0c;在互联网上绝大多数的地方其精度…

NTP与PTP

NTP&#xff08;Network Time Protocol&#xff0c;网络时间协议&#xff09;是由RFC 1305定义的时间同步协议&#xff0c;用来在分布式时间服务器和客户端之间进行时间同步。NTP基于UDP报文进行传输&#xff0c;使用的UDP端口号为123。 使用NTP的目的是对网络内所有具有时钟的…

通信协议 - ntp时间同步

概述 NTP(Network Time Protocol&#xff09;网络时间协议基于UDP&#xff0c;用于网络时间同步的协议&#xff0c;使网络中的计算机时钟同步到UTC&#xff0c;再配合各个时区的偏移调整就能实现精准同步对时功能。提供NTP对时的服务器有很多&#xff0c;比如微软的NTP对时服务…

NTP协议原理

什么是NTP协议 当第一次听到NTP时&#xff0c;完全不知道是什么概念&#xff0c;只好问度娘。度娘搜到的答案如下&#xff1a; 看了度娘的解释后&#xff0c;才大概明白该协议是进行网络对时的协议&#xff0c;比如当自己的电脑时间不对&#xff0c;可以从另外一台电脑病基于…

网络时间协议NTP

网络时间协议NTP&#xff08;Network Time Protocol&#xff09;是TCP/IP协议族里面的一个应用层协议。NTP用于在一系列分布式时间服务器与客户端之间同步时钟。 随着网络拓扑的日益复杂&#xff0c;整个网络内设备的时钟同步将变得十分重要。如果依靠管理员手工修改系统时钟&a…

NTP网络时间协议

转自https://www.sohu.com/a/206862105_130560 SNPT 秒级时间精度 NTP授时精度与NTP服务器与用户间的网络状况有关&#xff1a;广域网授时精度通常能达50ms级&#xff0c;但有时超过500ms&#xff1b;局域网授时不存在路由器路径延迟问题&#xff0c;因而授时精度理论上可以提…

NTP协议解析

NTP&#xff08;Network Time Protocol&#xff0c;网络时间协议&#xff09;是由RFC 1305定义的时间同步协议&#xff0c;用来在分布式时间服务器和客户端之间进行时间同步。NTP基于UDP报文进行传输&#xff0c;使用的UDP端口号为123。 使用NTP的目的是对网络内所有具有时钟的…

NTP协议详解

前言 NTP(Network Time Protocol&#xff09;网络时间协议基于UDP&#xff0c;用于网络时间同步的协议&#xff0c;使网络中的计算机时钟同步到UTC&#xff0c;再配合各个时区的偏移调整就能实现精准同步对时功能。提供NTP对时的服务器有很多&#xff0c;比如微软的NTP对时服务…

NTP 协议

NTP: Network Time Protocal 一、定义&#xff1a;为实现高精确度的时间同步&#xff0c;而设计的网络时钟同步协议。在Linux系统中&#xff0c;它的最新实现是NTP 4.0&#xff08;一个分布式的网络时钟同步程序&#xff09;。相关定义和实现参看RFC1305和www.ntp.org。NTP协议…

NTP(Network Time Protocol)协议详解

一、NTP的基本概念&#xff1a; NTP(Network Time Protocol)------网络时间协议-----应用层协议&#xff0c;用来在分布式时间服务器和客户端之间进行时间同步。 二、采用NTP的目的&#xff1a; 是对网络内所有具有时钟的设备进行时钟同步&#xff0c;使网络内所有设备的时钟…

Windows10 debug安装、下载

目录 背景下载安装和使用 背景 由于Windows 10不支持debug命令&#xff0c;如果装虚拟机Windows XP就比较耗内存&#xff0c;所以我用的是DOSBox&#xff0c;然后挂载debug程序文件目录。 下载 DOSBox、debug、masm等等&#xff0c;我已经整理好了&#xff0c;下载地址&…

【WINDOWS系统】WinDbg调试工具

一、Windows 10 调试工具 (WinDbg)的安装 1、下载地址https://docs.microsoft.com/zh-cn/windows-hardware/drivers/debugger/debugger-download-tools#small-classic-windbg-preview-logo-debugging-tools-for-windows-10-windbg 2、安装 记录WinDbg安装目录&#xff0c;待会…

windbg 调试崩溃

前言 windbg 是非常强大的调试工具&#xff0c;但是在使用windbg 进修调试时候&#xff0c;很多的命令不知道如何使用。文章简单介绍如何使用windbg进行调试 https://docs.microsoft.com/zh-cn/windows-hardware/drivers/debugger/debugger-download-tools 一、Windows 调试入…

windbg 调试学习

符号服务器地址 微软的公共符号服务器地址&#xff1a;Symbol information 五种符号加载状态 1. deferred: 延迟加载&#xff0c;现在还不需要使用这个模块的符号&#xff0c;将在后面需要的时候加载 2. no symbols: 没有找到相应的符号文件 3. export: 没有找到symbols,但…

Windbg调试(使用方法)

一、Windbg版本信息 Windbg分32位和64位版本&#xff0c;32位程序应使用32位Windbg调试&#xff0c;64位程序应64位Windbg调试。 若想使用64位的Windbg分析32位的程序, 使用如下命令进行CPU模式的切换&#xff1a; .load wow64exts;!sw//例如&#xff1a; 1.查看线程停在哪里…

Windebug

1、 安装drwtsn32&#xff08;Dr.Watson win7没有了&#xff09; 用户可以通过drwtsn32命令&#xff0c;查看dmp文件会被保存在何处。 2、 安装windbg,Windbg下载地址&#xff1a; http://www.microsoft.com/whdc/devtools/debugging/default.mspx 3、 设置windbg A、符号表路径…