#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>     // Pour close()
#include <sys/types.h>
#include <sys/signal.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <string.h>     // Pour memset si besoin

int main(int argc, char * argv[]){
    int port, desc, resultat;
    struct sockaddr_in client, serveur;
    struct hostent * hp;
    int buffer;
    socklen_t long_serveur = sizeof(struct sockaddr_in); // Type corrigé et initialisé

    if (argc < 3){
        fprintf(stderr, "usage: %s nomServeur port\n", argv[0]);
        exit(-1);
    }

    port = atoi(argv[2]);
    printf("Port cible : %d\n", port);

    hp = gethostbyname(argv[1]);
    if (hp == NULL) {
        perror("Erreur gethostbyname");
        exit(-1);
    }

    serveur.sin_family = AF_INET;
    memcpy(&serveur.sin_addr.s_addr, hp->h_addr, hp->h_length);
    serveur.sin_port = htons(port);

    desc = socket(AF_INET, SOCK_DGRAM, 0);
    if (desc < 0){
        perror("Erreur de creation de socket");
        exit(-1);
    }

    client.sin_family = AF_INET;
    client.sin_addr.s_addr = htonl(INADDR_ANY);
    client.sin_port = htons(0); // Laisse l'OS choisir un port libre pour le client

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

    printf("Envoi au serveur Bonjour...\n");
    char *msg = "Bonjour c est le prof";
    sendto(desc, msg, strlen(msg) + 1, 0, (struct sockaddr *)&serveur, sizeof(serveur));

    if (recvfrom(desc, &buffer, sizeof(int), 0, (struct sockaddr *)&serveur, &long_serveur) < 0) {
        perror("Erreur réception");
    } else {
        printf("Le numero attribué par le serveur : %d\n", buffer);
    }

    close(desc);
    return 0;
}
