#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdlib.h>
#include <time.h>
#include <stdio.h>
#include <string.h>
#include "timeIP.h"


/* UDP - Socket    TIME -  CLIENT   */

int main(int argc, char * argv[])
{   
   int sock, lenClient;
   struct sockaddr_in client;
   struct hostent *hp;
   char server_IP_adr[20];

   char dummy[1], strReceiveTime[10];
   unsigned char c0, c1,c2,c3 ;
   unsigned long receiveTime ;
   time_t calcTime;  
   
   /* fuer UDP - Verbindung
      Socket oeffnen        */
   sock = socket( AF_INET, SOCK_DGRAM, 0 );
   if (sock == -1) {
                     perror(" opening DATAGRAM socket !!!");
                     exit(1);
                   }
   
   /* aus dem Adress-String das hostent fuellen */
   strcpy(server_IP_adr, S_IP_ADR );
   hp = gethostbyname(server_IP_adr);
   
   /* testen ob die Struktur gefuellt wurde */
   if (hp == (struct hostent *) 0)
   {
       printf("\n WARNING: Connection to Timeserver %s not possible !!!\n", 
              server_IP_adr);
       printf("          look for local Timeserver !\n");
       /* Wenn der globale Timeserver (Adresse im timeIP.h)
	  nicht ereichbar ist local versuchen              */
       gethostname(server_IP_adr , 20);   /* Name des lokalen Rechners lesen */
       hp = gethostbyname(server_IP_adr); /* Strucktur fuellen               */
       if (hp == (struct hostent *) 0)
       {
	   /* wenn dieser auch nicht erreicht werden kann --> abbrechen ! */
           fprintf(stderr, "\n ERROR: Timeserver not found !!! \n");
           exit(2);
       }
  }

  /* weitere Parameter eintragen */
  client.sin_family = AF_INET;
  memcpy( (char *) &client.sin_addr, (char *) hp->h_addr, hp->h_length );  
  /* Portnummer eintragen */
  client.sin_port = htons (S_PORT);


  /* leeren String an der Timeserver schicken (nach RFC868) */
  dummy[0]='\0';
  if (sendto (sock, dummy, sizeof dummy, 0,
         (struct sockaddr *) &client, sizeof client) == -1)
     perror(" sending DATAGRAM socket name !!!");

  /* 4 Bytes in strReceiveTime vom Server erwarten */ 
  lenClient =sizeof(client);
  if (recvfrom (sock, strReceiveTime, 4, 0,   /* sizeof(strReceiveTime), 0, */
         (struct sockaddr *) &client, &lenClient ) == -1 )
     perror("receiving DATAGRAM socket name !!!"); 

  
  /* char's in unsigned char's umwandeln */
  c0=strReceiveTime[0];
  c1=strReceiveTime[1];
  c2=strReceiveTime[2];
  c3=strReceiveTime[3];
  /* unsigned long berechnen --> in receiveTime stehen die Sekunden
                                 seit dem 1.1.1900, 0 Uhr 0         */
  receiveTime = ( ( c0*256 + c1 )*256 + c2)*256 + c3;

 
  printf(" Sekunden seit 1.1.1900:  %lu \n",receiveTime );
  
  /* Differenz vom 1.1.1900 bis 1.1.1970 = 2208988800 sec  */
  calcTime = (long) (receiveTime - (unsigned long) 2208988800); 
  printf(" Sekunden seit 1.1.1970:   %lu \n",calcTime );
  /* mit ctime(...) wird aus dem Sekunden seit 1970 ein
     Zeitstring berechnet                                  */
  printf(" daraus berechnete Zeit:  %s \n", ctime(&calcTime) );

 /* den Socket wieder schliessen */
 close( sock );
 exit(0);
}
    
