// Gibt die Uhrzeit von einem SNTP-Server aus / richard / 2010 // der Schalter /s versucht die Uhrzeit auf dem Client zu übernehmen #include #include #include #include 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; }