Originariamente inviato da SPiNALeX
Data la natura del protocollo l'idea di decidere che quelle volte sono sufficienti è aleatoria, nemmeno se creassi un algoritmo che aggiungesse volte in base a una statistica basata sulle percentuale di errori.
In questo tipo di trasmissioni si richiede un feedback, perciò se hai creato un server TCP con PHP senza usare i thread, hai sicuramente utilizzato un ciclo infinito.
Nella funzione che richiami per mandare il file, lì dentro dovrebbe esserci un secondo ciclo infinito che viene interrotto quando si arriva al closer del file inviato, finito il ciclo, server e client si disimpegnano.
Ciao, dunque la parte che avevo fatto per inviare il file è questa:
Codice PHP:
$handle = fopen($filename, "rb");
$contents = "";
$a = 0;
$b = 4096;
$times = sprintf("%u", filesize($filename))/4096;
fseek($handle, 0, SEEK_SET);
while (!feof($handle))
{
//echo "La posizione del puntatore è: ".ftell($handle)."\n";
$contents = @fread($handle,4096);
if(sprintf("%u",ftell($handle)) % 4096 == 0)
{
fseek($handle, $b, SEEK_SET);
$b = $b + 4096;
}
socket_write($socket, $contents,strlen($contents));
}
echo "*File inviato.*\n";
unset($contents);
fclose($handle);
socket_close($socket);
Il codice all'interno del ciclo viene effettuato tante volte fino a quando non si raggiunge la fine del file.
Mentre la parte che riceve è questa:
Codice PHP:
$times = floor($size /4096);
$newsize = $times * 4096;
$differenza = $size - $newsize;
for($a=1;$a<=$times; $a++)
{
$data = socket_read($conn, 4096) or die("Could not read input\n");
fwrite($handle, $data);
}
$data1 = socket_read($conn, $differenza) or die("Could not read input\n");
fwrite($handle, $data1);
fclose($handle);
echo "File salvato con succcesso";
socket_close($conn);
socket_close($socket);
Appena dovrebbe arrivare il file io chiudo tutto, intendevi altro?
Ciao