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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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