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.