![]() |
Support de cours Réseaux EISTI |
![]() |
Dans ce TP nous allons nous familiariser avec le matériel étudier les différentes primitives que nous allons utilisées dans la simulation.
L'environnement est constitué de Terminaux X sur le réseau
local (Ethernet 10B2 voir cours). Sur ce réseau local on trouve une
machine SUN: Sparc 20 fonctionnant sous Unix.
Un terminal X est un terminal intelligent qui communique avec la machine
en utilisant le protocole X Window. Ce terminal est intelligent car il dispose
de mémoire et d'un processeur. L'utilisation du processeur du terminal
soulage celui (ou ceux) de la machine.
La machine Unix est souvent appelée Serveur.
Le terminal dans la terminologie X Window est appelé serveur d'affichage
(il attend des ordres venant de la machine). Les clients de ce serveur sont
les applications que l'on exécute sur la machine. La machine joue
donc également le rôle de serveur d'application ou de fichiers.
Etudier la syntaxe des différentes primitives nécessaires à l'écriture d'un client et d'un serveur TCP/IP.
Voici la marche à suivre pour un serveur
Voici la marche à suivre pour un client
/*************************************************/ /* BP le 22/02/1997 */ /* Programme qui recoit un message sur un socket */ /* Ossature d'un serveur ... */ /*************************************************/ /* Fichiers a inclures .... */ #include <stdio.h> #include <errno.h> #include <sys/types.h> #include <sys/socket.h> #include <netdb.h> #include <netinet/in.h> #include <arpa/inet.h> /* Constantes */ /* Message envoye au serveur */ #define TAILLEMAX 100 /* Pour chaine de caracteres */ /* Prototypages */ int main(int argc, char ** argv); int main(int argc, char ** argv) { int Fd; /* Descripteur de fichier (socket) */ int FdAccept; /* Descripteur de fichier (socket) */ struct sockaddr_in Sockaddr; /* Descriptif d'un socket */ struct hostent * Machine; /* Machine ou reside le serveur */ struct servent * Service; /* Service (ou port) ou le serveur est attache */ char Message[TAILLEMAX +1]; int Lenght; /* Verifier l'appel */ if (argc != 2) { fprintf(stderr,"Syntaxe : %s Port...\n",argv[0]); exit (-10); } /* le serveur est sur la machine ou on lance le programme */ Machine = gethostbyname("localhost"); if (Machine == NULL) { perror("Serveur : gethostbyname"); exit(-1); } /* initialisation de la structure */ memset(&Sockaddr,0,sizeof(struct sockaddr_in)); /* on travaille sur TCP/IP */ Sockaddr.sin_family = PF_INET; memcpy(&(Sockaddr.sin_addr),Machine->h_addr,Machine->h_length); /* on ecoute sur quel port ???? */ Service = getservbyname(argv[1],"tcp"); if (Service == NULL) { perror("Serveur : getservbyname"); exit(-2); } Sockaddr.sin_port = Service->s_port; /* On peut avoir le socket */ /* PF_INET => socket tcp/ip */ /* SOCK_STREAM => tcp comme protocol */ /* 0 => protocole par defaut sur tcp */ Fd = socket(PF_INET,SOCK_STREAM,0); if (Fd == -1) { perror("Serveur : socket"); exit(-3); } /* reserver le port sur lequel on veut ecouter */ if (bind(Fd,(struct sockaddr *) & Sockaddr,sizeof(struct sockaddr_in)) == -1) { perror("Serveur : bind"); exit (-4); } /* on attend au maximum une connection a la fois */ if (listen(Fd,1) == -1) { perror("Serveur : listen"); exit (-5); } /* on accepte la connexion */ Lenght = sizeof(struct sockaddr_in); if ((FdAccept = accept(Fd,(struct sockaddr *) &Sockaddr, &Lenght)) == -1) { perror("Serveur : accept"); exit (-6); } /* on tente la lecture du message */ read(FdAccept,Message,TAILLEMAX); printf("On a recu : %s \n",Message); close(FdAccept); close(Fd); exit(0); }
************************************************/ /* BP le 22/02/1997 */ /* Programme qui emet un message sur un socket */ /* Ossature d'un client tcp */ /***********************************************/ /* Fichiers a inclures .... */ #include <stdio.h> #include <errno.h> #include <sys/types.h> #include <sys/socket.h> #include <netdb.h> #include <netinet/in.h> #include <arpa/inet.h> /* Constantes */ /* Message envoye au serveur */ #define MESSAGE " Message du client .... " /* Prototypages */ int main(int argc, char ** argv); int main(int argc, char ** argv) { int Fd; /* Descripteur de fichier (socket) */ struct sockaddr_in Sockaddr; /* Descriptif d'un socket */ struct hostent * Machine; /* Machine ou reside le serveur */ struct servent * Service; /* Service (ou port) ou le serveur est attache */ /* verifier le lancement */ if ( argc != 3) { fprintf(stderr," Syntaxe : %s : Machine Port...\n",argv[0]); exit(-10); } /* addresse de la machine du serveur */ Machine = gethostbyname(argv[1]); if (Machine == NULL) { perror("Client : gethostbyname"); exit(-1); } /* initialisation de la structure */ memset(&Sockaddr,0,sizeof(struct sockaddr_in)); /* on travaille sur TCP/IP */ Sockaddr.sin_family = PF_INET; memcpy(&Sockaddr.sin_addr,Machine->h_addr,Machine->h_length); /* on ecoute sur quel port ???? */ Service = getservbyname(argv[2],"tcp"); if (Service == NULL) { perror("Client : getservbyname"); exit(-2); } Sockaddr.sin_port = Service->s_port; /* On peut avoir le socket */ /* PF_INET => socket tcp/ip */ /* SOCK_STREAM => tcp comme protocol */ /* 0 => protocole par defaut sur tcp */ Fd = socket(PF_INET,SOCK_STREAM,0); if (Fd == -1) { perror("Client : socket"); exit(-3); } /* on se connecte au serveur */ if ( connect(Fd,(struct sockaddr *) &Sockaddr,sizeof(struct sockaddr_in)) == -1) { perror("Client : connect"); exit(-4); } /* on tente la l'envoie d'un message */ write(Fd,MESSAGE,strlen(MESSAGE) +1 ); close(Fd); exit(0); }
![]() |
Support de cours Réseaux EISTI |
![]() |