Bonjour,
Je suis en train de faire une client serveur, avec donc plusieurs clients et un serveur (le principe de base quoi ) mais il ce trouve que lorsque je lance plusieurs clients tous ces clients ce connecte a la même socket, et donc ce marche sur les pieds (la loi du plus rapide )
voici la trace d'exécution de 2 exécutions // de mon client :
Client 1:
Client 2:
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 nico@MOI:~/Documents/yap2pc/hote$ ./Hote 127.0.0.1 Connexion à 127.0.0.1 sur le port 14000 Numero de scoket : 3 Tentative numero 1 Entrez votre login : coucou Entrez votre mot de passe : cestnous Message : coucou 1:Se logger 0:Nouvel Utilisateur 0 [envoi message]code err : 0 [reception ack]code err : 1 [encoi IP]code err : 0
On remarque bien alors que le client1 passant avant le client2 lui coupe la communication.
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 nico@MOI:~/Documents/yap2pc/hote$ ./Hote 127.0.0.1 Connexion à 127.0.0.1 sur le port 14000 Numero de scoket : 3 Tentative numero 1 Entrez votre login : bonjour Entrez votre mot de passe : cestmoi Message :bonjour 1:Se logger 0:Nouvel Utilisateur 0 [envoi message]code err : 0 read(): Connection reset by peer [reception ack]code err : -1
voici mon code du coté client (je me suis basé sur l'article des sockets de Benjamin Roux):
Ayant déjà pas mal farfouillé a droite et a gauche, et n'ayant rien trouvé de fondamentalement différent (au niveau code) je suis assez perplexe.
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
45
46
47
48
49
50
51
52
53
54 int main (int argc, char* argv[]) { SOCKET sock; SOCKADDR_IN sin; pthread_t thread_serveur; pthread_t thread_client; int thread_serveur_st; int thread_client_st; if(argc != 2) { printf("format : ./Hote adresse IP du serveur\n"); exit(0); } /* Partie gerant la création de la scoket que vont ce partager les deux threads pour la connection au serveur centralisé */ if( (sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) { perror("socket"); } sin.sin_addr.s_addr = inet_addr(argv[1]); sin.sin_port = htons(PORT); sin.sin_family = AF_INET; if(connect(sock,(struct sockaddr *)&sin,sizeof(sin)) != SOCKET_ERROR) { printf("Connexion à %s sur le port %d\n", inet_ntoa(sin.sin_addr),htons(sin.sin_port)); printf("Numero de scoket : %d\n", sock); } else { perror("connect"); } /* partie créant les 2 threads serveur et client */ thread_serveur_st = pthread_create (&thread_serveur, NULL,&Serveur_ftp, &sock); thread_client_st = pthread_create (&thread_client, NULL,&Client_ftp, &sock); //printf("Attente de la fin du thread_serveur et client\n"); /* on attend la fin de l'execution des 2 threads */ pthread_join (thread_serveur, NULL); pthread_join (thread_client, NULL); printf("fermeture de la socket\n"); /* on ferme la socket */ close(sock); return 0; }
Je vous remercie d'avance
Partager