Calculatrice UDP serveur

Re: Calculatrice UDP serveur

by hami mokhtar -
Number of replies: 0
voila la correction du code
#include #include #include #include #include #include #include // Pour inet_ntoa()

#define TAILLE_TAMPON 1024

int main(int argc, char* argv[]) {
if (argc != 2) {
fprintf(stderr, "Utilisation : %s \n", argv[0]);
exit(1);
}

int port = atoi(argv[1]);

// Création d'un socket UDP
int s = socket(AF_INET, SOCK_DGRAM, 0);
if (s == -1) {
perror("socket");
exit(1);
}

// Configuration de la structure d'adresse du serveur
struct sockaddr_in adresse_serveur, adresse_client;
memset(&adresse_serveur, 0, sizeof(adresse_serveur));
adresse_serveur.sin_family = AF_INET;
adresse_serveur.sin_addr.s_addr = INADDR_ANY;
adresse_serveur.sin_port = htons(port);

// Liaison du socket à l'adresse
if (bind(s, (struct sockaddr*)&adresse_serveur, sizeof(adresse_serveur)) == -1) {
perror("bind");
exit(1);
}

printf("Serveur démarré sur le port %d\n", port);

char tampon[TAILLE_TAMPON];
int a, b, resultat;
char operation;
socklen_t taille_client = sizeof(adresse_client);

while (1) {
// Réception des données du client
int octets_recus = recvfrom(s, tampon, TAILLE_TAMPON, 0,
(struct sockaddr*)&adresse_client, &taille_client);
if (octets_recus == -1) {
perror("recvfrom");
continue;
}

// Extraction des opérandes et de l'opérateur des données reçues
memcpy(&a, tampon, sizeof(int));
memcpy(&b, tampon + sizeof(int), sizeof(int));
operation = tampon[2 * sizeof(int)];

printf("Requête de calcul reçue de %s:%d\n",
inet_ntoa(adresse_client.sin_addr), ntohs(adresse_client.sin_port));
printf("Opération : %d %c %d\n", a, operation, b);

// Effectuer le calcul
switch (operation) {
case '+':
resultat = a + b;
break;
case '-':
resultat = a - b;
break;
case '*':
resultat = a * b;
break;
case '/':
if (b == 0) {
fprintf(stderr, "Erreur : Division par zéro\n");
resultat = -1; // Ou envoyer un message d'erreur au client
} else {
resultat = a / b;
}
break;
default:
fprintf(stderr, "Erreur : Opérateur invalide\n");
resultat = -1; // Ou envoyer un message d'erreur au client
}

// Renvoyer le résultat au client
int octets_envoyes = sendto(s, &resultat, sizeof(int), 0,
(struct sockaddr*)&adresse_client, taille_client);
if (octets_envoyes == -1) {
perror("sendto");
continue;
}
}

close(s);
return 0;
}