Sockets MFC

Signaler
Messages postés
10
Date d'inscription
samedi 12 avril 2008
Statut
Membre
Dernière intervention
3 octobre 2008
-
Messages postés
10
Date d'inscription
samedi 12 avril 2008
Statut
Membre
Dernière intervention
3 octobre 2008
-
Bonjour,
je suis entrain de réaliser une application de chat en se basant sur les sockets
après la crétion du serveur :
server.Create(port);
server.Listen();


server est une CSocket


je voulé pas ke mon programme se bloque alors g fais la partie d'acceptation dans un thread à part:
while(true)
 {  
  Socket *s=new Socket();
  server.Accept(*s);
                }
le problème qui se pose est un peu bizzar c que avec ce code la connexion s'etablie mé l'événement OnReceive se déclenche pas tandis que si je rajoute un msgbox aprés accept tout marche parfaitement


je suis bloqué ; merci d'avance

5 réponses

Messages postés
71
Date d'inscription
jeudi 2 octobre 2003
Statut
Membre
Dernière intervention
12 septembre 2013

Salut,
Je ne sais pas comment tu as fait mais normallement il faut que tu crée 2 classes qui dérivent de CAsyncSocket (ou CSocket suivant ce que tu veux faire) et que tu override les evt OnAccept, OnReceive, etc ...
Tu peux faire un truc du style (de tete)

en attribut de ta classe :
CMySocketServ m_oSockServ;
CMySocketClient** m_paSockCl; //a initialisé dans ton constructeur pour avoir un nombre non défini de client
ou
CMySocketClient m_aoSockCl[TONNBMAXDECLIENT] si ta pa envie de te prendre la tete

tu rajoute un attribut a ces 2 classes qui contient le hwnd de ta dialog

et apres dans les evt OnAccept; ... tu fait ((CMyDialog*)m_pParent)->AcceptLaSocket(), ((CMyDialog*)m_pParent)->DonneeRecuDeLapartde(this)

par exemple, comme ca tu gere tout dans ta dialog ('ou dans la classe qui handle les communications)

Normallement tu n'a pas besoin de faire de thread vu que le OnAccept est un evt qui se déclenche uniquement lorsqu'un client se connecte
Messages postés
71
Date d'inscription
jeudi 2 octobre 2003
Statut
Membre
Dernière intervention
12 septembre 2013

et apres dans le onaccept dla socket server tu bind la socket client et tu la stocke dans l'array
Messages postés
10
Date d'inscription
samedi 12 avril 2008
Statut
Membre
Dernière intervention
3 octobre 2008

tt d'abord merci à l'interet que ta accordé à mon blème


en fait j'ai dêja fait ce que ta proposé a propos d'héritage sinon j'auré pa pu modifier le code dans OnReceive ; é je vien de rajouter ce k tu ma di dans OnAccept() par la suite g constaté ke l'évént OnAccept() ne se declenche pas


méme si j fé dedans k un msgbox pr m'indiqué l'acception


dsl pr le dérangement 
Messages postés
71
Date d'inscription
jeudi 2 octobre 2003
Statut
Membre
Dernière intervention
12 septembre 2013

c'est que ton server n'écoute pas.
check les retour des différentes fonction et avec GetLastError() regarde l'érreur ca pourra t'aider.
Si tu veux etre sur que ton server écoute tu le verra avec netstat -a et tu dois voir qu'il écoute sur le port que tu as donnée.
Sinon fait un telnet sur ton serv et regarde si ca te met pas connection refused
Messages postés
10
Date d'inscription
samedi 12 avril 2008
Statut
Membre
Dernière intervention
3 octobre 2008

salut
merci infiniment chef rah j'ai résolé le bleme;si ça te dérangre pas bien sur j'ai besoin de toi encore:
dans l'evenement onReceive de ma classe héritante de CSocket je fé un appel à une fonction appartient à ma dialog qui reçoit le message et fait un traitement ; le probleme c'est que dans cette fonction j'utilise la Socket pour appeler la methode receive() alors comment pourais je savoir depuis quel cilent j'ai reçu le msg pr déterminer quelle socket je vais utiliser puisque pour chaque client a une socket;;; j'ai décidé d'utiliser un thread pour chaque client é une fois le msg est reçu on réveille le thread associé 
mai pour cela j'aurais besoin de la méthode qui retourne le thread courant de la classe CwinThread  comme la methode currentThread() du JAVA ;;;

j'attend ton aide ;-)