xwindoo | 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 :
- // Socket.cpp: implementation of the CSocket class.
- //
- //////////////////////////////////////////////////////////////////////
- #include <winsock.h>
- #pragma comment(lib, "wsock32.lib" )
- #include <windows.h>
- #include <stdarg.h>
- #include "RecvMsg.h"
- #include "Socket.h"
- //////////////////////////////////////////////////////////////////////
- // Construction/Destruction
- //////////////////////////////////////////////////////////////////////
- CSocket::CSocket()
- {
- Serveur = 0;
- nClient = 0;
- }
- CSocket::~CSocket()
- {
- }
- //////////////////////////////////////////////////////////////////////
- // Fonctions
- //////////////////////////////////////////////////////////////////////
- int CSocket::Init(HWND hWnd, int Type, char DNS[20], int Port, int MaxClient, LPVOID pMP, char *NomJoueur)
- {
- WSADATA wsa;
- SOCKADDR_IN addr;
- SetVar(pMP, (LPVOID)this);
- if(Type == SERVEUR)
- {
- if(WSAStartup(MAKEWORD(2,0), &wsa))
- return 29;
- if((Serveur = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == 0)
- return 30;
- ZeroMemory(&addr, sizeof(addr));
- addr.sin_family = AF_INET;
- addr.sin_addr.S_un.S_addr = INADDR_ANY;
- addr.sin_port = htons(Port);
- if(bind(Serveur, (SOCKADDR*)&addr, sizeof(addr)))
- return 31;
- if(listen(Serveur, 5))
- {
- closesocket(Serveur);
- return 32;
- }
- hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)fnServeur, (LPVOID)Serveur, 0, &dwThread);
- mMaxClient = MaxClient-1;
- }
- else if(Type == CLIENT)
- {
- if(WSAStartup(MAKEWORD(2,0), &wsa) != 0)
- return 29;
- if(!(Serveur = socket(AF_INET, SOCK_STREAM, 0)))
- return 30;
- HOSTENT *Hote;
- Hote = gethostbyname(DNS);
- if(!Hote)
- return 33;
- ZeroMemory(&addr,sizeof(addr));
- addr.sin_family = (*Hote).h_addrtype;
- addr.sin_port = htons(Port);
- addr.sin_addr = *((IN_ADDR*)(*Hote).h_addr);
- if(connect(Serveur, (const struct sockaddr*)&addr, sizeof(addr)))
- return 34;
- int IDMsg = 11;
- send(Serveur, (char*)&IDMsg, sizeof(IDMsg), 0);
- send(Serveur, NomJoueur, sizeof(NomJoueur), 0);
- hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)RecvMsgC, (LPVOID)Serveur, 0, &dwThread);
- }
- return 0;
- }
- ...
|
RecvMsg.cpp :
Code :
- #include "RecvMsg.h"
- #include "MenuPrincipal.h"
- #include "Socket.h"
- CMenuPrincipal *rmMP;
- CSocket *rmSocket;
- void SetVar(LPVOID MP, LPVOID Sock)
- {
- rmMP = (CMenuPrincipal*)MP;
- rmSocket = (CSocket*)Sock;
- }
- void fnServeur(LPVOID param)
- {
- SOCKET s = (SOCKET)param;
- while(rmSocket->nClient < rmSocket->mMaxClient)
- {
- rmSocket->Client[rmSocket->nClient] = accept(rmSocket->Serveur, NULL, NULL);
- rmSocket->hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)RecvMsgS, (LPVOID)rmSocket->Client[rmSocket->nClient], 0, &rmSocket->dwThread);
- if(rmSocket->nClient == rmSocket->mMaxClient)
- closesocket(rmSocket->Serveur);
- else
- rmSocket->nClient++;
- }
- }
- void RecvMsgS(LPVOID param)
- {
- SOCKET s = (SOCKET)param;
- PACKET p;
- int IDMsg,t;
- bool quit = false;
- while(!quit)
- {
- recv(s,(char*)&IDMsg, sizeof(IDMsg),0);
- send(s,"a",1,0);
- switch(IDMsg)
- {
- case MTSM_DATA:
- {
- ...
- }
- break;
- case MTSM_CLOSE:
- {
- MessageBox(0,"close",0,0);
- quit = true;
- }
- break;
- default:
- break;
- }
- ZeroMemory(&p, sizeof(p));
- }
- }
- void RecvMsgC(LPVOID param)
- {
- SOCKET s = (SOCKET)param;
- PACKET p;
- while(1)
- {
- recv(s,(char *)&p, sizeof(p), 0);
- switch(p.IDMsg)
- {
- case MTSM_INFOPARTIE:
- {
- ...
- }
- break;
- default:
- break;
- }
- ZeroMemory(&p, sizeof(p));
- }
- closesocket(s);
- }
|
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.
|