///////////////////////////////////////// // simple windows client to be used in // adjusting system clock to server clock // // main algorithm: // James Maxlow // // generic socket processes (modified): // Douglas E. Comer ///////////////////////////////////////// #include #include #include #include #include #include #include #include void TCPdaytime(const char *, const char *); void errexit(const char *, ...); SOCKET connectTCP(const char *, const char *); #define LINELEN 128 #define WSVERS MAKEWORD(2, 0) int main(int argc, char *argv[]) { char *host = "localhost"; /* host to use if none supplied */ char *service = "9090"; /* default service port */ WSADATA wsadata; switch (argc) { case 1: host = "localhost"; break; case 3: service = argv[2]; /* FALL THROUGH */ case 2: host = argv[1]; break; default: fprintf(stderr, "usage: TCPdaytime [host [port]]\n"); exit(1); } if (WSAStartup(WSVERS, &wsadata) != 0) errexit("WSAStartup failed\n"); TCPdaytime(host, service); WSACleanup(); return 0; /* exit */ } void TCPdaytime(const char *host, const char *service) { ///////////////////////////////////////////// /* used for calculating propagation delays */ ///////////////////////////////////////////// double propdelays[10]; double sum; double avgpropdelay; double maxpropdelay; double minpropdelay; int propdelaycount = 15; ////////////////////////////////////// /* client and server time variables */ ////////////////////////////////////// double going, coming; /* for measuring prop delay */ int dst = 3600; /* set to 3600 or 0 for d.s.t. */ int timezonediff = -18000; /* adjust for local timezone */ int serverdayportion = 0; /* server seconds elapsed in current day */ int settimetohours = 0; /* correct client time */ int settimetominutes = 0; /* correct client time */ int settimetoseconds = 0; /* correct client time */ int settimetomilliseconds = 0; /* correct client time */ //////////////////////////////////////////////////////// /* used to hold server times as strings and long ints */ //////////////////////////////////////////////////////// char messagereply[150]; char serversecstring[32]; char serverusecstring[32]; long serverseclong; long serveruseclong; int i = 0; int j, k; char buf[LINELEN+1]; /* buffer for one line of text */ SOCKET s; /* socket descriptor */ int cc; /* recv character count */ s = connectTCP(host, service); /////////////////////////////////////// /* send message loop for prop delays */ /////////////////////////////////////// for (i=0; i maxpropdelay) maxpropdelay = propdelays[i]; else if (propdelays[i] < minpropdelay) minpropdelay = propdelays[i]; } avgpropdelay = (sum-maxpropdelay-minpropdelay)/double(propdelaycount-2); ///////////////////////////////////////////////////////// /* now ask server for time in seconds and microseconds */ ///////////////////////////////////////////////////////// /* send junk message to the server PORT on machine HOST */ if (send(s, "123", 3, 0) == -1) { perror("send"); exit(1); } /* wait for a message to come back from the server */ if (recv(s, messagereply, 70, 0) == -1) { perror("recv"); exit(1); } closesocket(s); ///////////////////////////// /* parse server time reply */ ///////////////////////////// j = 0; while (messagereply[j] != ' ') { serversecstring[j]=messagereply[j]; j++; } // end while serversecstring[j]='\0'; j = j+3; k = 0; while (messagereply[j] !='\0') { serverusecstring[k]=messagereply[j]; k++; j++; } // end while serverusecstring[k]='\0'; ////////////////////////////////////////////////////////// /* change server time strings to long ints and break up */ ////////////////////////////////////////////////////////// serverseclong = atol(serversecstring); serveruseclong = atol(serverusecstring); serverdayportion = serverseclong%86400 + timezonediff + dst; if (serverdayportion < 0) serverdayportion = serverdayportion + 86400; /* accout for early morning GMT */ settimetohours = serverdayportion/3600; settimetominutes = (serverdayportion%3600)/60; settimetoseconds = serverdayportion%60; settimetomilliseconds = serveruseclong/1000.0 + avgpropdelay/1000000.0; SYSTEMTIME hey; GetSystemTime(&hey); hey.wHour = settimetohours; hey.wMinute = settimetominutes; hey.wSecond = settimetoseconds; hey.wMilliseconds = settimetomilliseconds; SetSystemTime(&hey); }