begin process at 2012 05 30 15:59:49
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Windows

 > 

Réseau & Internet

 > 

Recv bloque la première fois...


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Recv bloque la première fois...

mardi 15 août 2006 à 12:14:59 | Recv bloque la première fois...

rom2n

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 :
// 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 :
#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.




Cette discussion est classée dans : serveur, socket, lpvoid, addr, rmsocket


Répondre à ce message

Sujets en rapport avec ce message

Serveur Vc++6 pb dans recv [ par alfred ] Salut a tousJ'ai un probleme dans mon serveur et je ne sais pas comment le resoudre. Le client se connecte bien et envoie le bon nombre de caracteres sockets: méthode accept() [ par julien20vt ] Voila,je viens de coder le serveur de ma socket et ce qui me parait etrange c'est que la méthode accept() n'est pas bloquante, je pensais que le serve encore mon serveur [ par skysee ] bonjour,je suis toujours avec mon serveur en c sous visual c++ sous windows(sis eulement j'avais linux).Le problème est que je n'ai pas d'erreur de co Réception de données sur socket. [ par julien20vt ] Bonjour,J'ai un doute concernant l'utilisation de sockets.Si coté serveur j'utilise un buffer de taille X pour lire sur ma socket, ce serveur reste en Problème d'envoie par socket [ par CyberP ] J'ai fait un programme qui se connecte à un serveur ftp (le serveur ftp est aussi sur mon ordi). Je me connecte avec la fonction connect() et je recoi socket et fichiers textes : HELP !! [ par ben01n ] Salut tout le monde !je prog actuellement un client serveur en udp multicast sous linux (voir source sur ce site) et j'aimerais que mon serveur envoi TimeOut sur un socket [ par djosh ] Voici un bout de code des sources du logiciel VNC, la fonction connect(). Mon but est de réduire le temps de réponse (message:"failed to connect to se bind bought bought lier [ par JoebarGlut ] Salut, j'ai un piti problem de bind, kelkun peut il m'eclairer ?j'explik : (c'est un client qui se metamorphose en serveur ou en client suivant ce qu' Tutorial - Socket, serveur, client BCPP + GUI [ par NyxArm ] Bonjours tout le monde, je suis présentement en période d'appretissage du language CPP sur Borland(v.6). Maintenant que j'ai acquis quelque conna pb connetion reseau multiutilisateurs [ par JRB ] lorsque l'on veut creer une connection reseau ou plusieurs clients peuvent se connecter sur le meme serveur, est ce que le serveur doit creer un socke


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,281 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales