Bonjour
J'essaye de réaliser un serveur HTML multithread dans le cadre d'un projet :
j'utilise des sockets de type SOCK_STREAM.
Afin de ne pas fermer la connexion avec le client avant d'avoir effectué la totalité de l'envoi de la page demandée (ou du fichier binaire : image, activex etc...) j'ai écrit une routine qui saucissone le buffer en blocs de 1024 octets maxi...
En local sur ma machine ça fonctionne assez bien.
Mais pour l'accès à partir d'une autre machine (réseau local) j'ai du introduire un délai de 15 ms entre chaque envoi de bloc sinon la connexion est coupée avant la fin de l'envoi.
En accès distant je crains de devoir indiquer une valeur encore plus grande.
Tout ça ne me semble pas trés propre.
Problèmes rencontrés :
-Si le délai entre deux envois de blocs est trop court les fichiers envoyés sont tronqués (image incomplètes, etc.)
-Si le client fait un refresh trop tôt (trop grand nombre de requetes) le serveur renvoit n'importe quoi et le navigateur affiche des caractères incompréhensibles.
A l'évidence dans un cas comme dans l'autre il y a bien perte d'intégrité des données transmises...

Bien sûr je pourrais mettre un Sleep de folie

mais ça me paraît innacceptable comme solution !
Quelqu'un connait un moyen de savoir, lors d'un SEND si le client a reçu la totalité des données envoyées avant de fermer la connexion ?
Merci
"(...)
lgenvoi = 10;
erreurs = 0;
do
{
Sleep (15); //ajustement "empirique" 15ms
lg = 1024; //SO_MAX_MSG_SIZE; //ajustement "empirique" 1024
lg = min (lg, lgtotal-lgenvoi);
cr = send(laSocket[NoThread], &buffer[lgenvoi], lg, 0);
if (cr<0)
{
Sleep (0);
erreurs++;
if erreurs> 5)
{
cr=WSAGetLastError ();
break;
}
else
continue;
}
lgdata += cr;
Sleep (0);
} while (lgenvoi < lgtotal);
(...)
closesocket (laSocket[NoThread]);
SocketsEntrant[NoThread] = INVALID_SOCKET;
AdresseIpClient[NoThread] = "";
(...)
"