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![]()
Partager