Uhrzeit von einem SNTP-Server holen

dabei wird TCP-Port 37 abgefragt und das Ergebnis angezeigt.
Voraussetzung ist, dass die Firewall die Anfrage zulässt.
Der Schalter „-s“ versucht die Zeit zu übernehmen. Dazu sind Administratorrechte erforderlich.

getSNTPTime.exe ptbtime2.ptb.de
getSNTPTime.exe -s ptbtime2.ptb.de

Ausgabe:

getsntptime.exe mysntpserver
Serverzeit : Fri Jul 15 13:59:10 2011
getSNTPTime.c
// Gibt die Uhrzeit von einem SNTP-Server aus / richard / 2010
// der Schalter /s versucht die Uhrzeit auf dem Client zu übernehmen
#include <windows.h>
#include <winsock.h>
#include <time.h>
#include <stdio.h>
 
SYSTEMTIME st; 	//windowskonforme Zeitstruktur
struct tm lcctm;		//lcc konforme struktur für umwandlung
time_t t = 0;			//Long Wert vom Zeitserver
int s; 					//Rückgabe des socket
struct sockaddr_in a;
struct hostent *h;
WSADATA wsaData;
 
//---------------------------------------------------------------
time_t HolZeit(char **vect)
{
		t = 0;//time(NULL);
 
	if (WSAStartup(0x101,&wsaData))
		{
			printf("Winsocklibrary kann nicht gestartet werden\n");
			return 1;
		}
		h=gethostbyname(vect[1]);
		if (h==NULL)
		{
			printf("ich kann den Hostnamen nicht aufloesen\nMoegliche Fehler :\n");
			printf("- keine Internetverbindung,versuchen Sie den Rechner anzupingen\n");
			printf("- Ihr Proxy oder Ihre Firewall laesst den Port 37 nicht passieren \n");
			printf("- der Timeserver ist ausgefallen \n");
			WSACleanup();
			exit (1);
		}
		a.sin_family = AF_INET;
		a.sin_port = htons(37);
		memcpy(&(a.sin_addr.s_addr),h->h_addr,sizeof(int));
		s = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
		if (s == 0)
		{
			printf("ich kann keine Verbindung herstellen Fehler: %d\n",WSAGetLastError());
			WSACleanup();
			return 1;
		}
		if (connect(s,(struct sockaddr *)&a,sizeof(a)))
		{
			printf("ich kann keine Verbindung herstellen Fehler: %d\n",WSAGetLastError());
			WSACleanup();
			return 1;
		}
		if (recv(s,(char *)&t,4,0) !=4 )
			printf("ich bekomme keine vernuenftige Zeit zurück\n");
		else
		{	//	memset (&t,0,sizeof(time_t));
			//	t = time(NULL);
			t = ntohl(t) - 2208988800;	//Sekunden von 1900 bis 1970
			//	printf("%ld\n",&t);
			printf("Serverzeit : %s\n",asctime(localtime(&t)));
		}
		closesocket(s);
	WSACleanup();
return t;
}
 
//-----------------------------------------------------------------------
 
BOOL SetzeZeit(SYSTEMTIME sz,time_t t )
{
		lcctm 				 = *localtime(&t);
		sz.wYear 			 =	(WORD)lcctm.tm_year + 1900;
		sz.wMonth		 =	(WORD)lcctm.tm_mon  + 1 ; //tm beginnt bei Monat 0,st beginnt bei Monat 1
		sz.wDayOfWeek = (WORD)lcctm.tm_wday;
		sz.wDay 			 =	(WORD)lcctm.tm_mday;
		sz.wHour 			 =	(WORD)lcctm.tm_hour;
		sz.wMinute 		 =	(WORD)lcctm.tm_min;
		sz.wSecond 		 =	(WORD)lcctm.tm_sec;
 
 
	if (!SetLocalTime(&sz))
		{
			printf("Fehler in SetSystemTime %ld\n",GetLastError());
		}
		printf("\n\n");
		printf("Jahr %d  Monat %d  Wochentag %d   Tag %d  ",sz.wYear,sz.wMonth,sz.wDayOfWeek,sz.wDay);
		printf("Stunde  %d  Minute %d  Sekunde %d \n\n",sz.wHour,sz.wMinute,sz.wSecond);
 
return 0;
}
 
//-------------------------------------------------------------------------
 
int main(int argc , char **argv)
{
	GetSystemTime(&st);//PC-Zeit holen und st-Struktur füllen
 
	if (argc == 1)
	{	printf("\n\nPC - Zeitsetzer V1.0 copyright richard@borwinius.de 2002\n\n");
		printf("Nur Anzeige der Serverzeit : %s hostname \n",argv[0]);
		printf("Beispiel  : %s ptbtime1.ptb.de\n",argv[0]);
		printf("( Dieser Server ist die Physikalisch-Technische Bundesanstalt in Braunschweig )\n");
		printf("Serverzeit  uebernehmen : %s hostnahme /s\n",argv[0]);
		printf("Beispiel : %s time.rz.uni-duesseldorf.de /s\n",argv[0]);
		return 0;
	}
 
	if (argc == 2)
 
	{
		HolZeit(argv); //Nur Zeit anzeigen
		return 0;
	}
 
	if ((argc == 3 ) || ( argc > 2 ))
	{
		if ((strcmp(argv[2],"-s")) || ((strcmp(argv[2],"/s"))))
			{
			printf("\nOK ! Zeit setzen !\n");
			t = HolZeit(argv); // Zeit anzeigen
 
			SetzeZeit(st,t); //Zeit am lokalen PC ändern
			}
 
	}
return 0;
}