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 :
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
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. } }
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
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);
enfin, voila ce que me ressort ma console:
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); }
server:
client:
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]
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.
Partager