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 :

Un autre client-serveur multi"pthread"é ^^


Sujet :

C++

  1. #1
    Membre à l'essai
    Inscrit en
    Mars 2006
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 14
    Points : 10
    Points
    10
    Par défaut Un autre client-serveur multi"pthread"é ^^
    Bonjour à tous,

    Bon je voue explique mon probleme:
    Mon debut de programe est fait de:
    -un main, dans le quel j'attend les connexion puis je crée les threads,
    -une class "client_chat" qui gere chaque client (autant d'instance que de client)

    Mon probleme ce situe au niveau de l envoi de données dans le socket à partir de serveur, plus précisement dans une instance de la classe client_chat.

    Je peut en envoyer dans le construceur (le socket est en permemettre du constructeur) mais au moment de l envoi de donné a partir d'une methode de la meme instance, le socket est detruit et j'obtient une erreur.

    voila quelque fragment de code:


    la classe client_chat :
    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
    #include <stdio.h>
    #include <pthread.h>
    #include <iostream>
    using std::cout;
    #include "ServerSocket.h"
    #include "SocketException.h"
    #include <string>
    #include "socket.h"
    using std::string;
    #include <vector>
    namespace TOTO{
    class client_chat {
    	ServerSocket _sock;
    	int _id;
      public:
    	client_chat (ServerSocket sock,int id);
    	void send(string *msg,int id_pv){
    	}
    	void sendAll();
    	void gerer();
     
    };
    client_chat::client_chat (ServerSocket sock,int id){
    		_sock=sock;
    		_id=id;
    		_sock << "creation...\n"; //ici le message est bien recu par le client.   
    		cout << "client construit: " << id << "\n"; 
    }
     
    void client_chat::sendAll(){
    	cout << "^^^^^\n";
    	_sock << "bou!!\n"; //ici la connection est perdu.
    }
    }
    le main en partie :
    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
    while ( true ){
    			//préparation d'un socket
    			ServerSocket new_sock;
     
    			//attente des connexions
    			server.accept ( new_sock );
     
    			//préparation de la strucure à envoyer en paramettre de pthread_creat
    			//(car un seul argument peut etre passé)
    			struct thread_data *tmp_data = new thread_data;
    			tmp_data->client_id = nbr_client;
    			tmp_data->_sock = new_sock;
    			cout << tmp_data->client_id << "id premiere ...\n";
    			tmp_data->_sock << "processing...\n";
    			//creation du thread
    			pthread_t *threads = new pthread_t;
     
    			//creation du thread
    			pthread_create( threads, NULL, relais, (void*)tmp_data );
     
    			//stockage des donné (socket et id) des clients 
    			//(permet l'envoi des messsages à tous les clients)
    			//data_vector.push_back(tmp_data);
     
    			//variable bien utile ;-)
    			nbr_client++;			
    		}
    		pthread_exit(NULL);
    la "routine" en paramettre de pthread_creat():
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void *relais(void* thread_dat){
    	//castage....
    	struct thread_data *my_thread_data = (struct thread_data*) thread_dat;
       cout << "New client, id: " << my_thread_data->client_id;
       //creation et gestion du client
       my_thread_data->_sock << "creating client...\n";
       client_chat *_client = new client_chat(my_thread_data->_sock, my_thread_data->client_id);
    	_client->sendAll();
       _client->gerer();
    	cout << "client gerer\n";
    	pthread_exit(NULL);
    }
    enfin, voila ce que me ressort ma console:
    server:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Waiting for connestion on port 30000
    0id premiere ...
    New client,id: 0client construit: 0
    ^^^^
    3 [sig] server 832 server.exe: *** fatal error - colled with threadlist_ix -1 Hangup[/QUOTE]
    client:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    [QUOTE]$:telnet127.0.0.1 30000
    trying 127.0.0.1...
    Connected to 127.0.0.1
    Escape charac is .....
    processing...
    creating client...
    creation...
    Connection closed by foreign host.

    Merci pour votre aide.

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 125
    Points : 145
    Points
    145
    Par défaut
    le pb est dans tes constructeurs
    ServerSocket a t'il un constructeur par recopie et un operateur = ?

    tu passes par 2 copies de ton objet avec ces 2 lignes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    client_chat::client_chat (ServerSocket sock,int id){
    _sock=sock;
    lors de la mort de sock ne fermes tu pas le socket ?

    test ca deja !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    client_chat::client_chat (ServerSocket & sock,int id){

  3. #3
    Membre à l'essai
    Inscrit en
    Mars 2006
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    j ai simplement changé :
    client_chat::client_chat (ServerSocket sock,int id){
    par:
    client_chat::client_chat (ServerSocket & sock,int id){
    dans le header et dans le .cpp

    mais j ai exactement la meme erreur au moment de l'execution.

    Voila les constructeur de ServeurSocket:

    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
    ServerSocket::ServerSocket ( int port )
    {
      if ( ! Socket::create() )
        {
          throw SocketException ( "Could not create server socket." );
        }
     
      if ( ! Socket::bind ( port ) )
        {
          throw SocketException ( "Could not bind to port." );
        }
     
      if ( ! Socket::listen() )
        {
          throw SocketException ( "Could not listen to socket." );
        }
     
    }
     
    ServerSocket::~ServerSocket()
    {
    }

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 125
    Points : 145
    Points
    145
    Par défaut
    je vois pas de close()
    il se trouve ou ?

  5. #5
    Membre à l'essai
    Inscrit en
    Mars 2006
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    La classe (pompé) ServerSocket ne dispose pas de methode close() voici la classe:
    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
     
    class ServerSocket : private Socket
    {
     public:
     
      ServerSocket ( int port );
      ServerSocket (){};
      virtual ~ServerSocket();
     
      const ServerSocket& operator << ( const std::string& ) const;
      const ServerSocket& operator >> ( std::string& ) const;
     
      void accept ( ServerSocket& );
     
    };

    je doit donc passer par la classe socket:
    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
    class Socket
    {
     public:
      Socket();
      virtual ~Socket();
     
      // Server initialization
      bool create();
      bool bind ( const int port );
      bool listen() const;
      bool accept ( Socket& ) const;
     
      // Client initialization
      bool connect ( const std::string host, const int port );
     
      // Data Transimission
      bool send ( const std::string ) const;
      int recv ( std::string& ) const;
     
     
      void set_non_blocking ( const bool );
     
      bool is_valid() const { return m_sock != -1; }
     
     private:
     
      int m_sock;
      sockaddr_in m_addr;
     
     
    };

    mais pas non plus de methode close() en vue

  6. #6
    Membre à l'essai
    Inscrit en
    Mars 2006
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    Mais je ne vois pas trop ou est le probleme, puisque' en utilisant le variable d instance _sock dans le constructeur, tout fonctionne bien.
    les copies ce passe donc bien non?

    je ne vois vraiment pas d'où vient cette erreur...
    pour l autre variable, "int _id" je peut l utilisé sans probleme dans la fonction sendAll() apres avoir crée une instance de client_chat.

    quelqu'un voi le probleme?

  7. #7
    Membre à l'essai
    Inscrit en
    Mars 2006
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    Citation Envoyé par alskaar
    le pb est dans tes constructeurs
    ServerSocket a t'il un constructeur par recopie et un operateur = ?

    tu passes par 2 copies de ton objet avec ces 2 lignes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    client_chat::client_chat (ServerSocket sock,int id){
    _sock=sock;
    lors de la mort de sock ne fermes tu pas le socket ?

    test ca deja !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    client_chat::client_chat (ServerSocket & sock,int id){
    Pour l'histoir des copie de serversocket, je vois pas bien ou est le probleme.
    quelque un peu m'éclairer?

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 125
    Points : 145
    Points
    145
    Par défaut
    Pour ton pb tu devrais deja tester etapes pas etapes.
    et tester sans client chat et sans treads.


    Pour le pb que je t'ai proposé, n'ayant pas vu la totalité du code et voyant que tu faisais des recopies, j'ai pensé que tu passais par une recopie de ton sock via un objet temporaire et que a la mort de l'objet tempo tu perdais ta connection mais tu semble dire qu il y a pas de close() donc mon idée tombe a l'eau.

    la difference entre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    client_chat::client_chat (ServerSocket  sock,int id)
    client_chat::client_chat (ServerSocket & sock,int id)
    c'est que tu passes par la construction par recopie d'un objet tempo et que dans l'autre tu as une reference ...
    Pour bien t en rendre compte mets un cout dans tes constructeurs par recopie et destructeurs tu verras des recopies

    Dans ton code il y a semble t'il pas de pb dans la recopie, mais ca sert a rien de passer par un nouvel objet.

Discussions similaires

  1. demande d'aide client serveur multi thread
    Par nico1488 dans le forum Réseau
    Réponses: 0
    Dernier message: 19/03/2010, 09h27
  2. [socket] client/serveur multi-thred
    Par iag_1980 dans le forum Entrée/Sortie
    Réponses: 5
    Dernier message: 03/03/2007, 15h38
  3. Réponses: 7
    Dernier message: 19/10/2004, 19h09

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