note: lo Sleep() dell'invio serve solo per i test fatti nella stessa macchina, la "lentezza" delle connessioni internet fa gia da sleep nel caso dell'utilizzo in rete ;)

RICEZIONE:


void ricezione_file(char *sNomefile, SOCKET sockinvio) {

    int nBytesP;
    char filebuffer[4000];

    FILE *file;
    file = fopen (sNomefile,"wb");

    //ricezione lunchezza file
    nBytesP = recv(sockinvio, filebuffer, BUFFERSIZE, 0);
    filebuffer[nBytesP] = '\0';
    long fSize = atoi(filebuffer);

#ifdef DEBUG_MODE
                printf("lunghezza file: %d\n",fSize);
#endif

    int nPacchetti = 0;

//    for(int x = 0; x <= fSize/512 ;x++){ //scriviamo tutto il file...
      while(true){ //scriviamo tutto il file...

        nPacchetti++;
        strcpy(filebuffer,"");
        nBytesP = recv(sockinvio,filebuffer, BUFFERSIZE, 0); //ricezione dati

        if (nBytesP == 1 && filebuffer[0]=='a') break;


#ifdef DEBUG_MODE
                printf("ricevuti: %d pacchetto n: %d\n",nBytesP,nPacchetti);
#endif

        filebuffer[nBytesP] = '\0';
        fwrite(filebuffer,1,nBytesP,file);  
    }

#ifdef DEBUG_MODE
                printf("npacchetti rivevuti %d\n",nPacchetti);
#endif

    fclose (file);
        
}


INVIO:

int invio_file(char *sNomefile,SOCKET sockinvio){

    //int nBytesP;
    char filebuffer[4000];

    FILE *file = fopen(sNomefile,"rb");

    if (file==NULL) return 0;

    fseek (file , 0 , SEEK_END);
    long lSize = ftell (file);
    rewind (file);
    printf("lunghezza file: %d bytes\n",lSize);

    // invio della lunghezza del file
    SendTo(sockinvio,int_to_char(lSize));

    int percentuale = 0;
    int percentuale2 = 0;

    int byte_di_resto = lSize/512;

    Sleep(2000);


    for(long x = 0; x <= lSize/512 ; x++) {
        
        Sleep(1);

        strcpy(filebuffer,"");

        percentuale = x*100/(lSize/512);
        if (percentuale != percentuale2) {
            printf("%d %% 100\n",percentuale); percentuale2 = percentuale;
        }
        
        int nRead = fread( filebuffer, 1, 512, file);
        //printf("letti: %d pacchetto: %d\n",nRead,x);
        filebuffer[nRead] = '\0';
        send(sockinvio, filebuffer,nRead,0);
    }

        Sleep(2000);
        send(sockinvio, "a",1,0); //chiudi ricezione

    fclose(file);


#ifdef DEBUG_MODE
                printf("numero pacchetti inviati: %d",x);
                system("pause");
#endif

    return 1;
}