1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
| /* Communication par socket : Programme Client */
/* Fichier client.c */
/**************************************************************************************/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<netdb.h>
#ifndef LONGUEUR_MAX
#define LONGUEUR_MAX 256
#endif
int main(int argc,char* argv)
{
struct hostent *hp;
struct sockaddr_in adr_serveur;
char machine_serveur[LONGUEUR_MAX];
char machine_cliente[LONGUEUR_MAX];
char mess_emis[128];
char mess_recu[128];
int descript;
int port;
int i;
/* Initialisation du nom de la machine locale */
gethostname(machine_cliente,LONGUEUR_MAX);
/* Obtention du nom du serveur */
fprintf(stdout,"Entrez le nom de la machine serveur : ");
fscanf(stdin,"%s",machine_serveur);
fprintf(stdout,"Le client est sur %s, le serveur est sur %s\n",machine_cliente,machine_serveur);
/* Obtention de l'adresse IP de la machine serveur */
if((hp=gethostbyname(machine_serveur))==NULL)
{
fprintf(stderr,"Erreur client : échec gethostbyname sur %s\n",machine_serveur);
exit(-1);
}
/* Obtention du numéro de port à utiliser */
fprintf(stdout,"Quel est le numéro de port du serveur : ");
fscanf(stdin,"%d",&port);
/* Création de la socket */
if((descript = socket(AF_INET,SOCK_STREAM,0))== -1)
{
perror("Erreur client : probleme création socket");
exit(-1);
}
fprintf(stdout,"Client : Socket créée\n");
/* Préparation de la structure sockaddr_in */
memset(&adr_serveur,0,sizeof (struct sockaddr_in));
adr_serveur.sin_family = AF_INET;
adr_serveur.sin_port = htons(port);
/* Transfert de l'adresse IP du serveur donnée par gethostbyname vers la structure adr_serveur */
memcpy(&adr_serveur.sin_addr.s_addr,hp->h_addr,hp->h_length); /* Autrement : adr_serveur.sin_addr.s_addr = ((struct in_addr*)(hp->h_addr))->s_addr; ou encore
bcopy(hp->h_addr,&adr_serveur.sin_addr.s_addr,hp->h_length);*/
/* Connexion sur le serveur */
if(connect(descript,(struct sockaddr*)(&adr_serveur),sizeof(struct sockaddr_in)) == -1)
{
fprintf(stderr,"Client : problème connexion avec %s\n",machine_serveur);
close(descript);
exit(-1);
}
fprintf(stdout,"Client : connexion réussie avec %s\n",machine_serveur);
/* Envoi de 10 messages sur la socket et réception des réponses du serveur et d'un 11ème commençant par F pour signaler la fin des messages */
for(i=1;i<=10;i++)
{
/* On envoie un message sur la socket */
if(i==11)
{
mess_emis[0]='F';
}
else
{
sprintf(mess_emis,"%d Message(s) du client",i);
}
send(descript,mess_emis,sizeof(mess_emis),0);
fprintf(stdout,"Client : j'ai envoyé : %s\n",mess_emis);
sleep(1);
/* On attend une réponse sur la socket */
recv(descript,mess_recu,sizeof(mess_recu),0);
fprintf(stdout,"Client : j'ai reçu : %s\n",mess_recu);
}
fprintf(stdout,"Client : j'ai fini.\n");
printf("\n\nCode socket : %d\n\n",descript);
close(descript);
return(0);
} |