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

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

Marsh Posté le 15-08-2006 à 20:51:28    

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.
 
 

Reply

Marsh Posté le 15-08-2006 à 20:51:28   

Reply

Marsh Posté le 15-08-2006 à 21:19:57    

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
Reply

Marsh Posté le 15-08-2006 à 21:24:40    

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.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed