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

C++ Discussion :

Problème de gestion d'évènement réseau


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2012
    Messages : 33
    Par défaut Problème de gestion d'évènement réseau
    Bonjour,

    Je souhaite réaliser un programme de 'chat'. Mais après m'être renseigné sur plusieurs sites je n'ai pas réussi à en créer un.
    Mon problème est que j'aimerais pouvoir savoir quand un client essaie de se connecter au serveur, pour ensuite l'accepter ou alors savoir quand un message est envoyé au serveur pour pouvoir le renvoyer aux autres clients par exemple.
    J'ai pu voir sur internet qu'il y avait des évènements réseaux envoyer par Windows ou alors qu'il y a une solution utilisant des threads. Quelle est la meilleure solution ? Il y en a peut-être d'autre plus facile à utiliser ?
    En utilisant ‘winsock2.h’.

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 487
    Par défaut
    Bonjour,

    C'est un sujet qui a été traité ici de très nombreuses fois. Fais une recherche sur les forums C et C++ concernant la fonction select(), notamment, voir aussi les cours et tutoriels pour apprendre C++.

    J'ai pu voir sur internet qu'il y avait des évènements réseaux envoyer par Windows ou alors qu'il y a une solution utilisant des threads. Quelle est la meilleure solution ? Il y en a peut-être d'autre plus facile à utiliser ?
    En utilisant ‘winsock2.h’.
    On suppose donc que tu travailles sous Windows. Si tu t'appuies directement sur ces primitives, ton programme ne sera pas portable.

    Ne t'orientes pas directement vers les threads. C'est la solution de facilité et c'est surtout une échappatoire pour contourner un problème théorique que tu n'as pas réussi à résoudre en amont. Et si cela peut-être élégant dans certaines situations où il y a peu de clients mais que les tâches à effectuer sont complexes, ça devient dramatique dans les situations simples où il y a un tout petit peu de montée en charge.

    Oublie complètement les threads pour le moment. Tu y reviendras quand tu maîtriseras parfaitement cette partie.

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2012
    Messages : 33
    Par défaut
    Oui, je ne l'ai pas précise, j'utilise Windows !

    J'ai donc utiliser la fonction select() pour mon 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
    while(1)
    	{
    		for(int i = 0 ; i < 2; i++)
    		{
    			int ret = 0;
    			FD_ZERO(&readfs);
    			FD_SET(Client[0], &readfs);
    			FD_SET(Client[1], &readfs);
     
    			if((ret = select(Client[i] + 1, &readfs, NULL, NULL, NULL)) > 0)
    			{
    				if(FD_ISSET(Client[i], &readfs))
    				{
    					memset(buffer,0,sizeof(buffer));
    					recv(Client[i], buffer, sizeof(buffer),0);
    					cout<<buffer<<"Message recu";
    				}
    			}
    		}
    	}
    mais avec ce code, quand j'envoie un message depuis le client, le serveur m'affiche:
    Message recu
    , sans le buffer ?

    C'est donc qu'il a mal ou pas reçu le message, mais alors ou est l'erreur ?

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 487
    Par défaut
    Peut-on voir à quel endroit tu déclares « buffer » ?

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2012
    Messages : 33
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    fd_set readfs;
    char buffer[50];
    Placé juste avant le while(1)

  6. #6
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 487
    Par défaut
    J'avais mal lu ton code, qui est incorrect, désolé :

    select() est fait pour attendre simultanément qu'au moins un des sockets examinés se débloque. Tu écoutes donc simultanément les deux clients à la fois.

    Par contre, tu as placé ton select() à l'intérieur de ta boucle for, examinant ainsi d'abord le premier client puis le second.

    Donc, select() débloque parce que c'est le second client qui a envoyé quelque chose mais que tu fais un read() sur le premier client parce que c'est son tour, il est normal que tu ne reçoive rien.

Discussions similaires

  1. Problème de gestion des évènements
    Par drunkskater dans le forum Tkinter
    Réponses: 17
    Dernier message: 15/09/2012, 17h20
  2. [AC-2003] Problème de gestion des événements
    Par Shankara dans le forum IHM
    Réponses: 4
    Dernier message: 27/03/2012, 11h56
  3. Problème de gestion d'évènement
    Par Nwoaar dans le forum SDL
    Réponses: 4
    Dernier message: 08/05/2010, 00h40
  4. problème de gestion d'évènements
    Par gabest dans le forum C++/CLI
    Réponses: 1
    Dernier message: 13/10/2009, 12h15
  5. Problème de gestion d'évènement
    Par florent_de_brest dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 06/07/2006, 16h48

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