IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MFC Discussion :

Client server multihread !


Sujet :

MFC

Vue hybride

ricky78 Client server multihread ! 06/12/2007, 12h51
ricky78 Bonjour Je relance le post... 07/12/2007, 09h29
ricky78 Bonjour Linker avec... 07/12/2007, 09h39
Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 391
    Par défaut Client server multihread !
    Bonjour

    J'ai un probleme que je ne comprend pas.
    J'essae de realiser un serveur pouvant accepter plusieurs clients
    pour cela je crée un thread du serveur pour pouvoir accepter toute les connexions entrantes et un thread client quand un client est accepté mon souci est que je n'arrive pas a attacher le handle de la socket du client

    le code

    un typedef pour passer met variable a travers les thread

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    typedef struct MYVAR{
    CListBox* mylist;
    SOCKET* handle;
    }MYVAR;
    le thread du serveur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    MYVAR* thevarserver = (MYVAR*)Param;
    	if (!AfxSocketInit()) thevarserver->mylist->AddString("Init socket not OK");			//initialisation des sockets
    	CSocket *Lsocket=new CSocket;		//socket d'ecoute
    	CSocket *Wsocket=new CSocket;		//socket de travail
    	SOCKET hConnected;				//handle de socket, pour le passage a l'autre thread
    	if (Lsocket->Create(PORT,SOCK_STREAM))	//creation de a socket TCP	(pour UDP: SOCK_DGRAM)
    	{
    		thevarserver->mylist->AddString("Server started");
    		Lsocket->Listen();			//mise de la socket en mode écoute (pas mode réception)
    		thevarserver->mylist->AddString("Listen started");
    		while(1)
    		{
    		 mutex.Lock();					//prend le mutex
    			Lsocket->Accept(*Wsocket);		//Redirige la connection entrante sur la socket de travail
     			hConnected =  Wsocket->Detach();		//recupere les parametres de la socket de travail
    
    			MYVAR * thevarclient = new MYVAR;
    			thevarclient->mylist = thevarserver->mylist;
    			thevarclient->handle = &hConnected;
    			AfxBeginThread(Client,thevarclient);//lance la fonction travail comme nouveau thread, avec parametre de socket
    			thevarserver->mylist->AddString("wait for client");
    			thevarserver->mylist->EnableWindow(true);
    		}
    et le thread du client ou j'ai l'erreur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    UINT CMyServerDlg::Client(LPVOID sock)
    {
    
    	MYVAR* thevarclient = (MYVAR*)sock;
    
    	char rdBuf[100];
    	CSocket *Wsocket=new CSocket;		//socket de travail
    	Wsocket->Attach(*thevarclient->handle);	//parametrage de la nouvelle socket de travail
    l'erreur est :

    DEBUG ASSERTION FAILED
    Program...
    File: f:\sp\vctools\vc7libs\ship\atlmfc\src\mfc\map_pp.cpp
    Line : 179

    ensuivant pas pas j'arrive a

    ASSERT(CAsyncSocket::LookupHandle(hSocket, bDead) == NULL);

    dans sockcore.cpp fonction void PASCAL CAsyncSocket::AttachHandle(SOCKET hSocket, CAsyncSocket* pSocket, BOOL bDead)
    qui me cree l'assertion

    cordialement

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 391
    Par défaut
    Bonjour

    Je relance le post parce que après queleques recherches sur le net j'ai trouvé une source qui veux faire la memechose que moi avec ce code


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    Merci pour toute remarque
    Source Afficher la source en plein écran  copier dans le presse papier 
    #include "afxsock.h"
    #include "afxmt.h"
    #define PORT 80
    CMutex mutex;		//declaration du mutex
    UINT travail(LPVOID sock);
    void main(){			//thread principal (écoute)
    	AfxSocketInit();			//initialisation des sockets
    	CSocket *Lsocket=new CSocket;		//socket d'ecoute
    	CSocket *Wsocket=new CSocket;		//socket de travail
    	SOCKET handle;				//handle de socket, pour le passage a l'autre thread
    	Lsocket->Create(PORT,SOCK_STREAM);	//creation de a socket TCP	(pour UDP: SOCK_DGRAM)
    	Lsocket->Listen();			//mise de la socket en mode écoute (pas mode réception)
    	
    	while(1){
            mutex.Lock();					//prend le mutex
    		Lsocket->Accept(*Wsocket);		//Redirige la connection entrante sur la socket de travail
     		handle=Wsocket->Detach();		//recupere les parametres de la socket de travail
    		AfxBeginThread(travail,(LPVOID)&handle);//lance la fonction travail comme nouveau thread, avec parametre de socket
    	}
    }
    UINT travail(LPVOID sock){		//thread de travail
    	CSocket *Wsocket=new CSocket;		//socket de travail
    	Wsocket->Attach(*(SOCKET*)sock);	//parametrage de la nouvelle socket de travail        mutex.Unlock();				//rend le mutex, permet de recevoir la connection suivante
    //ici vous mettez votre code pour  chaque connection ...
    //	Wsocket->Receive( ......  );
    	Wsocket->Close();			
    	delete Wsocket;
    	return 1;
    }
    et j'ai exactement la meme erreur

    Je vais donc voir du coté des propriété du projet

    Si vous avez une piste
    Cordialement

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 391
    Par défaut
    Bonjour

    Linker avec l'option /MD en shared DLL marche.

    Cordialement

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 7
    Dernier message: 27/02/2006, 22h22
  2. Réponses: 9
    Dernier message: 08/01/2006, 06h53
  3. [Socket][Client/Server]Exception d'origine inconnue
    Par willowII dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 03/11/2005, 22h36
  4. [réseau] [client/server] Transmettre la sortie standard
    Par legzo dans le forum Entrée/Sortie
    Réponses: 8
    Dernier message: 30/06/2005, 16h15
  5. [ado][sql server] CLIENT/SERVER
    Par nil dans le forum Bases de données
    Réponses: 3
    Dernier message: 23/04/2004, 08h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo