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