2010-12-28 1 views
0

En fait, je travaille sur un serveur FTP très simple. Maintenant, j'ai un problème avec l'envoi de fichier (RETR dans le protocole FTP). J'utilise les sockets et le mode binaire dans mon client. Les fichiers avec le texte envoient parfaitement, mais le problème est les fichiers binaires (images etc.).Les Sockets n'envoient pas toutes les données binaires

est ici morceau de mon code:

FILE *fin=fopen(fileloc,"rb"); 

if(fin != NULL){ 
    fpos_t filelen; 

    fseek (fin, 0, SEEK_END); 
    fgetpos (fin, &filelen); 

    fseek (fin, 0, SEEK_SET); 
    printf("Sending file %s (%d b)", fileloc, filelen); 
    sprintf(sbuffer,"150 Opening BINARY mode data connection for file transfer.\r\n"); 
    bytes = send(ns, sbuffer, strlen(sbuffer), 0); 
    byte temp_buffer[512]; 

    long int totalsent; 
    totalsent = 0; 

    while (!feof(fin)){ 

     memset(temp_buffer, '\0', sizeof(sbuffer)); 

     fgets((char *)temp_buffer, sizeof(sbuffer), fin); 

     if (!active) bytes = send(ns_data, (char *)temp_buffer, strlen(sbuffer), 0); 
     else bytes = send(s_data_act, (char *)temp_buffer, strlen(sbuffer), 0); 

     totalsent = totalsent + bytes; 

     printf("  file size = %d, send = %d bytes, strlen = %d, total = %d, left = %d\n", 
       filelen, bytes, strlen(sbuffer), totalsent, filelen-totalsent); 
     } 

    fclose(fin); 
    sprintf(sbuffer,"250 File transfer completed... \r\n"); 
    bytes = send(ns, sbuffer, strlen(sbuffer), 0); 
} 

Mon client FTP devient des fichiers incomplets avec des différences à l'intérieur (j'ouvrir les fichiers avec Bloc-notes pour comparer), comme vous pouvez le voir sur cette image à l'écran si l'URL a travaillé sans exigeant un signe en:

http://i53.tinypic.com/2wcjtdk.jpg

Il y a aussi des différences dans la taille du fichier - fichier d'origine est sur le point 7KB et copie est sur 1ko moins. J'ai utilisé un client FTP très différent et il y a le même problème.

Répondre

5

Dans votre appel d'envoi, vous utilisez strlen qui peut fonctionner correctement pour les données de texte mais pas pour les données binaires. Lorsque vous lisez à partir du fichier, vous devez utiliser un appel comme lu qui vous dira combien d'octets ont été réellement lus afin que vous puissiez envoyer autant d'octets dans l'appel d'envoi.

+0

Pour clarifier: Essentiellement le problème avec l'utilisation de fgets et strlen est que vous perdez tous les octets nuls dans un fichier binaire, car un octet nul est utilisé pour terminer les chaînes. Cela fonctionne très bien pour les fichiers texte car ils n'incluent généralement pas d'octets nuls. – PleaseStand

+0

Les gars vous remercient. Je viens de résoudre ce problème grâce à vos conseils. – Bury

Questions connexes