Sockets MFC

niceusef Messages postés 10 Date d'inscription samedi 12 avril 2008 Statut Membre Dernière intervention 3 octobre 2008 - 12 avril 2008 à 05:45
niceusef Messages postés 10 Date d'inscription samedi 12 avril 2008 Statut Membre Dernière intervention 3 octobre 2008 - 14 avril 2008 à 01:46
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

cs_Scooper Messages postés 71 Date d'inscription jeudi 2 octobre 2003 Statut Membre Dernière intervention 12 septembre 2013
12 avril 2008 à 09:29
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
0
cs_Scooper Messages postés 71 Date d'inscription jeudi 2 octobre 2003 Statut Membre Dernière intervention 12 septembre 2013
12 avril 2008 à 09:30
et apres dans le onaccept dla socket server tu bind la socket client et tu la stocke dans l'array
0
niceusef Messages postés 10 Date d'inscription samedi 12 avril 2008 Statut Membre Dernière intervention 3 octobre 2008
12 avril 2008 à 20:01
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 
0
cs_Scooper Messages postés 71 Date d'inscription jeudi 2 octobre 2003 Statut Membre Dernière intervention 12 septembre 2013
13 avril 2008 à 11:37
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
niceusef Messages postés 10 Date d'inscription samedi 12 avril 2008 Statut Membre Dernière intervention 3 octobre 2008
14 avril 2008 à 01:46
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 ;-)   
0
Rejoignez-nous