当前位置: 首页 > article >正文

基于c/c++实现linux/windows跨平台ntp时间戳服务器

目录使用场景c/c源码结果验证windows编译命令linux编译命令服务器输出结果客户端输出结果使用场景在某些严格要求时间同步很精准的项目中获取网络ntp时间的时间延时比较大做滤波处理可能效果也不理想。因此可以搭建一个本地ntp服务器这样可以大大缩短网络链路使得ntp时间更加精准。c/c源码废话不多说我们直接上源码新建文件并命名为ntp_server.cpp然后将下方源码拷贝到文件里。#includeiostream#includecstdio#includecstring#includectime#includestdint.h// 跨平台套接字头文件与库#ifdef_WIN32#includewinsock2.h#includews2tcpip.h#pragmacomment(lib,ws2_32.lib)typedefintsocklen_t;#definecloseclosesocket#else#includeunistd.h#includesys/socket.h#includenetinet/in.h#includearpa/inet.h#defineSOCKETint#defineINVALID_SOCKET-1#endif// NTP 版本3 数据包结构 (RFC 1305)#pragmapack(push,1)structNtpPacket{// LI(2位) Version(3位) Mode(3位)uint8_tli_vn_mode;uint8_tstratum;// 层级uint8_tpoll;// 轮询间隔uint8_tprecision;// 精度uint32_trootDelay;// 根延迟uint32_trootDispersion;// 根离散度uint32_trefId;// 参考IDuint32_trefTimestampSec;// 参考时间戳(秒)uint32_trefTimestampFrac;// 参考时间戳(小数)uint32_torigTimestampSec;// 原始时间戳(秒)uint32_torigTimestampFrac;// 原始时间戳(小数)uint32_trecvTimestampSec;// 接收时间戳(秒)uint32_trecvTimestampFrac;// 接收时间戳(小数)uint32_ttransTimestampSec;// 发送时间戳(秒)uint32_ttransTimestampFrac;// 发送时间戳(小数)};#pragmapack(pop)// NTP 时间基准: 1900-01-01 到 1970-01-01 的秒数constuint64_tNTP_TIMESTAMP_DELTA2208988800ULL;// 跨平台初始化网络库staticboolInitSocket(){#ifdef_WIN32WSADATA wsaData;if(WSAStartup(MAKEWORD(2,2),wsaData)!0){std::cerrWinsock initialization failedstd::endl;returnfalse;}#endifreturntrue;}// 跨平台清理网络库staticvoidCleanupSocket(){#ifdef_WIN32WSACleanup();#endif}// 获取当前系统时间转换为 NTP 时间戳staticvoidGetNtpTime(uint32_tsec,uint32_tfrac){// 获取 Unix 时间 (1970-01-01 起的秒)time_t unixTimetime(nullptr);uint64_tntpSec(uint64_t)unixTimeNTP_TIMESTAMP_DELTA;sechtonl((uint32_t)ntpSec);// 小数部分: 简单填充 0 (生产环境可使用高精度时钟)frachtonl(0);}intmain(){if(!InitSocket()){return-1;}// 创建 UDP 套接字SOCKET serverFdsocket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);if(serverFdINVALID_SOCKET){std::cerrFailed to create socketstd::endl;CleanupSocket();return-1;}// 绑定 0.0.0.0:123 (NTP 默认端口)sockaddr_in serverAddr{};serverAddr.sin_familyAF_INET;serverAddr.sin_addr.s_addrINADDR_ANY;serverAddr.sin_porthtons(123);if(bind(serverFd,(sockaddr*)serverAddr,sizeof(serverAddr))0){std::cerrFailed to bind port 123! (Administrator/root privileges required)std::endl;close(serverFd);CleanupSocket();return-1;}std::coutNTP server started successfully, listening on 0.0.0.0:123std::endl;std::coutWaiting for client requests...std::endl;// 循环接收请求并应答sockaddr_in clientAddr{};socklen_t clientLensizeof(clientAddr);NtpPacket packet{};while(true){memset(packet,0,sizeof(packet));// 接收 NTP 请求ssize_t recvLenrecvfrom(serverFd,(char*)packet,sizeof(packet),0,(sockaddr*)clientAddr,clientLen);if(recvLen0)continue;// 打印客户端信息charclientIp[INET_ADDRSTRLEN];inet_ntop(AF_INET,clientAddr.sin_addr,clientIp,INET_ADDRSTRLEN);std::coutReceived NTP request from clientIpstd::endl;// 构造 NTP 应答// LI0, VN3 (NTPv3), Mode4 (Server)packet.li_vn_mode(06)|(33)|4;packet.stratum1;// 层级 1 (参考本地时钟)packet.poll6;packet.precision0xFA;// 填充时间戳GetNtpTime(packet.refTimestampSec,packet.refTimestampFrac);GetNtpTime(packet.recvTimestampSec,packet.recvTimestampFrac);GetNtpTime(packet.transTimestampSec,packet.transTimestampFrac);// 发送应答sendto(serverFd,(constchar*)packet,sizeof(packet),0,(sockaddr*)clientAddr,clientLen);}// 理论上不会执行到这里close(serverFd);CleanupSocket();return0;}结果验证windows编译命令g-stdc11 ntp_server.cpp-ontp_server-lws2_32linux编译命令g-stdc11 ntp_server.cpp-ontp_server服务器输出结果.\ntp_server.exe NTP server started successfully, listening on0.0.0.0:123 Waitingforclient requests... Received NTP request from192.168.0.149客户端输出结果客户端实现可参考基于c/c实现linux/windows跨平台获取ntp网络时间戳.\ntp_client.exe192.168.0.149 server address:192.168.0.149 Get Unix timestamp:1776611741000

相关文章:

基于c/c++实现linux/windows跨平台ntp时间戳服务器

目录使用场景c/c源码结果验证windows编译命令linux编译命令服务器输出结果客户端输出结果使用场景 在某些严格要求时间同步很精准的项目中,获取网络ntp时间的时间延时比较大,做滤波处理可能效果也不理想。因此可以搭建一个本地ntp服务器,这样…...

如何快速上手NVIDIA Profile Inspector:新手必看的完整显卡优化教程

如何快速上手NVIDIA Profile Inspector:新手必看的完整显卡优化教程 【免费下载链接】nvidiaProfileInspector 项目地址: https://gitcode.com/gh_mirrors/nv/nvidiaProfileInspector 想彻底释放你的NVIDIA显卡性能吗?NVIDIA Profile Inspector正…...

做再生牛津布出口的靠谱公司有哪些?

做再生牛津布出口,想找个靠谱的伙伴,这事儿我太有感触了。 在这个行业里泡了五年,看过太多品牌方和采购朋友踩坑。要么是环保认证搞不定,货到了港口被卡住;要么是面料性能不达标,看着挺“绿”,用…...

对话式革新:OpenClaw全场景实战指南(含CloudBase开发全流程\+生态深度解析)

在AI原生工具爆发的2026年,鹅厂OpenClaw以“文本驱动、本地优先、事件编排”的核心优势,打破了传统AI助手“只建议、不执行”的局限,从单一工具升级为覆盖办公、创作、学习、研发等多场景的生态体系。它并非简单的对话机器人,而是…...

大学生如何准备AI面试

前两天一个学弟找我,说他投了十几家AI公司的算法岗,全军覆没。 他简历上写的是「熟悉Transformer架构」、「掌握PyTorch」、「参与过NLP相关项目」,看起来没什么毛病,但面试官一开口就问,「你训练过一个模型从零到上线…...

在国产麒麟系统上,手把手教你离线搞定osg3.4.0和osgEarth2.9的编译(附完整依赖包)

国产麒麟系统离线编译OSG 3.4.0与osgEarth 2.9全流程指南 在信创产业快速发展的背景下,国产操作系统与硬件平台正逐步成为关键基础设施的核心选择。银河麒麟作为国产操作系统的代表之一,其稳定性和安全性已得到广泛验证。然而,在三维地理信息…...

大模型时代最后的符号堡垒,正在崩塌?——全球首份AGI融合技术成熟度评估报告(Gartner未发布版节选)

第一章:大模型时代最后的符号堡垒,正在崩塌? 2026奇点智能技术大会(https://ml-summit.org) 符号主义曾是人工智能的基石——逻辑推理、形式化验证、可解释规则系统,构成了人类对“智能”的最初建模。然而,当大语言模…...

【2024 AGI迁移学习权威白皮书】:基于172个跨模态任务实测数据,揭示仅12.6%模型具备真正泛化迁移能力

第一章:AGI跨领域迁移学习能力的定义与核心挑战 2026奇点智能技术大会(https://ml-summit.org) AGI跨领域迁移学习能力,指通用人工智能系统在未经历显式训练的前提下,将从源任务(如自然语言理解)中习得的抽象表征、推…...

AGI武器化临界点已至:全球7国军方内部评估报告泄露,5个致命伦理漏洞亟待封堵

第一章:AGI武器化临界点的现实判定与战略警示 2026奇点智能技术大会(https://ml-summit.org) 当前,AGI武器化已脱离理论推演阶段,进入可实证观测的临界演化窗口。多国军事AI项目披露的自主决策延迟数据、开源大模型在红蓝对抗环境中生成战术…...

自指宇宙学研究大纲:存在如何通过自我描述而实在化(世毫九实验室原创理论)

自指宇宙学研究大纲:存在如何通过自我描述而实在化 作者:方见华 单位:世毫九实验室 1. 引言与理论背景 1.1 研究动机与问题提出 当代物理学面临着前所未有的理论困境。粒子物理标准模型与广义相对论在各自领域取得了极致成功,却始…...

Switch手柄在电脑上玩转PC游戏:BetterJoy功能详解与实战指南

Switch手柄在电脑上玩转PC游戏:BetterJoy功能详解与实战指南 【免费下载链接】BetterJoy Allows the Nintendo Switch Pro Controller, Joycons and SNES controller to be used with CEMU, Citra, Dolphin, Yuzu and as generic XInput 项目地址: https://gitcod…...

【maaath】Flutter for OpenHarmony 国际化集成指南:实现中英文动态切换

Flutter for OpenHarmony 国际化集成指南:实现中英文动态切换 欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net作者:maaath一、背景介绍 在移动应用开发中,国际化(Internationalization&#x…...

面试官:Skills是什么?讲一讲它的工作原理

一、标准答案参考 直接上答案:Skills本质是结构化的本地文件夹,用来补充某个领域的流程、知识和工具,让模型在相关场景下自动或按需调用,是面向大模型的能力封装。 二、扩展问题 1、Skills 和 Prompt 的区别是什么? …...

CLIP-GmP-ViT-L-14效果展示:同一张图在不同语义层级(物体/属性/关系)的排序对比

CLIP-GmP-ViT-L-14效果展示:同一张图在不同语义层级(物体/属性/关系)的排序对比 1. 模型简介 CLIP-GmP-ViT-L-14是一个经过几何参数化(GmP)微调的CLIP模型,在ImageNet和ObjectNet数据集上达到了约90%的准确率。这个模型继承了CL…...

PyTorch模型量化避坑指南:从保存的int8模型到成功加载推理,我踩了哪些坑?

PyTorch模型量化实战避坑指南:从int8保存到推理的完整解决方案 量化技术正在成为深度学习部署的标配技能,但真正把量化模型跑通的人都知道——这绝不是调用两行API就能搞定的事。上周我部署一个关键的人体姿态估计模型时,就经历了从量化保存到…...

【AGI科研加速器】:SITS2026实证揭示——3大学科突破如何被AGI在72小时内重构研究范式?

第一章:SITS2026案例:AGI辅助科学研究 2026奇点智能技术大会(https://ml-summit.org) 在SITS2026(Singularity Intelligence Technology Summit 2026)公布的前沿案例中,“AGI辅助科学研究”项目展示了通用人工智能系…...

串口调试神器COMTransmit的隐藏功能:这样调试CH9143效率翻倍

串口调试神器COMTransmit的隐藏功能:这样调试CH9143效率翻倍 在嵌入式开发领域,串口调试就像工程师的"听诊器",而COMTransmit无疑是这把听诊器的专业升级版。许多开发者仅仅把它当作基础收发工具,却不知道其中藏着能让你…...

C++ MapViewOfFile 内存映射实战:解锁Windows大文件高效处理

1. 为什么需要内存映射技术? 如果你曾经尝试用传统方式读取几个GB的大文件,可能会遇到性能瓶颈。我做过一个实验:用fread逐块读取1GB的日志文件,耗时超过3秒;而改用内存映射方式,同样的文件仅需不到0.5秒。…...

为什么你的AI Agent响应速度总是不达标:延迟优化与性能调优实战复盘

为什么你的AI Agent响应速度总是不达标:延迟优化与性能调优实战复盘1. 引入与连接:从一场“凌晨三点的客户退单”说起 1.1 核心概念 在正式拆解AI Agent延迟问题之前,我们必须先锚定两个最核心、最容易被混淆的前置概念,并通过它们…...

线性筛还能这么用?一个‘球盒问题’带你玩转因子个数统计与模数玄机

线性筛的魔法改造:用因子个数统计破解球盒难题 在算法竞赛中,我们常常会遇到一些看似是组合数学问题,实则暗藏数论玄机的题目。今天要探讨的这个"球盒问题"就是典型代表——将n个球放入n个盒子,要求每个盒子里的球与其编…...

如何通过 reflect.Value 获取切片的底层值

go 的 reflect.value 没有提供通用的 slice() 方法,因为无法定义一个适用于所有切片类型的返回签名;正确方式是调用 interface() 后配合类型断言获取原始切片。 go 的 reflect.value 没有提供通用的 slice() 方法,因为无法定义一个适用于…...

VMware Workstation 17 虚拟机安装 macOS Ventura 13 实战指南

1. 环境准备与工具下载 在开始安装之前,我们需要准备好必要的软件和工具。首先确保你的电脑满足以下硬件要求: 64位Windows 10/11操作系统至少8GB内存(推荐16GB以上)100GB以上可用磁盘空间支持虚拟化技术的CPU(Intel V…...

Spark大数据分析实战【1.2】

第4章 Lamda架构日志分析流水线 4.1 日志分析概述 随着互联网的发展,在互联网上产生了大量的Web日志或移动应用日志,日志包含用户最重要的信息,通过日志分析,用户可以获取到网站或应用的访问量,哪个网页访问人数最多,哪个网页最有价 值、用户的特征、用户的兴趣等。 一…...

【2】 ROS2实战——三大核心通信机制深度解析(节点、话题、服务)

1. ROS2通信机制全景概览 第一次接触ROS2时,很多人会被它复杂的通信机制搞晕。作为一个在机器人领域摸爬滚打多年的开发者,我清楚地记得自己刚开始用ROS2做移动机器人项目时的困惑:传感器数据该用话题还是服务?运动控制指令怎么传…...

终极指南:如何用PvZWidescreen模组彻底解决《植物大战僵尸》宽屏黑边问题

终极指南:如何用PvZWidescreen模组彻底解决《植物大战僵尸》宽屏黑边问题 【免费下载链接】PvZWidescreen Widescreen mod for Plants vs Zombies 项目地址: https://gitcode.com/gh_mirrors/pv/PvZWidescreen 还在为《植物大战僵尸》两侧的黑边烦恼吗&#…...

从‘能检测’到‘能匹配’:手把手拆解R2D2论文中那个精巧的AP损失函数设计

从‘能检测’到‘能匹配’:R2D2论文中AP损失函数的工程化解读 当我们在手机相册里搜索"埃菲尔铁塔"时,系统如何在数万张照片中瞬间找到目标?这背后是特征点匹配技术数十年的演进。2019年NeurIPS大会上亮相的R2D2算法,通…...

JavaScript中单线程事件循环EventLoop的卡顿预警

JavaScript卡顿主因是主线程过载、微任务爆炸、渲染被挤占和定时器失控;需通过Performance面板定位长任务,分片计算、Web Worker、读写分离、requestAnimationFrame及及时清理定时器来优化。JavaScript 是单线程语言,靠事件循环(E…...

告别光电编码器?聊聊MT6835磁编码器在直流无刷电机控制中的实战应用

告别光电编码器?MT6835磁编码器在直流无刷电机控制中的实战解析 在工业自动化与精密控制领域,电机位置反馈元件的选择往往直接影响系统性能和可靠性。传统光电编码器虽占据主流市场多年,但其对灰尘敏感、机械安装精度要求高等痛点始终困扰着工…...

别再傻傻分不清了!NumPy里np.dot、np.multiply和*的实战区别(附代码避坑)

NumPy乘法操作终极指南:从原理到避坑实战 刚接触NumPy时,最让人头疼的莫过于各种乘法操作的区别。记得我第一次实现神经网络前向传播时,因为错用了*代替np.dot,导致损失函数完全不收敛,调试了整整一个下午才发现问题所…...

避坑指南:排查PCIe设备不识别?先弄明白RC、PCH和DMI这‘三兄弟’

PCIe设备识别故障排查:从RC、PCH到DMI的完整诊断指南 1. 当PCIe设备突然"消失":一个真实的故障场景 上周五下午,数据中心运维工程师李明遇到一个奇怪的问题:一台关键业务服务器上新安装的10Gbps光纤网卡在系统启动后完全…...