Voici un exemple de client acceptable :
/** Client de la calculatrice à deux opérations **/
/* Fichiers d'inclusion */
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <string.h>
/* Constantes */
#define SERVEUR "172.26.16.11"
#define PORT 4000
#define TAILLE_PAQUET 10
/* Fonctions */
int initSocket(int port, char *adresse, struct sockaddr_in *addr)
{
int sd;
if ( (sd=socket(PF_INET, SOCK_DGRAM, 0)) < 0 )
{ perror("initSocket.socket\n"); return -1; }
bzero(addr, sizeof(*addr));
addr->sin_family = AF_INET;
addr->sin_port = htons(port);
if ( inet_aton(adresse, &addr->sin_addr) == 0 )
{ perror("initSocket.inet_aton\n"); return -1; }
return sd;
}
/* Fonction principale */
int main(int argc, char* argv[])
{
int sd; /* Descripteur de socket */
struct sockaddr_in adresse; /* Adresse au sens socket du serveur */
int taille=sizeof adresse;
char *operation; /* Opération à effectuer */
int op1,op2; /* Opérandes */
unsigned char question[TAILLE_PAQUET]; /* Paquet à envoyer au serveur */
unsigned char reponse[TAILLE_PAQUET]; /* Paquet reçu du serveur */
/* Analyse des arguments */
if(argc!=4){
fprintf(stderr,"Syntaxe : %s addition|multiplication op1 op2\n",argv[0]);
exit(-1);
}
operation=argv[1];
if(strcmp(operation,"multiplication")!=0 && strcmp(operation,"addition")!=0){
fprintf(stderr,"Opération non implantée pour l'instant\n");
exit(-1);
}
op1=atoi(argv[2]);
op2=atoi(argv[3]);
/* Préparation de l'adresse du serveur */
if((sd=initSocket(PORT,SERVEUR,&adresse))<0){
fprintf(stderr,"Impossible de contacter le serveur %s\n",SERVEUR);
exit(-1);
}
/* Préparation de la question */
question[0]=0x0;
question[1]=strcmp(operation,"addition")==0?0x0:0x1;
question[2]=op1>>8;
question[3]=op1&0xff;
question[4]=op2>>8;
question[5]=op2&0xff;
/* Envoi du paquet au serveur */
if(sendto(sd,question,TAILLE_PAQUET,0,(struct sockaddr*)&adresse,taille)<0){
perror("main.sendto\n");
return -1;
}
/* Réception de la réponse */
if(recvfrom(sd,reponse,TAILLE_PAQUET,0,NULL,0)<0){
perror("main.recvfrom\n");
return -1;
}
/* Affichage du résultat */
fprintf(stdout,"Le résultat est : %lu\n",
reponse[6]<<24|reponse[7]<<16|reponse[8]<<8|reponse[9]);
exit(0);
}