C++获取NTP服务器上的网络时间

C++获取NTP服务器上的网络时间

源代码

包含两个文件:
get_internet_time.h
get_internet_time.cpp
点击这里下载

使用方法

#include "get_internet_time.h"
using namespace std;


/*
Name:		demo
Function:	a demo shows how to use this API to get internet time
params:		None
return:		None
Author:		Leo Ma
Date:		2019.09.17
*/
//just rename this function to main(),and test this API
int main()
{
	struct tm *tim = new struct tm;
	time_t timeRecv1, timeRecv2;

	if(!get_internet_time(&timeRecv1)) cout<<"get internet time successfully!" <<endl;//成功获取时间,返回0
	tim = localtime(&timeRecv1);//这个函数返回了一个指向struct tm类型的地址
	tim->tm_year += 1900;
	tim->tm_mon += 1;
	printf("%lld -> %d-%02d-%02d %02d:%02d:%02d\r\n",timeRecv1, tim->tm_year, tim->tm_mon, tim->tm_mday, tim->tm_hour, tim->tm_min, tim->tm_sec);

	cout << "wating for a while..." << endl;
	Sleep(20*1000);//20s

	if (!get_internet_time(&timeRecv2)) cout << "get internet time successfully!" << endl;//成功获取时间,返回0
	tim = localtime(&timeRecv2);//这个函数返回了一个指向struct tm类型的地址
	tim->tm_year += 1900;
	tim->tm_mon += 1;
	printf("%lld -> %d-%02d-%02d %02d:%02d:%02d\r\n", timeRecv1, tim->tm_year, tim->tm_mon, tim->tm_mday, tim->tm_hour, tim->tm_min, tim->tm_sec);

	//计算时间差
	double cost;
	cost = difftime(timeRecv2, timeRecv1);//返回的时间差单位是秒
	cout << "cost " << cost << "s" << endl;

	system("pause");
	return 0;
}

运行结果:
在这里插入图片描述

以下是使用C++获取NTP网络时间的示例代码: ```c++ #include <iostream> #include <WinSock2.h> #include <windows.h> #include <time.h> #pragma comment(lib, "Ws2_32.lib") #define NTP_TIMESTAMP_DELTA 2208988800ull int main() { // 初始化Winsock WSADATA wsaData; int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData); if (iResult != 0) { std::cout << "WSAStartup failed with error: " << iResult << std::endl; return 1; } // 创建UDP套接字 SOCKET sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if (sock == INVALID_SOCKET) { std::cout << "socket failed with error: " << WSAGetLastError() << std::endl; WSACleanup(); return 1; } // 设置NTP服务器地址和端口 SOCKADDR_IN serverAddr; serverAddr.sin_family = AF_INET; serverAddr.sin_port = htons(123); serverAddr.sin_addr.s_addr = inet_addr("time.nist.gov"); // 构造NTP请求报文 char ntpPacket[48] = {0}; ntpPacket[0] = 0x1b; // 发送NTP请求 iResult = sendto(sock, ntpPacket, sizeof(ntpPacket), 0, (SOCKADDR *)&serverAddr, sizeof(serverAddr)); if (iResult == SOCKET_ERROR) { std::cout << "sendto failed with error: " << WSAGetLastError() << std::endl; closesocket(sock); WSACleanup(); return 1; } // 接收NTP响应 char recvBuf[1024] = {0}; iResult = recv(sock, recvBuf, sizeof(recvBuf), 0); if (iResult == SOCKET_ERROR) { std::cout << "recv failed with error: " << WSAGetLastError() << std::endl; closesocket(sock); WSACleanup(); return 1; } // 解析NTP响应 unsigned long long ntpTime = 0; memcpy(&ntpTime, &recvBuf[40], sizeof(ntpTime)); ntpTime = ntohl(ntpTime); ntpTime -= NTP_TIMESTAMP_DELTA; time_t unixTime = (time_t)ntpTime; std::cout << "Current time is " << ctime(&unixTime) << std::endl; // 关闭套接字并清理 closesocket(sock); WSACleanup(); return 0; } ``` 此代码使用了time.nist.gov作为NTP服务器,您可以根据需要更改。需要注意的是,NTP协议使用的是UTC时间,因此需要进行时区转换。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值