#include <stdio.
h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#define PORT 12345 // Définition du port du serveur
int main() {
int server_fd, new_socket, valread;
struct sockaddr_in address;
char buffer[1024] = {0}; // Buffer pour stocker les messages reçus
// Création du socket
if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
perror("Erreur de création du socket");
exit(EXIT_FAILURE);
// Configuration de l'adresse du serveur
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY; // Accepte toutes les connexions
address.sin_port = htons(PORT); // Conversion du port en format réseau
// Liaison du socket à l'adresse et au port
if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {
perror("Échec du bind");
exit(EXIT_FAILURE);
}
// Mise en écoute du serveur
if (listen(server_fd, 3) < 0) {
perror("Échec de l'écoute");
exit(EXIT_FAILURE);
printf("En attente de connexions...\n");
// Acceptation d'un client
if ((new_socket = accept(server_fd, NULL, NULL)) < 0) {
perror("Échec de l'acceptation");
exit(EXIT_FAILURE);
printf("Client connecté\n");
// Boucle principale pour recevoir et renvoyer les messages
while (1) {
valread = recv(new_socket, buffer, 1024, 0);
if (valread <= 0) { // Vérifie si le client a quitté
printf("Connexion fermée par le client.\n");
break;
buffer[valread] = '\0'; // Ajout du terminateur de chaîne
printf("Message reçu: %s\n", buffer);
// Vérifier si le client veut quitter
if (strcmp(buffer, "non") == 0) {
printf("Le client a choisi de quitter. Fermeture de la connexion.\n");
break;
// Renvoyer le même message au client (Echo)
send(new_socket, buffer, valread, 0);
memset(buffer, 0, sizeof(buffer)); // Nettoyage du buffer
// Fermeture des sockets
close(new_socket);
close(server_fd);
return 0;
//Client#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#define PORT 12345 // Port du serveur
#define SERVER_IP "127.0.0.1" // Adresse IP du serveur (localhost)
int main() {
int sock;
struct sockaddr_in serv_addr;
char buffer[1024] = {0}; // Buffer pour recevoir la réponse du serveur
char message[1024]; // Message à envoyer
char reponse[10]; // Réponse de l'utilisateur ("oui" ou "non")
// Création du socket
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
perror("Erreur de création du socket");
return -1;
// Configuration de l'adresse du serveur
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(PORT);
// Conversion de l'adresse IP en format réseau
if (inet_pton(AF_INET, SERVER_IP, &serv_addr.sin_addr) <= 0) {
perror("Adresse invalide ou non supportée");
return -1;
// Connexion au serveur
if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {
perror("Échec de la connexion");
return -1;
while (1) { // Boucle principale pour envoyer des messages
// Demander à l'utilisateur d'entrer un message
printf("Entrez un message : ");
fgets(message, sizeof(message), stdin);
message[strcspn(message, "\n")] = 0; // Supprimer le retour à la ligne
// Envoyer le message au serveur
send(sock, message, strlen(message), 0);
// Lire la réponse du serveur
int valread = read(sock, buffer, 1024);
buffer[valread] = '\0';
printf("Réponse du serveur: %s\n", buffer);
memset(buffer, 0, sizeof(buffer)); // Nettoyage du buffer
// Demander si l'utilisateur veut continuer ou quitter
printf("Voulez-vous continuer ? (oui/non) : ");
fgets(reponse, sizeof(reponse), stdin);
reponse[strcspn(reponse, "\n")] = 0; // Supprimer le retour à la ligne
if (strcmp(reponse, "non") == 0) { // Si l'utilisateur veut quitter
send(sock, "non", strlen("non"), 0); // Informer le serveur
printf("Vous avez choisi de quitter. Fermeture du client.\n");
break;
// Fermeture du socket client
close(sock);
return 0;
}
//Compilation
gcc -o server serveur.c
gcc -o client client.c
//Lancement du serveur et client.
./server