int main(int argc, char **argv) ???



  • Hallo,
    ich habe ein kleines SNTP Programm welches ich von der Konsole mit einem zusätlichem Parameter (IP Adresse) aufrufe.

    c:\sntpcli.exe 123.123.123.123

    Ich will nun dieses Programm so abändern, das es ohne den zusätzlichen Parameter aufrufbar ist.

    Ich versuche schon seit mehreren Stunden die IP Adresse in der main() zu deklarieren.

    Kann mir da jemand bitte helfen!

    int main(int argc, char **argv)
    {
       int result;
    
       if (argc != 2)
       {
       	printf("\nUsage: %s <server-ip>\n", argv[0]);
            return 0;
       }
    
       // prepare the structures
    	memset(&sntphdr, 0, sizeof(SNTPHDR));
    	memset(&recvhdr, 0, sizeof(SNTPHDR));
       setversion(3, &sntphdr);
       setmode(3, &sntphdr);
    
       // send request to NTP server and receive response
       sd = opensocket(SOCK_DGRAM, &error);
       if (sd == API_ERROR)
       {
          #ifdef _DEBUG_
          printf("\nOpen socket error: %d!!!\n", error);
          #endif
          return 0;
       }
       inet_addr(argv[1], &ip); // parameter 1 = server ip address
       saddr.sin_family      = AF_INET;
       saddr.sin_port        = htons(123); // NTP port 123
       saddr.sin_addr.s_addr = ip;
       result = sendto(sd, (char*)&sntphdr, sizeof(SNTPHDR), MSG_BLOCKING, (struct sockaddr*)&saddr, &error);
       if (result == API_ERROR)
       {
          #ifdef _DEBUG_
          printf("\nSend error: %d!!!\n", error);
          #endif
          return 0;
       }
       memset(&addr, 0, sizeof(struct sockaddr));
       addr.sin_family = AF_INET;
       result = recvfrom(sd, (char*)&recvhdr, sizeof(SNTPHDR), MSG_TIMEOUT, 10000l, (struct sockaddr*)&addr, &error);
       closesocket(sd, &error);
       if (result == 0)
       {
          #ifdef _DEBUG_
          printf("\nTimeout!!!\n");
          #endif
          return 0;
       }
    
       // date and time translation
       datetime = recvhdr.Transmit_Timestamp1;
       tmp = (datetime & 0xFF000000l) >> 24;  // *******************************
       tmp |= (datetime & 0x00FF0000l) >> 8;  //  translate it in the right
       tmp |= (datetime & 0x0000FF00l) << 8;  //  format
       tmp |= (datetime & 0x000000FFl) << 24; // *******************************
       datetime = tmp - CLOCK_OFFSET_1970;
       unixtodos(datetime, &dt, &tm);
    
       // Timezone Correction
       if( (dt.da_year % 400) == 0 ) schrikkel = 1;
       else {
       	if( (dt.da_year % 100) == 0 ) schrikkel = 0;
          else{
          	if( (dt.da_year % 4) == 0 ) schrikkel = 1;
             else schrikkel = 0;
          }
       }
    
       if( tm.ti_hour+TIMEZONE < 23 ) tm.ti_hour = tm.ti_hour + TIMEZONE;
       else
       {
    
       	tm.ti_hour = (tm.ti_hour + TIMEZONE) - 24;
          dt.da_day++;
          if( dt.da_mon == 2 ) {
          	if ( schrikkel == 1 && dt.da_day == 30 ) { dt.da_day = 1; dt.da_mon++; }
             if ( schrikkel == 0 && dt.da_day == 29 ) { dt.da_day = 1; dt.da_mon++; }
          }
          else {
          	if( dt.da_day == 32 && (dt.da_mon & 0x01) == 1 ){ dt.da_day = 1; dt.da_mon++; }
          	if( dt.da_day == 31 && (dt.da_mon & 0x00) == 0 ){ dt.da_day = 1; dt.da_mon++; }
          	if( dt.da_mon == 13 ) { dt.da_year++; dt.da_mon = 1; }
          }
       }
    
       printf("Time: %02d:%02d:%02d\n", tm.ti_hour, tm.ti_min, tm.ti_sec);
       printf("Date: %d %s %d\n", dt.da_day, month[dt.da_mon], dt.da_year);
    
       // set date
       inregs.h.ah = 0x2B;
       inregs.x.cx = dt.da_year;
       inregs.h.dh = dt.da_mon;
       inregs.h.dl = dt.da_day;
       int86(0x21, &inregs, &outregs);
    
       // set time
       inregs.h.ah = 0x2D;
       inregs.h.ch = tm.ti_hour;
       inregs.h.cl = tm.ti_min;
       inregs.h.dh = tm.ti_sec;
       int86(0x21, &inregs, &outregs);
    
    	return 0;
    }
    

    Danke Uli Greiner



  • Was genau ist das Problem? Du musst dir einfach ein char-Array deklarieren und mit deiner Standard-IP-Adresse initialisieren (als Text). Anstatt argv[1] verwendest du dann hald dein char-Array. Und die Abprüfung von argc musst du natürlich auch rausschmeissen ;).


Anmelden zum Antworten