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.c
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
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.c
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
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);
}
Merci d'avance pour votre aide à tous !