#include <stdio.h>
#include <stdlib.h>
#include <unistd.h> // Ajouté pour close()
#include <sys/types.h>
#include <sys/signal.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>

#define TAILLE 250
int desc;

void finir(int s){
    close(desc);
    exit(1);
}

int main(int argc, char * argv[]){
    int resultat, n;
    struct sockaddr_in serveur;
    struct sockaddr_in client;
    // Supprimé : struct hostent * host; (inutile ici)
    socklen_t long_client; // Changé int -> socklen_t
    int numero_client = 0;

    desc = socket(AF_INET, SOCK_DGRAM, 0);
    if (desc < 0){
        perror("Erreur de création de socket\n");
        exit(-1);
    }

    serveur.sin_family = AF_INET;
    serveur.sin_addr.s_addr = htonl(INADDR_ANY); 
    serveur.sin_port = htons(5000);

    resultat = bind(desc, (struct sockaddr *)&serveur, sizeof(serveur));
    if (resultat < 0){
        perror("Erreur 2");
        exit(-2);
    }

    signal(SIGINT, finir);
    long_client = sizeof(client); // Initialisation correcte

    printf("Lancement du serveur sur le port 5000\n");
    while (1){
        char buffer[TAILLE] = "";
        n = recvfrom(desc, buffer, TAILLE, 0, (struct sockaddr *)&client, &long_client);
        if (n < 0){
            perror("Erreur de reception\n");
            exit(-3);
        }
        printf("%s\n", buffer);

        numero_client++;
        printf("Le serveur envoi le numéro de client %d\n", numero_client);
        sendto(desc, &numero_client, sizeof(int), 0, (struct sockaddr *)&client, long_client);
    }
    return 0;
}
