Bonjour, j'ai crée grâce au socket un programme qui me permet de faire une discution entre un serveur et un client. C'était pas simple mais c'est fait (même si j'ai un petit bug au niveau du nettoyage de mes buffers)
Mais la j'ai besoin de gerer la connexion de 2 clients et la possibilité de leurs répondre.
Je cherche pas compliqué :
- Le client 1 envoi un truc, je lui repond
- Le client 2 m'envoi un truc, je lui repond
Une discussion où c'est chacun son tour en gros.
Ce n'est pas qu'une demande d'aide, c'est aussi pour savoir comment faire, je doit faire avec des fork et des processus pere/fils mais j'ai jamais rien fait de tel et faut que j'utilise ça ...
Voici mon code (pour une discussion avec 1 client)
Serveur.cCode:
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93 #include <stdio.h> #include <fcntl.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #define Internet_Port 2074 // ------------------- Serveur : Envoi int main(int argc, char **argv){ int sd_recu, lon, sr; struct sockaddr_in adsock, adacc; struct hostent *hptr; struct servent *sptr; char buffer_recu[100]=""; char buffer_env[100]="Bye"; char *prog; char *host; prog = argv[0]; printf("\n____________\n SERVEUR \n------------\n\n "); // ------------------- Acquisition des infos Host host="localhost"; if((hptr=gethostbyname(host))==NULL){ perror("Probleme Info sur le host \n gethostbyname()"); exit(1); } /* Initialiser le adsock avec les infos du host pour préparer adresse d'attachement */ adsock.sin_family=AF_INET; adsock.sin_addr.s_addr=htonl(INADDR_ANY); // ------------------- récupération du numéro de port adsock.sin_port = htons(Internet_Port); // ------------------- création du socket if((sd_recu=socket(AF_INET,SOCK_STREAM,0))<0){ perror("Erreur lors de la creation du socket \n socket()"); close(sd_recu); exit(1); } if((bind(sd_recu,&adsock,sizeof(adsock)))<0){ close(sd_recu); perror("Erreur lors du bind \n "); exit(1); } listen(sd_recu,5); lon = sizeof(adsock); if((sd_recu=accept(sd_recu,(char *)&adsock.sin_addr,&lon))<0){ close(sd_recu); perror("Erreur accept \n accept()"); exit(1); } // ------------------- boucle attente connexions while(strcmp(buffer_env,"STOP")){ lon=sizeof(adsock); // ------------------- Reception de données if(recv(sd_recu,buffer_recu,sizeof(buffer_recu)-1,0)<0){ perror("Erreur lors de la reception \n recv()"); exit(1); }else{ printf(" (Lui) <-- %s \n ",buffer_recu); } // ------------------- Envoi de données printf(" (Moi) --> "); fgets(buffer_env, sizeof(buffer_env), stdin); if((send(sd_recu,buffer_env,sizeof(buffer_env),0))<0){ perror("Erreur lors de l'ecriture \n send()"); exit(1); } for (int i=0; i>strlen(buffer_recu); i++){ buffer_env[i]='\0'; buffer_recu[i]='\0'; } } // ------------------- Fin Programme close(sd_recu); exit(0); }
Client.cMerci d'avance pour votre aide à tous !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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80 #include <stdio.h> #include <fcntl.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #define Internet_Port 2074 // ------------------- Client : Envoi et Reception int main(int argc, char **argv){ int sd_env, n; struct sockaddr_in adsock; // Structure d'adresse du sock struct hostent *hostinfo; // Structure d'infos de l'host char buffer_env[9999]=""; // buffer_env pour les messages char buffer_recu[9999]=""; char *host; printf("\n____________\n CLIENT \n------------\n\n "); // ------------------- Création du socket if((sd_env=socket(AF_INET, SOCK_STREAM, 0)) < 0){ perror("Erreur creation socket ..."); close(sd_env); exit(1); } // ------------------- Acquisition des infos Host host="localhost"; if ((hostinfo=gethostbyname(host)) == NULL){ perror("Host inconnu ..."); exit(1); } // ------------------- Initialisation struct adsock avec infos de l'host, préparation de l'adresse d'attachement bcopy((char *)hostinfo->h_addr,(char *)&adsock.sin_addr.s_addr,hostinfo->h_length); adsock.sin_family = hostinfo->h_addrtype; // ------------------- On récupère le numéro de port adsock.sin_port=htons(Internet_Port); // ------------------- On va établir une connexion avec le serveur if(connect(sd_env, (struct sockaddr *)&adsock, sizeof(adsock)) < 0){ perror("Probleme de connexion \n connect()"); close(sd_env); exit(1); } listen(sd_env,5); while(strcmp(buffer_env, "STOP")){ // ------------------- Envoi de données printf(" (Moi) --> "); fgets(buffer_env, sizeof(buffer_env), stdin); if(send(sd_env, buffer_env, strlen(buffer_env), 0) < 0){ perror("Erreur lors de l'envoi \n send()"); exit(1); } // ------------------- Reception de données if(recv(sd_env, buffer_recu, sizeof buffer_recu - 1, 0) < 0){ perror("Erreur lors de la reception \n recv()"); exit(1); }else{ printf(" (Lui) <-- %s \n ",buffer_recu); } for (int i=0; i>strlen(buffer_recu); i++){ buffer_env[i]='\0'; buffer_recu[i]='\0'; } } // ------------------- Fin Programme close(sd_env); exit(0); }