NTIME.C
上传用户:better800
上传日期:2022-06-13
资源大小:1853k
文件大小:4k
源码类别:

TCP/IP协议栈

开发平台:

DOS

  1. /******************************************************************************
  2.     NTIME - set dos clock from internet
  3.             see RFC 868
  4.     Copyright (C) 1991 Erick Engelke
  5.     portions Copyright (C) 1990, National Center for Supercomputer Applications
  6.     This program is free software; you can redistribute it and/or modify
  7.     it, but you may not sell it.
  8.     This program is distributed in the hope that it will be useful,
  9.     but without any warranty; without even the implied warranty of
  10.     merchantability or fitness for a particular purpose.
  11.         Erick Engelke                   or via E-Mail
  12.         Faculty of Engineering
  13.         University of Waterloo          Erick@development.watstar.uwaterloo.ca
  14.         200 University Ave.,
  15.         Waterloo, Ont., Canada
  16.         N2L 3G1
  17. ******************************************************************************/
  18. #include <stdio.h>
  19. #include <stdlib.h>
  20. #include <dos.h>
  21. #include <time.h>
  22. #include <tcp.h>
  23. #define TCP_TIME 1
  24. /* Notes:
  25.  * The time is the number of seconds since 00:00 (midnight) 1 January 1900
  26.  * GMT, such that the time 1 is 12:00:01 am on 1 January 1900 GMT; this
  27.  * base will serve until the year 2036.
  28.  *
  29.  * For example:
  30.  *
  31.  *     2,208,988,800L corresponds to 00:00  1 Jan 1970 GMT, start of UNIX time
  32.  *
  33.  */
  34. #define TIME_PORT 37
  35. #define BASE_TIME 2208988800L
  36. /*
  37.  * ntime() given the host address, returns an Internet based time, not an
  38.  *         UNIX or DOS time.  The UNIX time may be derived by subtracting
  39.  *    BASE_TIME from the returned value.
  40.  */
  41. long ntime( longword host )
  42. {
  43.     static tcp_Socket telsock;
  44.     tcp_Socket *s;
  45.     int status;
  46.     long temptime;
  47.     s = &telsock;
  48.     status = 0;
  49.     temptime = 0L;
  50. #ifdef TCP_TIME
  51.     if (!tcp_open( s, 0, host, TIME_PORT, NULL )) {
  52. puts("Sorry, unable to connect to that machine right now!");
  53. return( 1 );
  54.     }
  55.     printf("waiting...r");
  56.     sock_wait_established(s, sock_delay , NULL, &status);
  57.     printf("connected n");
  58. #else
  59.     if (!udp_open( s, 0, host, TIME_PORT, NULL )) {
  60. puts("Sorry, unable to connect to that machine right now!");
  61. return( 1 );
  62.     }
  63.     sock_write( s, "n", 1 );
  64. #endif TCP_TIME
  65.     while ( 1 ) {
  66. sock_tick( s, &status );
  67. if (sock_dataready( s ) >= 4 ) {
  68.     sock_read( s, (byte *)&temptime, sizeof( long ));
  69.     temptime = ntohl( temptime ); /* convert byte orderring */
  70.     sock_close( s );
  71. #if 1
  72. return( temptime );             /* TODO: ??? */
  73. #else
  74.     sock_wait_closed( s, sock_delay, NULL, &status );
  75.     break;
  76. #endif
  77. }
  78.     }
  79. sock_err:
  80.     switch (status) {
  81. case 1 : /* foreign host closed */
  82.  return( temptime );
  83. case -1: /* timeout */
  84.  printf("nConnection timed out!");
  85.  return( 0 );
  86. default: printf("Aborting");
  87.  return( 0 );
  88.     }
  89. }
  90. int main(int argc, char **argv )
  91. {
  92.     longword host;
  93.     longword newtime;
  94.     longword addminutes;
  95.     struct date dstruct;
  96.     struct time tstruct;
  97.     if (argc < 2) {
  98. puts("   DAYTIME  server  [addminutes]");
  99. exit( 3 );
  100.     }
  101.     if (argc == 3 )
  102. addminutes = atol( argv[2] ) * 60L;
  103.     else
  104. addminutes = 0L;
  105.     sock_init();
  106.     if ( (host = resolve( argv[1])) != 0uL ) {
  107. if ( (newtime = ntime( host )) != 0uL ) {
  108.     newtime = newtime - BASE_TIME + addminutes; /* now in UNIX format */
  109.     unixtodos( newtime, &dstruct, &tstruct );
  110.     settime( &tstruct );
  111.     setdate( &dstruct );
  112.     printf("Time set to %s", ctime( (time_t *)&newtime ));
  113.     exit( 0 );
  114. }
  115. printf("Unable to get the time from that hostn");
  116. exit( 1 );
  117.     }
  118.     printf("Could not resolve host '%s'n", argv[1]);
  119.     exit( 3 );
  120.     return (0);  /* not reached */
  121. }