c++ - 如何从 C++ 中的 NTP 服务器获取正确的时间?
问题描述
我正在尝试从 NTP 互联网服务器获取实时时间。网上有很多关于这个问题的代码。所以我抓取了代码并修改了一些东西并运行了代码。但是实际时间(2020年3月)和ntp服务器时间(2008年12月)的时间差太大了。怎么了?这是我的代码。
#include <stdint.h>
#include <string.h>
#include <stdio.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <iostream>
#include <time.h>
char *hostname = (char *)"time.windows.com";
int portno = 123;
const int maxlen = 1024;
__int64 i;
char msg[48] = { 010,0,0,0,0,0,0,0,0 };
char buf[maxlen];
struct protoent *proto;
struct sockaddr_in server_addr;
int s;
time_t tmit;
proto = getprotobyname("udp");
s = socket(PF_INET, SOCK_DGRAM, proto->p_proto);
perror("socket");
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = inet_addr(hostname);
server_addr.sin_port = htons(portno);
printf("sending data..\n");
i = sendto(s, msg, sizeof(msg), 0, (struct sockaddr *)&server_addr, sizeof(server_addr));
perror("sendto");
struct sockaddr saddr;
socklen_t saddr_l = sizeof(saddr);
i = recvfrom(s, buf, 48, 0, &saddr, &saddr_l);
perror("recvfr:");
tmit = ntohl((time_t)buf[4]);
tmit -= 2208988800U;
char temp[256];
ctime_s(temp, sizeof(temp), &tmit);
std::wcout << L"time is " << temp << std::endl;
解决方案
推荐阅读
- java - 是否可以在java中将注释设置为Executable?
- angular - ngModel 不能用于使用父 formGroup 指令 p-dropDown 注册表单控件(prime ng element !)
- mongodb - Mongodb 中的查询操作,在同一集合的两个查询之间从 find left outer 中查找前 10 行
- php - 将 2 个对象放入对象内部
- javascript - 滑动滑块中带有 CSS 过渡的第二张幻灯片的幻灯片闪烁
- transactions - PynamoDB TransactWrite 更新抛出 ValidationException
- sockets - Kotlin 中的 Socket.io 用于 ProtoPie Connect Bridge,每次都收到相同的数据
- sql - Postgres - 如何使用 UNION ALL 实现 UNION 行为?
- scala - mapGroupsWithState 中 eventTimeTimeout 和 processingTimeTimeout 的区别
- angular - 将对象中的文本更改为新键打字稿