2010-08-10 5 views
0

J'essaie donc de créer une méthode de transfert de fichiers simple. Cela fonctionne complètement pour les petits fichiers (quelques octets). Mais si je veux transférer un fichier avec une taille de 2 Ko, il renvoie des caractères Unicode au lieu de ce qui est dans le fichier.Transfert de fichiers renvoie des caractères étranges

Serveur:


void DownloadFile(SOCKET Socket){ 
    if(Socket == NULL){ 
     return; 
    } 
    while(1){ 
     char filename[1024]; 
     recv(Socket, filename, sizeof(filename), 0); 
     if(filename[0] == '.'){ 
      break; 
     } 
     FILE* fp = fopen(filename, "r"); 
     fseek(fp, 0, SEEK_END); 
     long FileSize = ftell(fp); 
     char GotFileSize[1024]; 
     _itoa_s(FileSize, GotFileSize, 10); 
     send(Socket, GotFileSize, 1024, 0); 
     rewind(fp); 


     long SizeCheck = 0; 
     char* mfcc; 

     if(FileSize > 1499){ 
      mfcc = (char*)malloc(1500); 
      while(1){ 
       if(SizeCheck >= FileSize){ 
        fclose(fp); 
        Sleep(500); 
        free(mfcc); 
        break; 
       } 
       fread_s(mfcc, 1499, sizeof(char), 1499, fp); 
       send(Socket, mfcc, FileSize, 0); 
       SizeCheck += strlen(mfcc); 
      } 
     } 
     else{ 
      mfcc = (char*)malloc(FileSize + 1); 
      fread_s(mfcc, FileSize, sizeof(char), FileSize, fp); 
      send(Socket, mfcc, FileSize, 0); 
      fclose(fp); 
      Sleep(500); 
      free(mfcc); 
     } 
    } 
    return; 
}

Client:


void DownloadFile(SOCKET Socket){ 
    if(Socket == NULL){ 
     return; 
    } 
    while(1){ 
     printf("Input local filename: "); 
     char localfile[1024]; 
     gets_s(localfile, 1024); 
     if(localfile[0] == '.'){ 
      send(mySocket, localfile, sizeof(localfile), 0); 
      break; 
     } 
     printf("Input remote filename: "); 
     char filename[1024]; 
     gets_s(filename, 1024); 
     if(filename[0] == '.'){ 
      send(mySocket, filename, sizeof(filename), 0); 
      break; 
     } 
     send(mySocket, filename, sizeof(filename), 0); 
     char GotFileSize[1024]; 
     recv(mySocket, GotFileSize, 1024, 0); 
     long FileSize = atoi(GotFileSize); 
     long SizeCheck = 0; 
     FILE *fp = fopen(localfile, "w"); 
     char* mfcc; 
     if(FileSize > 1499){ 
      mfcc = (char*)malloc(1500); 
      while(1){ 
       if(SizeCheck >= FileSize){ 
        fclose(fp); 
        Sleep(500); 
        free(mfcc); 
        break; 
       } 
       recv(mySocket, mfcc, 1499, 0); 
       fprintf(fp, "%s", mfcc); 
       SizeCheck += strlen(mfcc); 
      } 
     } 
     else{ 
      mfcc = (char*)malloc(FileSize + 1); 
      recv(mySocket, mfcc, FileSize, 0); 
      fprintf(fp, "%s", mfcc); 
      fclose(fp); 
      Sleep(500); 
      free(mfcc); 
     } 
    } 
}

Maintenant, si je transférer ce fichier:


Testtesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttest

Le fichier contient Transféré ceci:


Testtesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttest 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
𭺫«««««««îþîþtesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesº««««««««îþîþttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttestesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttest 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
ð­º 
𭺫«««««««îþîþ

Répondre

3

Pourquoi:

  fread_s(mfcc, 1499, sizeof(char), 1499, fp); 
      send(Socket, mfcc, FileSize, 0); 

vous envoyez octets FileSize mais vous ne savez même pas combien vous avez lu. Vérifiez la valeur de retour de la lecture, n'utilisez pas strlen() pour cela car vous ne savez pas si le fichier contient 0 octet.

+0

Pour ce genre de problème, je suggère généralement aux utilisateurs d'imprimer des valeurs en hexadécimal pour une meilleure lisibilité: fprintf (fp, "0x% x", mfcc); – karlphillip

+0

Eh bien, j'ai trouvé que la taille du socket par défaut est de 1500 octets. Donc, si le fichier est plus grand que 1500 octets, divisez-le en morceaux. Je pourrais avoir mal fait cependant. @Karlphillip: Je vais essayer ça. – Wazakindjes

+0

@karl mais à quoi sert-il d'imprimer le décalage mémoire du buffer? (mfcc est un pointeur ..) – mvds

0

L'a corrigé. Une nouvelle ligne a une taille de 2 octets, mais mon programme ne l'a compté que comme un seul. J'ai pensé cela parce que la différence entre Filesize et Sizecheck est en fait la quantité de lignes dans le fichier.

Nouvelle boucle:

char* mfcc; 
mfcc = (char*)malloc(FileSize + 1); 
while(SizeCheck {issmallerthan} FileSize){ 
    int Received = recv(mySocket, mfcc, FileSize, 0); 
    int Written = fwrite(mfcc, sizeof(char), Received, fp); 
    SizeCheck += Written; 
    for(int i = 0; i {issmallerthan} Written; i++){ 
     if(mfcc[i] == '\n'){ 
      SizeCheck += 1; 
     } 
    } 
} 
fclose(fp); 
free(mfcc);

La partie de l'expéditeur est comme celui-ci.

Merci pour l'aide à tous. : 3

Cas fermé. : D

Questions connexes