Non ci crederete ma ce l'ho fatta
L'ho testato con una miriade di file, il più grande 1.3 Gb e arriva tutto fino all'ultima goccia, ma in localhost. Appena posso lo provo nella rete e poi vorrei implementarlo con le regole dell'FTP.
L'errore era questo: quando informavo la socket di destinazione sulla lunghezza del file, leggevo un byte in meno, il quale penso restasse nel buffer della socket e mi sballava di un solo byte la lettura del maledetto file.
Senza di voi non ce l'avrei fatta
Codice: Seleziona tutto
/* scrive il file al path f, nella scoket sockfd */
int f_transfert_sock(char *f, int sockfd)
{
FILE *fs;
int szf, rszf, wr;
char len[125];
int buffer[SIZE_BUF];
struct stat b;
fs = fopen(f,"rb");
if(fs==NULL) return 0;
if(stat(f,&b)==-1) return 0;
szf=b.st_size;
snprintf(len,125,"%d",szf);
wr = write(sockfd,len,125);
if(wr<0) error("write");
while(szf)
{
if(szf<SIZE_BUF)
{
szf = fread(buffer,1,szf,fs);
wr = write(sockfd,buffer,szf);
if(wr!=szf) return 0;
szf = 0;
}
else
{
rszf = fread(buffer,1,SIZE_BUF,fs);
wr = write(sockfd,buffer,rszf);
if(wr!=rszf) return 0;
szf-=rszf;
}
}
fclose(fs);
return 0;
}
Codice: Seleziona tutto
/* legge dalla socket sockfd un file di grandezza sz e lo copia nel path del nuovo file f */
int f_recv_sock(char *f, int sockfd, long sz)
{
FILE *fd;
int szf, rszf, wr , w, ret, i;
int buffer[SIZE_BUF];
fd = fopen(f,"wb");
if(fd==NULL) return -1;
while(sz)
{
if(sz<SIZE_BUF)
{
w = read(sockfd, buffer, sz);
ret = fwrite(buffer,1,w,fd);
if(ret!=w) error("copia inconsistente");
sz=0;
}
else{
wr = read(sockfd, buffer, SIZE_BUF);
ret = fwrite(buffer, 1, wr, fd);
if(ret!=wr) error("copia inconsistente");
sz-=ret;
}
}
fclose(fd);
printf("FILE RICEVUTO\n");
return 0;
}
« Una volta eliminato l'impossibile, ciò che resta, per quanto improbabile, deve essere la verità. »
(Sherlock Holmes)