kabal05 | Voici pour le code :
Code :
- // Envoi
- void envoyer(SOCKET soc, char *envoi, bool *quit){
- int iStatus = 0;
- char buf[1024];
- strcpy(buf,envoi);
- iStatus = send(soc, (const char *)buf, sizeof(buf),0);
- cout << "Nb octets envoyes : " << iStatus << endl;
- if(iStatus == SOCKET_ERROR)
- {
- cout << "send a echoue avec l'erreur : " << WSAGetLastError() << endl;
- closesocket(soc);
- *quit = true;
- }
- }
- // Reception
- void recevoir(SOCKET soc, char *buffer, bool *quit){
- char recu[1024];
- int iStatus = 0;
- memset(recu,'\0',sizeof(recu));
- iStatus = recv(soc, recu, sizeof(recu), 0);
- if(iStatus == SOCKET_ERROR)
- {
- cout << "recv a echoue avec l'erreur : " << WSAGetLastError() << endl;
- closesocket(soc);
- *quit = true;
- }
- else
- {
- recu[iStatus] = '\0';
- strcpy(buffer, recu);
- }
- }
- // Thread Client
- DWORD serveur::ClientThread(SOCKET soc){
- cout << "thread client demarre" << endl;
- char recu[1024];
- char envoi[1024];
- bool quit = false;
- bool REC = true;
- bool ENV = false;
- // Reception, Envoi et traitement
- while(!quit){
- memset(recu,'\0',sizeof(recu));
- memset(envoi,'\0',sizeof(envoi));
- if(REC){
- recevoir(soc, recu,&quit);
- cout << "Recu du client : " << recu << endl;
- traitement(&quit,&REC,&ENV,recu,envoi);
- }
- if(ENV){
- envoyer(soc,envoi,&quit);
- cout << "Envoye au client : " << envoi << endl;
- ENV = false;
- if(!quit)REC = true;
- }
- }
- // FIN
- // FERMETURE DU SOCKET FILS
- if (shutdown(soc, SD_BOTH) == SOCKET_ERROR || closesocket(soc) == SOCKET_ERROR)
- {
- cout << "La fermeture a echoue avec l'erreur : "<< WSAGetLastError() << endl;
- return 103;
- }
- else
- {
- cout << "Deconnexion du client." << endl;
- }
- // Libération du thread
- return 0;
- }
|
Le thread demarre après l'acceptation d'une connexion. Je vous fais grace de la fonction traitement, qui ne fait que manipuler des chaines et passer les booléens à true ou false (les enchainements d'envoi et de reception sont effectués correctement donc celle ci remplit son travail... De plus, lors des affichages cout << "Recu du client : " << recu << endl; et cout << "Envoye au client : " << envoi << endl; les chaines affichées sont correctes). |