Support de cours Réseaux EISTI


Tp2

Présentation

Dans ce TP nous allons nous familiariser avec le matériel étudier les différentes primitives que nous allons utilisées dans la simulation.

Environnement de travail

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.

But du TP

Etudier la syntaxe des différentes primitives nécessaires à l'écriture d'un client et d'un serveur TCP/IP.

Primitives utilisées

Ossature des programmes

Serveur


Voici la marche à suivre pour un serveur

Client


Voici la marche à suivre pour un client

Travail demandé

Corrigés

Serveur

/*************************************************/
/* 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);
}

Client

************************************************/
/* 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