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.
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
Les gars vous remercient. Je viens de résoudre ce problème grâce à vos conseils. – Bury