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:
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:
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:
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:
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:
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.