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 :

client serveur quel choix


Sujet :

C++

  1. #1
    Membre éclairé Avatar de LeXo
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 147
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 147
    Points : 868
    Points
    868
    Par défaut client serveur quel choix
    Bonjour
    Pour emettre et écouter en meme temps sur le serveur

    j'ai trouvé 3 choix

    les threads
    Duplication de process :les fork unix
    le multiplexage d'E/S asynchrone

    sur quel criteres, je choisis l'une ou l'autre ?

    d'avance merci
    je regarde le site de Beej'
    Plzzz pas de questions par MP.

  2. #2
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 626
    Points : 30 684
    Points
    30 684
    Par défaut
    Salut,

    je suis désolé de faire une "réponse de normand", mais... tout dépend entièrement de ce que tu souhaites mettre en place.

    J'ai presque la conviction que la préférence d'une des solutions par rapport aux autres deviendra manifeste en cours d'analyse et de conception.

    Il n'est d'ailleurs pas impossible que tu choisisse une méthode pour une partie de l'application et une autre pour une autre partie, simplement, parce qu'elle te semblera être la meilleure pour le cas que tu veux gérer
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    362
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 362
    Points : 410
    Points
    410
    Par défaut
    Je suis moi-même désolé de ne pas t'être d'une grande aide, dans la mesure où je ne sais pas à quoi tu fais référence lorsque tu parles de "multiplexage d'entrées sorties asynchrones".

    Concernant le choix entre Fork et thread, ça beaucoup de comment tes threads/fork vont devoir communiquer entre eux.

    Les threads appartiennent au même programme, et notament partagent une certaine zone mémoire. Les fork vivent chacun leur vie de leur coté, (ce qui ne les empèche pas de communiquer).

    Dans le cas d'un serveur de dessin coopératif, où plusieurs clients se connectent au même serveur pour dessiner en même temps sur le même tableau, j'imagine que tu utiliseras plutot des thread.

    Dans le cas d'un serveur de génération de courbes, ou plusieurs clients se connectent au même serveur pour lui filer des listes de points et recevoir en échange des courbes de données, j'imagine que tu utiliseras plutot des forks.

    Bonne chance.


    P.S : Jusqu'à présent, tous les serveurs que j'ai codé utilisaient des threads.

  4. #4
    Membre éclairé Avatar de LeXo
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 147
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 147
    Points : 868
    Points
    868
    Par défaut
    bha merci
    ces réponses qui n'en sont pas

    m'éclairent quand meme un peu

    merci
    Plzzz pas de questions par MP.

  5. #5
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 626
    Points : 30 684
    Points
    30 684
    Par défaut
    En fait, il est meme fort vraissemblable que tu préféreras pour la partie "serveur", un peu à l'instar de ce que fait Apache, par exemple (désolé, l'exemple m'est venu à l'esprit bien après mon premier post), lancer carrément un processus séparé pour chaque requete, de manière à ce que le "processus parent" puisse toujours rester à l'écoute du port par défaut.
    [EDIT](Ce qui ne l'empeche d'ailleurs pas forcément de lancer plusieurs threads pour gérer une seule requete... je ne suis pas allé assez loin dans son fonctionnement pour être précis sur le sujet )[/EDIT]

    D'un autre coté, il n'est pas inenvisageable que tu envisage l'utilisation de threads dans une certaine mesure, et, pourquoi pas, le lancement d'un nouveau processus dans certains cas (comme l'ouverture d'une deuxième fenetre du navigateur)

    Enfin, selon les cas toujours, il faudra voir ce qui est le plus efficace au niveau de la transmission des données: multiplexage ou connexion (et transmission) synchrone/asynchrone du client au serveur... Mais cà, cela dépendra de la charge que peut supporter la partie serveur et du temps que tu considère comme admissible entre l'envoi d'une requete et l'obtention du résultat

    Finalement, tu vois que ma réponse de normand était un bon résumé du problème, non
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  6. #6
    Membre éclairé Avatar de LeXo
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 147
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 147
    Points : 868
    Points
    868
    Par défaut
    en fait, hier soir j'étais parti sur l'idée d'utiliser des threads pour gèrer la communication.

    alors je vais regarder ce qui se fait

    mon contexte : systeme embarqué avec un noyau linux
    Plzzz pas de questions par MP.

  7. #7
    Membre éclairé Avatar de LeXo
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 147
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 147
    Points : 868
    Points
    868
    Par défaut
    depuis hier soir, je suis sur ce problème

    j'ai un serveur
    une classe gestionnaire de Client qui manipule un tableau(vector) de client type Client

    mais dans mon accept je ne vois pas quel objet je vais lui passer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    if((csock=accept(sock, (struct sockaddr *)&csockInf,&csinLen ))== -1){
        perror("Error :: accept failure : ");
        break;
    }else{
    ...
    gClient.addClient(csock,csockInf);
    ...
    Plzzz pas de questions par MP.

  8. #8
    Membre éclairé Avatar de LeXo
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 147
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 147
    Points : 868
    Points
    868
    Par défaut
    depuis hier soir, je suis sur ce problème

    j'ai un serveur
    une classe gestionnaire de Client qui manipule un tableau(vector) de client type Client

    mais dans mon accept je ne vois pas quel objet je vais lui passer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    if((csock=accept(sock, (struct sockaddr *)&csockInf,&csinLen ))== -1){
        perror("Error :: accept failure : ");
        break;
    }else{
    ...
    gClient.addClient(csock,csockInf);
    ...
    //Creation Thread
    pthread_t unThread;
    if((_idThread = pthread_create(&unThread,NULL,threadClient,??))== -1){
    perror("Error :: pthread_create failed");
    break;
    }
    ...

    void * threadClient(void * p){

    }
    Plzzz pas de questions par MP.

  9. #9
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 723
    Points
    5 723
    Par défaut
    si tu n'as pas de paramètre à passer tu mets NULL.

    De façon minimale tu devrais passer en paramètre la socket retournée par accept car ton thread est un thread client par lequel tu vas chercher à dialoguer avec le client à travers cette socket.
    " Dis ce que tu veux qui insulte mon honneur car mon silence sera la réponse au mesquin.
    Je ne manque pas de réponse mais : il ne convient pas aux lions de répondre aux chiens ! " [Ash-Shafi'i ]

  10. #10
    Membre éclairé Avatar de LeXo
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 147
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 147
    Points : 868
    Points
    868
    Par défaut
    Bon alors,

    resultat comme je ne voyais pas tres bien quoi envoyé

    j'ai envoyé une struct mais ça passe pas tres bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    	struct client_struct{
    		Serveur* serv;
    		int sock;
    		struct sockaddr_in sockInf;
    	};
    	client_struct clientSock;
    bon mais ça coince quand je vais chercher le pointeur de serveur dans la structure

    d'avance merci pour les conseils
    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    		std::cout<<"Server is ready..."<<std::endl;
    		while(1){
    			//Envoi
     
    			//Connexion d'un Client
    			if((csock=accept(sock, (struct sockaddr *)&csockInf,&csinLen ))== -1){
    				perror("Error :: accept failure : ");
    				break;
    			}else{
     
    				//Creation Thread
    				clientSock.serv=this;
    				clientSock.sock= csock;
    				clientSock.sockInf=csockInf;
    				pthread_t unThread;
    				if((_idThread = pthread_create(&unThread,NULL,threadClient,&clientSock))== -1){
    					perror("Error :: create thread failure ");
    					break;
    				}
    				//Envoi message a tous les connectes qu'un nouveau client est connecte
    				sendMsgToAll();	
    			}
    		}
    	}
    	//Ajouter un Client au serveur
    	void Serveur :: addClientToServer(struct client_struct cs){
     
    		gClient.addClient(cs.sock,cs.sockInf);
    		std::cout<<"Got connection "<<gClient.getNbClient()<<" with : "<<std::endl;
    		std::cout<<inet_ntoa(cs.sockInf.sin_addr)<<" : "<<ntohs(cs.sockInf.sin_port)<<std::endl;
     
    		//Deconnection :: error
    		if((recu=recv(csock,buf,MAX_LINE,0))== -1){
    			perror("Error :: Client disconnected ");
    		}else{
    			std::cout<<"Reception message : "<<buf<<std::endl;
    		}
    	}
    	//Envoie Msg a tous les clients du serveur
    	void * threadClient(void * p){
    		struct client_struct *cs = (struct client_struct*) p;
    		//Serveur *s= cs->serv;
    		//s->addClienToServer(cs);
    }
    Plzzz pas de questions par MP.

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 28/02/2012, 12h09
  2. [c++] Développement Client/Serveur: Quel est le principe?
    Par _pouet dans le forum Développement
    Réponses: 12
    Dernier message: 22/09/2009, 22h22
  3. Application Client/Serveur (Quel solution?)
    Par elraton dans le forum C++
    Réponses: 5
    Dernier message: 16/07/2009, 18h35
  4. Client serveur : quel algorithme choisir
    Par e-medi dans le forum Réseau
    Réponses: 1
    Dernier message: 15/07/2007, 22h54
  5. [client/serveur] Quel est format de requêtes Client/BDD ?
    Par sotuxan dans le forum Décisions SGBD
    Réponses: 2
    Dernier message: 05/03/2006, 12h52

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