InternetReadFile liest zuviele Zeichen



  • Hallo,
    ich habe ein simples PHP Script auf nem Webserver mit folgendem Code:

    <?php
      echo (date("G:i:s"));
      ?>
    

    Dieses Script gibt mir die aktuelle Uhrzeit aus.
    Jetzt will ich das mein Programm die Uhrzeit von dem Server "zieht":

    int main() {
       HINTERNET inet,hFile;
       char *ptr=NULL,*p=NULL;
       int err,available,bytes;
    
           inet = InternetOpen("MyOwnProgram",INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0);
    	   hFile = InternetOpenUrl(inet,"Meinserver.de\script.php",NULL,0,0,0);
    
    InternetQueryDataAvailable(hFile,&available,0,0);
    ptr = malloc(available);
    
       memset(ptr,0,sizeof(ptr));
    
    	   	do {
    			  Sleep(100);
    
    			err = InternetReadFile(hFile,ptr,available,&bytes);
    
    			 if(bytes == 0)
    			   break;
    
    		}while(err == TRUE);
    
              printf("Uhrzeit: %s\n",ptr);
    
        free(ptr);
    	ptr = NULL;
    
    	return 0;
    }
    

    Das Programm gibt mir die korrekte Uhrzeit aus nur sind dahinter viele ²²²²²²²:

    16:36:24²²²²

    Wie kriege ich den die ganzen ²²²² Weg?



  • Ok habe das ganze jetzt mal so probiert und so klappt es:

    int main() {
       HINTERNET inet,hFile;
       char *ptr=NULL,buf[512],*p=NULL,time[24];
       int err,available,bytes,len,i;
    
             memset(time,0,sizeof(time));
    
           inet = InternetOpen("MyOwnProgram",INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0);
    	   hFile = InternetOpenUrl(inet,"Meinserver.de\script.php",NULL,0,0,0);
    
    			InternetQueryDataAvailable(hFile,&available,0,0);
    			ptr = malloc(available);
    
    			  if(ptr) {
    
    	   				do {
    						  Sleep(100);
    
    						     err = InternetReadFile(hFile,ptr,available,&bytes);
    
    							 if(bytes == 0)
    							   break;
    
    						}while(err == TRUE);
    
    						    strncpy(time,ptr,available);
    
    							  printf("Uhrzeit: %s\n",time);
    
    								free(ptr);
    								ptr = NULL;
    
    			  }
    
    	return 0;
    }
    

    Aber kann mir jemand sagen warum mein 1 Anlauf verkehrt war?



  • Hi,

    InternetReadFile setzt keine Null-Terminierung. Statt dem strncpy hättest Du auch einfach:

    ptr[available-1] = 0;
    

    verwenden können (performanter).

    Kann aber sein, dass Du Dir Deine Uhrzeit damit vorher "abschneidest", weil Du schon bei malloc nicht genug Speicher für die Null-Terminierung reservierst (habs gerade nicht ausprobiert und die Beschreibung von InternetReadFile deutet eher auf "\0 wird nicht beachtet" hin). Also gönn' Dir ggfs. noch ein Element mehr 😉 .


Anmelden zum Antworten