Ciao,
stavo facendo questo programma in php per trasferire un file da un pc a un altro, uso socket con AF_INET, SOCK_STREAM, SOL_TCP.
Dunque il file non lo carico tutto sul buffer, perchè con i file di grandi dimensioni cn qualche GB occupa tutta la RAM, quindi faccio una lettura(rb) sequenziale e invio 4096 byte per volta con socket_write.
Dall'altra parte il server che riceve, ha la dimensione del file totale, dunque ottengo per difetto quante volte 4096 viene inviato in modo da potermi creare il ciclo per la ricezione.
Inoltre, dato che arrotondo per difetto, calcolo la differenza tra la dimensione totale del file e quella raggiunta alla fine del ciclo di ricezione, ossia:
codice:
$volte = floor($size /4096);
$misura_raggiunta = $volte * 4096;
...e fuori dal ciclo della ricezione, faccio un ultimo socket_read e aggiungo la differenza mancante(che è sempre minore di 4096 byte) al file(wb) e chiudo.
Ora...il programma in locale mi funziona, ho provato sia file piccoli, sia di grandi dimensioni e arrivano tutti fino all'ultimo byte.
Provando in rete, con un file di 17 MB mi sono avvicinato quasi alla fine del file, tentando più volte, ho ottenuto misure simili ma cmq diverse tra loro, mentre con un file di testo, oltrepasso appena la metà del file.
La lettura penso che funzioni bene, dato che il file di testo arriva correttamente, ma poi è come se venisse troncato.
A cosa può essere dovuto?

Un saluto

Alberto