Sto provando a ricevere un file tramite i socket in C. Ma il server mi invia pacchetti a 64 byte per un file da 1000000 byte per esempio e ottengo circa 999902 byte sul file di destinazione.Trasferimento file tramite socket, dimensione finale con meno byte
while ((n = read(sd, buffer_in, BUFSIZE))) // BUFSIZE = 64
{
if(n<0)
{
printf("Fail.\n");
fclose(archivo);
return -1;
}
if(fwrite(buffer_in, n, 1, f) !=1)
{
printf("fwrite error.\n");
fclose(archivo);
return -1;
}
bytes+=n;
}
printf("We received %d bytes", bytes);
Se utilizzato tramite un socket TCP/IP locale funziona, ma non in una connessione lenta. Vedo attraverso il debugging che ottengo molti pezzi da 64 byte e un chunk da 30 byte vicino a EOF. So che è possibile ottenere meno byte su read() poiché la chiamata ritorna quando sono disponibili dati (> 1 byte). Ma questa condizione non dovrebbe essere catturata nel frattempo? Dovrebbe tornare quando n == 0, cioè non ci sono più dati (EOF).
Thx per il vostro aiuto.
(EDIT)
Invio codice come segue:
while (n=read(file_fd, buffer, BUFSIZE))
{
write (sdaccept, buffer, n)
}
So che entrambi read() e write() possono restituire N < BUFSIZE, ma non dovrebbe questo ciclo di lavoro che di conseguenza ? Ho aggiunto n e restituisce 1000000, la dimensione esatta.
(EDIT II)
testato con una sorgente C con 10673 byte, riceve 10575 senza corruzione, tranne che il file di destinazione manca dei primi 98 byte !!!
Circa 999.902? O esattamente? – paxdiablo
Non vedo difetti evidenti in questo codice - si prega di mostrare anche il codice di invio. – Alnitak
particolarmente dispari, poiché 64 si divide in 1000000 esattamente –