2

Possible Duplicate:
Is there any C/C++ library to connect with a remote NTP server?

I'm searching for a working code in c/c++ that gets the time and date from the server(ntp.belnet.be). It works with UDP and uses port 123.

Can someone help?

//sending pakket
memset(&sntp_msg_header, 0, sizeof sntp_msg_header);
sntp_msg_header.flags = 27;
sntp_msg_header.originate_timestamp_secs = time(NULL);

// Get data in rxmsg
...
...

// print time
timeval = ntohl(rxmsg.transmit_timestamp_secs) - ((70ul * 365ul + 17ul) * 86400ul);
printf("%s", ctime(&timeval));

This is what i have so far. But i can't get the correct data out of it. I hope this is more information.

Community
  • 1
  • 1
user1765216
  • 111
  • 2
  • 2
  • 8
  • I would suggest that the best thing to do is to run `ntpd` on that computer so it has the correct time and date. NTP servers on the Internet are not designed to be queried by user code. They aren't up to handling the load. – Omnifarious Oct 22 '12 at 11:45
  • I don't need a library. I just need a short code snippet in c++ to get the time from that server in commandline. It's for a assignment. – user1765216 Oct 22 '12 at 11:51
  • 2
    SO is really intended to help posters get help on coding issues that they're experiencing rather than for getting others to write code for you. I suggest you give it a try first and if it doesn't work - post your efforts so others can assist you. – Component 10 Oct 22 '12 at 12:01
  • @Component10 I have tried it. But it always fails by giving me the wrong information. – user1765216 Oct 22 '12 at 12:09
  • converted the answer below to c++ and published in other SO post: http://stackoverflow.com/a/19835285/1166727 – tony gil Nov 07 '13 at 11:57

1 Answers1

4

This is a code snippet in linux. Hope this will help. I don't know how to convert it to c++.

 * This code will query a ntp server for the local time and display
 * it.  it is intended to show how to use a NTP server as a time
 * source for a simple network connected device.
 * This is the C version.  The orignal was in Perl
 *
 * For better clock management see the offical NTP info at:
 * http://www.eecis.udel.edu/~ntp/
 *
 * written by Tim Hogard (thogard@abnormal.com)
 * Thu Sep 26 13:35:41 EAST 2002
 * Converted to C Fri Feb 21 21:42:49 EAST 2003
 * this code is in the public domain.
 * it can be found here http://www.abnormal.com/~thogard/ntp/
 *
 */
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <time.h>
#include <string.h>

void ntpdate();

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

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

//use Socket;
//
//#we use the system call to open a UDP socket
//socket(SOCKET, PF_INET, SOCK_DGRAM, getprotobyname("udp")) or die "socket: $!";
proto=getprotobyname("udp");
s=socket(PF_INET, SOCK_DGRAM, proto->p_proto);
if(s) {
    perror("asd");
    printf("socket=%d\n",s);
}
//
//#convert hostname to ipaddress if needed
//$ipaddr   = inet_aton($HOSTNAME);
memset( &server_addr, 0, sizeof( server_addr ));
server_addr.sin_family=AF_INET;
server_addr.sin_addr.s_addr = inet_addr(hostname);
//argv[1] );
//i   = inet_aton(hostname,&server_addr.sin_addr);
server_addr.sin_port=htons(portno);
//printf("ipaddr (in hex): %x\n",server_addr.sin_addr);

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

// get the data back
i=recv(s,buf,sizeof(buf),0);
printf("recvfr: %d\n",i);
//perror("recvfr:");

//We get 12 long words back in Network order
/*
for(i=0;i<12;i++)
    printf("%d\t%-8x\n",i,ntohl(buf[i]));
*/

/*
 * 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
//printf("tmit=%d\n",tmit);

/*
 * 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; 
//printf("tmit=%d\n",tmit);
/* 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("Time: %s",ctime(&tmit));
i=time(0);
//printf("%d-%d=%d\n",i,tmit,i-tmit);
printf("System time is %d seconds off\n",i-tmit);
}
Kenny
  • 96
  • 2
  • 11
  • 2
    converted to C++ and published at http://stackoverflow.com/a/19835285/1166727 – tony gil Nov 07 '13 at 11:56
  • Also in C++, [NTPClient](https://github.com/ethanlim/NetworkTimeProtocol) is an elegant alternative for Windows using the boost libraries (make sure to compile and add the paths). As discussed [here](https://stackoverflow.com/a/50719970/5885566), _ntp.flags.mode_ in `unsigned char msg[48]={010,0,0,0,0,0,0,0,0}` and the buffer extraction position in `tmit=ntohl((time_t)buf[4]);` may have to be changed according to your goals. – F1iX Jun 06 '18 at 12:15
  • Further to what F1iX suggested you can check a similar library without the boost asio module in this [link](https://github.com/plusangel/NTP-client). I tested it with chrony server. – angelos.p Jan 15 '20 at 13:27