Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 20
  1. #1

    [Socket] Download file interrotto.

    Ciao.. sto creando un programma che, tra le altre cose, deve scaricare alcuni file di estensioni diverse da un server. Ho sfruttato il codice postato qua: http://forum.html.it/forum/showthrea...=&pagenumber=2;
    L'ho trovato molto utile ed efficace.
    Ho 3 problemi:
    1)Ho cambiato però alcune righe:
    codice:
    fo=fopen("file.rar",w+);
    while((e=recv(s, msg_response, 1, 0)) != 0)
      {
       if (e < 0)
        {
         printf("Nessuna risposta - stringa ricevuta - da parte del server\n");
         system("pause");
         return 1;
        }
       fprintf(fo,"%c",msg_response[0]);
       printf("%c",msg_response[0]);
      }
    così mi salva il file. Funziona in parte, in quanto ci sono gli header di risposta del server che non riesco ad eliminare e quindi il file risulta corrotto. Come posso fare?

    2) Ho notato che non termina mai il ciclo: quando il file è completamente scaricato si blocca il tutto. Da cosa potrebbe dipendere?

    3) Se scrivo strcat(msg_enter,"beleriand.servegame.com"); e gethostbyname("beleriand.servegame.com"); il programma non genera errori; ma come sostituisco l'indirizzo con il relativo puntatore host mi restituisce un errore di accesso invalido alla memoria. Eppure come potete vedere la stessa espressione è stata utilizzata più volete...

    Questo è il codice completo:
    Codice PHP:
    #include <stdio.h>
    #include <string.h>
    #include <winsock.h>

    bool Scarica(char *,char *);
    FILE *fo;

    int main()
    {
     
    char file[]="index.php";
     
    char host[]="beleriand.servegame.com";
     
    fo=fopen(file,"w+");
     
    Scarica(file,host);
     
    fclose(fo);
     return 
    1;
    }
    bool Scarica(char *filechar *host)
    {
     
    struct sockaddr_in sock;           //la struttura per il socket

     
    char msg_enter[] = "GET ";
     
    char path[]="/upload/";
     
    strcat(msg_enter,path);
     
    strcat(msg_enter,file);
     
    char protocollo[] = " HTTP/1.1\nHost: ";
     
    strcat(msg_enter,protocollo);
     
    strcat(msg_enter,host); //ERRORE
     
    strcat(msg_enter,"\n\n");
     
    // RICHIESTA FILE
     
    char msg_response[] = "\0";        //la risposta
     
    int e,s,i=0;
     
    struct hostent *ip;                //la struttura per l'indirizzo

     
    WORD wVersionRequested;            //la versione
     
    WSADATA wsaData;
     
    wVersionRequested MAKEWORD(22);//attiva la lib winsock 2.2
     
    WSAStartup(wVersionRequested, &wsaData);   //la starta
     
    if (!= )
      {
       
    printf("Impossibile trovare la Winsock DLL\n");
       
    system("pause");
       return 
    1;
      }
     
    socket(AF_INETSOCK_STREAM0);//crea il socket
     
    if (0)
      {
       
    printf("Impossibile creare la Socket\n");
       
    system("pause");
       return 
    1;
      }
     
    ip gethostbyname(host); // ERRORE
     
    if (! ip)
     {
      
    printf("Indirizzo non valido o mancata cannessione\n");
      
    system("pause");
      return 
    1;
     }
     
    memset(&sock0sizeof(sock));
     
    sock.sin_family AF_INET;         // tipo di indirizzo ...... di solito sempre AF_INET
     
    sock.sin_port htons(80);         // Porta
     
    memcpy(&sock.sin_addrip->h_addrip->h_length);//copia l'indirizzo nella struttura socket
     
    connect(s, (struct sockaddr *)&socksizeof(sock));//associa al socket s la struttura socket
     
    if (0)
      {
       
    printf("Impossibile stabilire la connessione\n");
       
    system("pause");
       return 
    1;
      }
     
    printf("Inviato al server:\n\n%s\n"msg_enter);
     
    send(smsg_enterstrlen(msg_enter) + 10);//invia dati
     
    if (0)
      {
       
    printf("Impossibile inviare la stringa al server\n");
       
    system("pause");
       return 
    1;
      }

     
    printf("Ricevuto dal server:\n\nIn download ");
     while((
    e=recv(smsg_response10)) != 0)
      {
       
    i++;
       if (
    0)
        {
         
    printf("Nessuna risposta - stringa ricevuta - da parte del server\n");
         
    system("pause");
         return 
    1;
        }
       
    //if(i==100000) { printf("."); i=0; }
       
    fprintf(fo,"%c",msg_response[0]);
       
    printf("%c",msg_response[0]);
      }
     
    printf("Completato!\n");
     
    shutdown(s2);
     if (
    0)
      {
       
    printf("Mancata disconnessione con il server\n");
       
    system("pause");
       return 
    1;
      }
     
    closesocket(s);
     if (
    0)
      {
       
    printf("Impossibile chiudere la socket\n");
       
    system("pause");
       return 
    1;
      }
     
    WSACleanup();
     
    system("pause");
     return 
    1;

    Grazie mille per ogni aiuto (anche minimo)

  2. #2
    Dimenticavo

    l'errore n° 3 si presenta solo con Borland C++Builder 5, mentre con Dev-Cpp non appare.


  3. #3
    Utente di HTML.it L'avatar di buba88
    Registrato dal
    Feb 2004
    Messaggi
    538
    mmm ho provato a riscriverlo e sembra funzionare, l'unico problema rimasto è quello degli header, ci vorrebbe un modo sicuro per determinare quali sono gli header del server.

    ho usato il dev-c++

    ecco il codice:

    codice:
    #include <stdio.h> 
    #include <winsock.h> 
    #include <stdlib.h>
    #include <string.h>
    
    bool scarica(char *fileremoto,char *filelocale,char *host){
    	FILE *fo; 
    	struct sockaddr_in sock; 		//la struttura per il socket
    	struct hostent ip; 				//la struttura per l'indirizzo 
            char msg_enter[200] = "GET ";
    	char protocollo[] = " HTTP/1.1\nHost: ";
    	char msg_response[] = "\0";
    	int s;
    	
            fo=fopen(filelocale,"w+"); 
    	
       	strcat(msg_enter,fileremoto);
       	strcat(msg_enter,protocollo);
       	strcat(msg_enter,host);
       	strcat(msg_enter,"\n\n"); 
    
       	WORD wVersionRequested; //la versione
    	WSADATA wsaData;
    	wVersionRequested = MAKEWORD(2, 2); //attiva la lib winsock 2.2
    	WSAStartup(wVersionRequested, &wsaData); //la starta
    	
    	s = socket(AF_INET, SOCK_STREAM, 0); //crea il socket
    	ip = *(gethostbyname(host)); // INDIRIZZO 
    	printf("\n");
    	
    	sock.sin_family = AF_INET; // tipo di indirizzo ...... di solito sempre AF_INET 
    	sock.sin_port = htons(80); // PORTA 
    	memcpy(&sock.sin_addr, ip.h_addr, ip.h_length); //copia l'indirizzo nella struttura socket
    	
    	connect(s, (struct sockaddr *)&sock, sizeof(sock)); //associa al socket s la struttura socket
    	printf("Inviato al server:\n\n%s\n", msg_enter); 
    	send(s, msg_enter, strlen(msg_enter) + 1, 0); //invia dati
    	printf("Download in corso...\n\n");
        while(recv(s, msg_response, 1, 0) != 0) { 
       		fprintf(fo,"%c",msg_response[0]); 
         	Sleep(1);  
        }
    	printf("File Ricevuto\n");
    	
    	fclose(fo);
    } 
    
    int main(){
    	
    	char file_remoto[] = "/index.php"; // nome del file remoto
    	char host[]= "btsmt.altervista.org";
    	char file_locale[] = "index.php";  // nome del file su cui salvare i dati in locale
    	
        scarica(file_remoto,file_locale,host);
     	system("PAUSE");	
    }
    se c'è qualcuno che ha qualche idea per eliminare gli header si facesse avanti!!

  4. #4
    Perfetto Ora funziona sia con Dev-cpp che con C++Builder anche riaggiungendo il controllo degli errori.

    Ora cerco di trovare il modo di eliminare questi maledetti header. Sarà un'impresa mooolto ardua VVoVe:

    e grazie!

  5. #5
    Utente di HTML.it L'avatar di buba88
    Registrato dal
    Feb 2004
    Messaggi
    538
    sono riuscito a modificare il prog per eliminare gli header. io l ho provato su altervista, andrebbe provato su altri server.

    alla base del "filtro" sta il fatto che dopo gli header, il server manda un comando di invio a capo due volte ("\r\n\r\n")

    il programma non scrive niente sul file finche non incontra la prima occorrenza di \r\n\r\n, dopodichè scrive tutto

    è un modo abbastanza "artigianale", se qualcuuno ne ha elaborato uno migliore sarà bene accetto

    ciaozzz

    ecco il codice:

    codice:
    #include <stdio.h> 
    #include <winsock.h> 
    #include <stdlib.h>
    #include <string.h>
    
    bool scarica(char *fileremoto,char *filelocale,char *host){
    	FILE *fo; 
    	struct sockaddr_in sock; 		//la struttura per il socket
    	struct hostent ip; 				//la struttura per l'indirizzo 
    	bool header = true;
    	bool invio = false;
    	char ultimo_carattere = '\0';
        char msg_enter[200] = "GET ";
    	char protocollo[] = " HTTP/1.1\nHost: ";
    	char msg_response[] = "\0";
    	int s;
    	
        fo=fopen(filelocale,"w+"); 
    	
       	strcat(msg_enter,fileremoto);
       	strcat(msg_enter,protocollo);
       	strcat(msg_enter,host); //ERRORE
       	strcat(msg_enter,"\n\n"); 
    
       	WORD wVersionRequested; //la versione
    	WSADATA wsaData; //???? 
    	wVersionRequested = MAKEWORD(2, 2); //attiva la lib winsock 2.2
    	WSAStartup(wVersionRequested, &wsaData); //la starta
    	
    	s = socket(AF_INET, SOCK_STREAM, 0); //crea il socket
    	ip = *(gethostbyname(host)); // INDIRIZZO 
    	printf("\n");
    	
    	sock.sin_family = AF_INET; // tipo di indirizzo ...... di solito sempre AF_INET 
    	sock.sin_port = htons(80); // PORTA 
    	memcpy(&sock.sin_addr, ip.h_addr, ip.h_length); //copia l'indirizzo nella struttura socket
    	
    	connect(s, (struct sockaddr *)&sock, sizeof(sock)); //associa al socket s la struttura socket
    	printf("Inviato al server:\n\n%s\n", msg_enter); 
    	send(s, msg_enter, strlen(msg_enter) + 1, 0); //invia dati
    	printf("Download in corso...\n\n");
        while(recv(s, msg_response, 1, 0) != 0) { 
        	if (!header) fprintf(fo,"%c",msg_response[0]); 
        	if (ultimo_carattere == 13 && msg_response[0] == 10 && invio==true) header=false;
        	(ultimo_carattere == 13 && msg_response[0] == 10) || (ultimo_carattere==10 && invio)?invio = true:invio=false;
        	ultimo_carattere = msg_response[0];
       		 
        }
    	printf("File Ricevuto\n");
    	
    	fclose(fo);
    } 
    
    int main(){
    	
    	char file_remoto[] = "/index.php"; // nome del file remoto
    	char host[]= "btsmt.altervista.org";
    	char file_locale[] = "index.php";  // nome del file su cui salvare i dati in locale
    	
        scarica(file_remoto,file_locale,host);
     	system("PAUSE");

  6. #6
    Utente di HTML.it L'avatar di buba88
    Registrato dal
    Feb 2004
    Messaggi
    538
    mmm ho notato però che a volte prima del contenuto del file scrive alcuni caratteri (ad es. 10ce)

    adesso mi metto all'opera per vedere come risolvere

    ciauz

  7. #7
    Utente di HTML.it L'avatar di buba88
    Registrato dal
    Feb 2004
    Messaggi
    538
    mmm ho esaminato un po di pagine prese da vari server e ho notato che quei numerini compaiono sempre DOPO gli header e prima del file vero e proprio.

    se nn sbaglio però compaiono solo nei file html, infatti ho provato con un .txt e non compare.....
    mmmmm

  8. #8
    Con il tuo algoritmo elimino correttamente gli header...però il file continua a risultare danneggiato (sto scaricando un .rar ) eppure se confronto i 2 file aprendoli con contex sono identici...

    controllerò meglio!

  9. #9
    Per controllare ho creato questo banale programmino... apre i 2 file e confronta carattere per carattere:
    codice:
    #include <string.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    FILE *fo,*fs;
    char orig,serv;
    int i=0;
    
    int main()
     {
      fo=fopen("OrigStatici.rar","r"); //File originale
      fs=fopen("ServStatici.rar","r"); //File copiato dal server
      printf("Inizio a confrontare...\n");
      while((fscanf(fo,"%c",&orig)!=EOF)&&(fscanf(fs,"%c",&serv)!=EOF))
       {
        if(orig!=serv) {printf("Caratteri diversi alla posizione %d\n",i);}
        i++;
       }
      printf("Confronto completato.\n");
      system("pause");
     }
    Se sono diversi scrive quale carattere è errato altrimenti esce senza output particolari.

    Purtroppo i 2 file rar che ho confrontato sono identici, ma uno è corrotto.... :master: Che diamine può essere?


  10. #10
    Up...

    qualche consiglio? Io sono in un vicolo cieco


Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.