NTP Time получает значение NULL

Я хочу, чтобы получить время в Интернете, используя NTP, искал и использовал пример, показанный ниже.

Существует ли библиотека C / C ++ для подключения к удаленному NTP-серверу?

Кажется, работает проблема в том, что после нормализации времени NTP к времени Windows он печатает значение NULL. Код, который я использовал ниже. Если я печатаю время как

printf("tmit=%s\n",ctime(&tmit));

до

 tmit-= 2208988800U;

линия дает мне 31 декабря 1969 года, но после этого результат равен NULL. Что может быть причиной, чтобы не получить время?

заранее спасибо

#include "stdafx.h"#include <stdio.h>
#include <time.h>
#include <string.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <tchar.h>

#include <conio.h>
#include <iostream>#pragma comment(lib, "Ws2_32.lib")

void ntpdate();

int main() {
ntpdate();
return 0;
}

void ntpdate() {

char    *hostname=(char *)"200.20.186.76";
int portno=123;     //NTP is port 123
int maxlen=1024;        //check our buffers
int i;          // misc var i
char msg[48]={010,0,0,0,0,0,0,0,0};    // the packet we send
char  buf[1024]; // the buffer we get back
//struct in_addr ipaddr;        //
struct protoent *proto;     //
struct sockaddr_in server_addr;
SOCKET s;  // socket
time_t tmit;   // the time -- This is a time_t sort of

//Initialise the winsock stack
WSADATA wsaData;
BYTE wsMajorVersion = 1;
BYTE wsMinorVersion = 1;
WORD wVersionRequested = MAKEWORD(wsMinorVersion, wsMajorVersion);
if (WSAStartup(wVersionRequested, &wsaData) != 0)
{
_tprintf(_T("Failed to load winsock stack\n"));
WSACleanup();
return;
}
if (LOBYTE(wsaData.wVersion) != wsMajorVersion || HIBYTE(wsaData.wVersion) != wsMinorVersion)
{
_tprintf(_T("Winsock stack does not support version which this program requires\n"));
WSACleanup();
return;
}

//use Socket;
proto=getprotobyname("udp");
int err = GetLastError();
s=socket(PF_INET, SOCK_DGRAM, proto->p_proto);
if(s) {
perror("asd");
printf("socket=%d\n",s);
}

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);

/*
* build a message.  Our message is all zeros except for a one in the
* protocol version field
* msg[] in binary is 00 001 000 00000000
* it should be a total of 48 bytes long
*/

// send the data

printf("sending data..\n");
i=sendto(s,msg,sizeof(msg),0,(struct sockaddr *)&server_addr,sizeof(server_addr));
perror("sendto");

// get the data back

struct sockaddr saddr;
socklen_t saddr_l = sizeof (saddr);
i=recvfrom(s,buf,48,0,&saddr,&saddr_l);
perror("recvfr:");* The high word of transmit time is the 10th word we get back
* tmit is the time in seconds not accounting for network delays which
* should be way less than a second if this is a local NTP server
*/

tmit=ntohl((time_t)buf[10]);    //# get transmit time

/*
* Convert time to unix standard time NTP is number of seconds since 0000
* UT on 1 January 1900 unix time is seconds since 0000 UT on 1 January
* 1970 There has been a trend to add a 2 leap seconds every 3 years.
* Leap seconds are only an issue the last second of the month in June and
* December if you don't try to set the clock then it can be ignored but
* this is importaint to people who coordinate times with GPS clock sources.
*/

tmit-= 2208988800U;

/* use unix library function to show me the local time (it takes care
* of timezone issues for both north and south of the equator and places
* that do Summer time/ Daylight savings time.
*///#compare to system time
printf("\nTime: %s",ctime(&tmit));

i=time(0);

printf("\nSystem time is %d seconds off\n",(i-tmit));
getch();
}

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]