C++ 如何从C+;中的NTP服务器获取正确的时间+;?

C++ 如何从C+;中的NTP服务器获取正确的时间+;?,c++,time,client,difference,ntp,C++,Time,Client,Difference,Ntp,我正在尝试从NTP internet服务器获取实时数据。 网上有很多关于这个问题的代码。 所以我删掉了代码,修改了一些东西,然后运行代码。 但实际时间(2020年3月)和ntp服务器时间(2008年12月)之间的时间差太大。 发生了什么? 这是我的密码 #include <stdint.h> #include <string.h> #include <stdio.h> #include <winsock2.h> #include <ws2tc

我正在尝试从NTP internet服务器获取实时数据。 网上有很多关于这个问题的代码。 所以我删掉了代码,修改了一些东西,然后运行代码。 但实际时间(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;
#包括
#包括
#包括
#包括
#包括
#包括
#包括
char*hostname=(char*)“time.windows.com”;
int-portno=123;
常量int maxlen=1024;
__int64 i;
char msg[48]={010,0,0,0,0,0,0};
char-buf[maxlen];
结构-原型*proto;
服务器地址中的结构sockaddr\u;
int-s;
时间;
proto=getprotobyname(“udp”);
s=插座(PF INET、SOCK DGRAM、proto->p_proto);
佩罗(“插座”);
memset(&server_addr,0,sizeof(server_addr));
服务器地址sin家庭=AF网络;
服务器\u addr.sin\u addr.s\u addr=inet\u addr(主机名);
服务器地址sin\u端口=htons(端口号);
printf(“发送数据..\n”);
i=sendto(s,msg,sizeof(msg),0,(struct sockaddr*)和server_addr,sizeof(server_addr));
perror(“sendto”);
结构sockaddr saddr;
socklen_t saddr_l=sizeof(saddr);
i=从(s、buf、48、0和saddr、saddr_l)接收的数据;
perror(“recvfr:”);
tmit=ntohl((时间)buf[4]);
tmit-=2208988800U;
字符温度[256];
ctime_s(温度、尺寸(温度)和tmit);

我注意到的第一件事是错误的表达:
tmit=ntohl((time_t)buf[4])。您正在将char变量(最大值为127)转换为time_t。如果您确定时间在帧中的位置,可以尝试
tmit=ntohl(*(time_t*)&buf[4])
,但在这种情况下使用压缩结构更安全。