Problème client-serveur : Err 10054
Bonjour à tous,
je suis en train de réaliser une architecture client-serveur en C++ de la facon suivante : (je passe tout le code de connection (bind, etc.) qui fonctionne)
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| //## SERVEUR ##//
while (...)
{
//Recoit le nombre de données à recevoir
nombre_d_octets_a_recevoir=recv(id_de_la_nouvelle_socket,(char*)&buffer2,4,0);
if (nombre_d_octets_a_recevoir==SOCKET_ERROR)
{
cout << "Erreur, je n'ai pas recu la taille du fichier !\n\n";
system("PAUSE");
return -1;
}
//Recoit les données à recevoir
nombre_d_octets_a_recevoir =recv(id_de_la_nouvelle_socket,buffer,buffer2,0);
if (nombre_d_octets_a_recevoir ==SOCKET_ERROR)
{
cout << "Erreur, je n'ai pas recu le fichier !\n\n";
system("PAUSE");
return -1;
}
else
fichiers.write(buffer,nombre_d_octets_a_recevoir);
} |
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| //## CLIENT##//
while(nbdonneaenv==47000)
{
// Envoie de la taille des données à envoyer
nombre_de_caractere=send(id_de_la_socket,(char*)&nbdonneaenv,4,0);
if (nombre_de_caractere==SOCKET_ERROR)
{
cout <<endl<< "SO : D\202sol\202 6, je n'ai pas envoy\202 les donn\202es du a l'erreur : ";
cout << WSAGetLastError() << "\n\n";
system("PAUSE");
return -1;
}
//Envoi des paquets
nombre_de_caractere=send(id_de_la_socket,buffer,nbdonneaenv,0);
if (nombre_de_caractere==SOCKET_ERROR)
{
cout << "SO : D\202sol\202 7, je n'ai pas envoy\202 les donn\202es du a l'erreur : ";
cout << WSAGetLastError() << "\n\n";
system("PAUSE");
return -1;
}
} |
Voici mon problème,
sachant que le client est amené à reboucler de nombreuses fois sa boucle while (donc de nombreux send à la suite et qui se suivent très rapidement), j'obtiens l'erreur suivante au bout d'un certain temps : WSAGetLastError() = 10054 (fermeture d'un manière inattendu). En fait mon serveur reçoit, à un moment, une mauvaise valeur de nombre de données a recevoir alors cela fait planter son second recv.
Néanmoins, cela fonctionne si je debug mon CLIENT en pas à pas , ou bien si je met un Sleep entre les 2 recv du CLIENT, ce qui ralentit mon prog mais fait fonctionner le tout.
En gros, en vitesse reel, faire se suivre les recv à grande vitesse semble faire bugger le tout...
Quelqu'un voit-il d'où cela peut venir ?
Merci :)