Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1253 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  [C++][SOCKET]recv() bloque la première fois

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C++][SOCKET]recv() bloque la première fois

n°1425691
xwindoo
Posté le 15-08-2006 à 20:51:28  profilanswer
 

Bonjour à tous,
je suis en train de programmer un jeu (rpg 2D avec direct3D) en réseau. J'ai structuré mon programme en différentes classes à savoir pour le réseau une classe CSocket ainsi qu'un fichier cpp contenant les fonctions (statiques) des threads des sockets (serveur et clients). A l'intérieur de ces fonctions, j'ai mis recv() dans une boucle while infinie. Lorsque un thread correspondant aussi bien au client qu'au serveur est crée, la fonction s'arrète bien sur recv() qui est bloquante mais, dès qu'elle reçoit des données, elle ne se bloque plus et le programme passe dessus indéfiniment. Voila mon code :
 
Socket.cpp :

Code :
  1. // Socket.cpp: implementation of the CSocket class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include <winsock.h>
  5. #pragma comment(lib, "wsock32.lib" )
  6. #include <windows.h>
  7. #include <stdarg.h>
  8. #include "RecvMsg.h"
  9. #include "Socket.h"
  10. //////////////////////////////////////////////////////////////////////
  11. // Construction/Destruction
  12. //////////////////////////////////////////////////////////////////////
  13. CSocket::CSocket()
  14. {
  15. Serveur = 0;
  16. nClient = 0;
  17. }
  18. CSocket::~CSocket()
  19. {
  20. }
  21. //////////////////////////////////////////////////////////////////////
  22. // Fonctions
  23. //////////////////////////////////////////////////////////////////////
  24. int CSocket::Init(HWND hWnd, int Type, char DNS[20], int Port, int MaxClient, LPVOID pMP, char *NomJoueur)
  25. {
  26. WSADATA wsa;
  27. SOCKADDR_IN addr;
  28. SetVar(pMP, (LPVOID)this);
  29. if(Type == SERVEUR)
  30. {
  31.  if(WSAStartup(MAKEWORD(2,0), &wsa))
  32.   return 29;
  33.  if((Serveur = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == 0)
  34.   return 30;
  35.  ZeroMemory(&addr, sizeof(addr));
  36.  addr.sin_family = AF_INET;
  37.  addr.sin_addr.S_un.S_addr = INADDR_ANY;
  38.  addr.sin_port = htons(Port);
  39.  if(bind(Serveur, (SOCKADDR*)&addr, sizeof(addr)))
  40.   return 31;
  41.  if(listen(Serveur, 5))
  42.  {
  43.   closesocket(Serveur);
  44.   return 32;
  45.  }
  46.  hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)fnServeur, (LPVOID)Serveur, 0, &dwThread);
  47.  mMaxClient = MaxClient-1;
  48. }
  49. else if(Type == CLIENT)
  50. {
  51.  if(WSAStartup(MAKEWORD(2,0), &wsa) != 0)
  52.   return 29;
  53.  if(!(Serveur = socket(AF_INET, SOCK_STREAM, 0)))
  54.   return 30;
  55.  HOSTENT *Hote;
  56.  Hote = gethostbyname(DNS);
  57.  if(!Hote)
  58.   return 33;
  59.  ZeroMemory(&addr,sizeof(addr));
  60.  addr.sin_family = (*Hote).h_addrtype;
  61.  addr.sin_port = htons(Port);
  62.  addr.sin_addr = *((IN_ADDR*)(*Hote).h_addr);
  63.  if(connect(Serveur, (const struct sockaddr*)&addr, sizeof(addr)))
  64.   return 34;
  65.  int IDMsg = 11;
  66.  send(Serveur, (char*)&IDMsg, sizeof(IDMsg), 0);
  67.  send(Serveur, NomJoueur, sizeof(NomJoueur), 0);
  68.  hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)RecvMsgC, (LPVOID)Serveur, 0, &dwThread);
  69. }
  70. return 0;
  71. }
  72. ...


 
RecvMsg.cpp :

Code :
  1. #include "RecvMsg.h"
  2. #include "MenuPrincipal.h"
  3. #include "Socket.h"
  4. CMenuPrincipal *rmMP;
  5. CSocket *rmSocket;
  6. void SetVar(LPVOID MP, LPVOID Sock)
  7. {
  8. rmMP = (CMenuPrincipal*)MP;
  9. rmSocket = (CSocket*)Sock;
  10. }
  11. void fnServeur(LPVOID param)
  12. {
  13. SOCKET s = (SOCKET)param;
  14. while(rmSocket->nClient < rmSocket->mMaxClient)
  15. {
  16.  rmSocket->Client[rmSocket->nClient] = accept(rmSocket->Serveur, NULL, NULL);
  17.  rmSocket->hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)RecvMsgS, (LPVOID)rmSocket->Client[rmSocket->nClient], 0, &rmSocket->dwThread);
  18.  if(rmSocket->nClient == rmSocket->mMaxClient)
  19.   closesocket(rmSocket->Serveur);
  20.  else
  21.   rmSocket->nClient++;
  22. }
  23. }
  24. void RecvMsgS(LPVOID param)
  25. {
  26. SOCKET s = (SOCKET)param;
  27. PACKET p;
  28. int IDMsg,t;
  29. bool quit = false;
  30. while(!quit)
  31. {
  32.  recv(s,(char*)&IDMsg, sizeof(IDMsg),0);
  33.  send(s,"a",1,0);
  34.  switch(IDMsg)
  35.  {
  36.  case MTSM_DATA:
  37.   {
  38.                                 ...
  39.   }
  40.   break;
  41.  case MTSM_CLOSE:
  42.   {
  43.    MessageBox(0,"close",0,0);
  44.    quit = true;
  45.   }
  46.   break;
  47.  default:
  48.   break;
  49.  }
  50.  ZeroMemory(&p, sizeof(p));
  51. }
  52. }
  53. void RecvMsgC(LPVOID param)
  54. {
  55. SOCKET s = (SOCKET)param;
  56. PACKET p;
  57. while(1)
  58. {
  59.  recv(s,(char *)&p, sizeof(p), 0);
  60.  switch(p.IDMsg)
  61.  {
  62.  case MTSM_INFOPARTIE:
  63.   {
  64.                                  ...
  65.   }
  66.   break;
  67.  default:
  68.   break;
  69.  }
  70.  ZeroMemory(&p, sizeof(p));
  71. }
  72. closesocket(s);
  73. }


 
J'ai cherché en vain la réponse, une seule personne avait le même problème que mais sa solution ne correspondais pas.
Merci d'avance.
 
 

mood
Publicité
Posté le 15-08-2006 à 20:51:28  profilanswer
 

n°1425701
farib
Posté le 15-08-2006 à 21:19:57  profilanswer
 

Tu lis les donnees entre tes deux selects ?
 
edit j'ai lu de travers j'ai rien dit


Message édité par farib le 15-08-2006 à 21:36:35

---------------
Bitcoin, Magical Thinking, and Political Ideology
n°1425703
xwindoo
Posté le 15-08-2006 à 21:24:40  profilanswer
 

Comment ca entre deux select() ? je ne fais pas de select(), je crée des thread et dans ces thread j'inclus un recv() dans une boucle while infinie.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  [C++][SOCKET]recv() bloque la première fois

 

Sujets relatifs
Comment éviter de tricher sur le nombre de fois qu'un lien est cliqué?J'étais en première page de google, je n'y suis plus du tout... [Help]
Supprimer des éléments de la fenêtre une fois celle-ci chargée[C]Problème de socket.
[resolu] afficher une fois si il existe déjàblocage sur la lecture d'un socket
[C] "correspondance" possible entre FILE * et socket ? [résolu]HTML - mettre une image de fond une seule fois
Socket, recv, send et select qui ne marche pas 
Plus de sujets relatifs à : [C++][SOCKET]recv() bloque la première fois


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR