Vous êtes sur la page 1sur 25

1

0ROGRAMMATIONRSEAU
cours @urec.cnrs.fr
2
q 1997 : Bernard Tuy, Jean-Paul Gautier
3
0LAN
q Mode client - serveur
q Gnralits dur les diffrents modes de
communications
Socket
Stream
RPC
q Les Sockets
source : Rseaux locaux et Internet (Laurent Toutain)[HERMES]
4
3OCKET
q Mcanisme d'interface de programmation
permet aux programmes d'changer des donnes
n'implique pas forcment une communication par le rseau
q Avec les protocoles UDP et TCP, une connexion est entirement
dfinie sur chaque machine par :
le type de protocole (UDP ou TCP)
ladresse IP
le numro de port associ au processus
serveur : port local sur lequel les connexions sont attendues
client : allocation dynamique par le systme
5
3OCKET MODECONNECT
APPELSSYTMES
socket
SERVEUR
CLIENT
bind
listen
accept
read
write
close
socket
connect
write
read
close
Etablissement de la connexion
Envoi d'une requte
Rponse
Fermeture
Etat d'attente de requtes
Attente effective (bloquant)
6
3OCKET MODEDATAGRAMME
APPELSSYTMES
socket
SERVEUR
CLIENT
bind
recvfrom
sendto
close
socket
sendto
recvfrom
close
Envoi d'une requte
Rponse
Fermeture
(bind)
7
3OCKET PRIMITIVES5NIX
q Dfinition d'une socket
Cration s = socket (domaine, type, protocoIe)
q domaine
PF_UNIX : locale au systme, nom de fichier dans l'arborescence
PF_INET : accs au rseau en utilisant le protocole IP
PF_ROUTE : passage de paramtres au noyau (tables de routages, table
ARTP)
q type
SOCK_STREAM : protocoles de type mode connect (TCP)
SOCK_DGRAM : protocoles de type mode datagramme (UDP)
SOCK_RAW : utilisation directe des protocoles de bas niveau 3 (IP,
ICMP)
q protocole : identification du protocole utilis. Si 0, le systme dduit ce champ des
2 paramtres prcdents.
8
3OCKET PRIMITIVES5NIX
Adressage
struct sockaddr {
u_char sa_Ien; /*Iongueur totaIe*/
u_char sa_famiIy; /* famiIIe d'adresse */
char sa_data [14] ; /* vaIeurs */
};
q dans le fichier source <sys/socket.h>
struct sockaddr {
u_int8_t sin_Ien ; /*Iongueur totaIe*/
u_int8_t sin_famiIy; /* famiIIe d'adresse */
u_int16_t sin_port;
struct in_addr sin_addr;
int8_t sin_zero[8];
};
q dans le fichier source netinet/in.h
9
3OCKET PRIMITIVES5NIX
Lien entre la socket et le protocole
error = bind (s, adr, adrIong)
q error : entier qui contient le compte-rendu de linstruction
0 : opration correctement droule
-1 : une erreur est survenue
q s descripteur de la socket
q adr pointeur vers la zone contenent ladresse de la station
q adrlong logueur de la zone adr
Ouverture dune connexion
error = connect (s, destaddr, adrIong)
q mmes paramtres que pour bind, la structure destadr contient l'adresse
de la machine distante ainsi que le numro de port atteindre
10
3OCKET PRIMITIVES5NIX
Primitives du serveur
Iisten (s, backIog)
q permet de crer une file d'attente pour recevoir les demandes de
connexion qui n'ont pas encore t prises en compte.
s descripteur de la socket
backlog nombre de requtes maximum autorises.
snew = accept (s, cIientaddr, cIientaddrIen)
q blocage dans l'attente d'une connexion si accept est OK
q les donnes peuvent tre lues ou crites travers la socket snew
11
3OCKET PRIMITIVES5NIX
q Adresses locales et distantes d'une socket
getsockname ( s, localadr, addrlen )
q permet de connatre l'adresse locale d'une socket (celle du bind).
q utile pour connatre le numro de port attribu dynamiquement par le
systme.
getpeername ( s, destadr, addrlen )
q permet de connatre l'adresse distante d'une socket (celle du connect)
pour les sockets en mode connect.
12
3OCKET PRIMITIVES5NIX
q Rception de donnes
cc = read (s , buffer, taillemax )
q buffer est un pointeur vers la zone de rception.
q cc : nombre d'octets rellement reus.
cc = recv (s , buffer, taillemax, drapeau )
q drapeau permet de configurer la connexion
MSG_OOB : lecture "out of band" des messages urgents
MSG_PEEK : lecture des donnes sans les retirer du tampon
cc = recvfrom (s , buffer, taillemax, drapeau , metteur, adrlg)
q metteur contient l'adresse de l'metteur, utilis en mode datagramme
13
3OCKET PRIMITIVES5NIX
q Emission de donnes
write (s , buffer, longueur )
q utilisable uniquement en mode connect (pas d'adresse de destinataire)
send (s , buffer, taillemax, drapeau )
q drapeau permet de configurer la connexion
MSG_OOB : criture "out of band" des messages urgents
MSG_DONTROUTE : dboguage .
sendto (s , buffer, taillemax, drapeau , rcepteur, adrlg)
q rcepteur contient l'adresse du destinataire, utilis en mode datagramme
14
3OCKET PRIMITIVES5NIX
q Fin d'utilisation d'une socket
close ( s )
15
3OCKET PRIMITIVES5NIX
q Accs aux bases de donnes relatives aux sites
struct hostent * gethostbyname ( name )
q interrogation sur /etc/hosts, NIS, DNS
q la structure est dfinie dans netdb.h
struct hostent * gethostbyaddr ( addr, len, type )
gethostname ( name , namelen)
q permet de connatre le nom de la machine locale sur laquelle s'xcute le
programme.
getnetbyname ( name ), getnetbyaddr (netaddr, addrtype)
q le rseau sur lequel on travaille
getprotobyname ( name ), getprotobynumber (number)
q le protocole utilis
getservbyname ( name , proto), getservbyport ( port, proto)
q le service utilis
16
3OCKET EXEMPLE
q Programme permettant de savoir si un utilisateur est connu sur une station.
serveur
client
requte commande : client serveur nom
source : Internetworking with TCP/IP (Douglas COMER)
service TCP dfini dans /etc/services
key 5002/TCP
rponse
17
3OCKETS EXEMPLECLIENT
#incIude <stdio.h>
#incIude <sys/types.h>
#incIude <sys/socket.h>
#incIude <netinet/in.h>
#incIude <netdb.h>
#define BUFSIZE 200
#define NORMAL 0
main (argc,argv)
int argc;
char **argv;
{
int s;
int Ien;
struct sockaddr_in sa;
struct hostent *hp;
struct servent *sp;
descripteur de socket
stucture adresse Internet
structure service de nom
structure service Internet
18
3OCKET EXEMPLECLIENT
char *myname;
char buf[BUFSIZE];
char *host,*user;
myname = argv[0];
if (argc != 3) {
fprintf (stderr, "Usage : %s serveur user\n",myname);
exit (1);
}
user = argv[2];
host = argv[1];
if ((hp = gethostbyname(host)) == NULL) {
fprintf (stderr, "%s : %s serveur inconnu\n",myname,host);
exit (1);
}
pointeur sur le nom du programme
pointeurs sur le serveur et lutilisateur
test des arguments
voir si le serveur existe,
structure hp remplie
19
3OCKET EXEMPLECLIENT
bcopy ((char *)hp->h_addr,(char *)&sa.sin_addr,hp->h_Iength);
sa.sin_famiIy = hp->h_addrtype;
if ((sp = getservbyname("key","tcp")) == NULL) {
fprintf (stderr, "%s : Pas de service QUI sur ce systme \n",myname);
exit (1);
}
sa.sin_port = sp->s_port;
if ((s = socket (hp->h_addrtype, SOCK_STREAM,0)) < 0 ) {
perror ("socket");
exit (1);
}
fprintf ( stdout, "Service %d demand %s\n", sa.sin_port,host );
fprintf ( stdout, "Type d'adresse %d ; descripteur de socket\n",
sa.sin_famiIy,s);
copie de l'adresse du
serveur et du type
d'adresse dans SA
voir si le service est
autoris sur le client,
rempli la structure SP
numro du service
cration de la socket
client, allocation par
le systme
20
3OCKET EXEMPLECLIENT
if ( connect (s,&sa,sizeof(sa)) < 0 ) {
perror ("connect");
exit (1)
}
send ( s, user, strIen(user)+1, NORMAL);
recv ( s, buf, BUFSIZE, NORMAL );
fprintf ( stdout, "Rponse : %s _n", buf);
cIose ( s );
exit (0);
}
connexion au serveur, infos dans la
structure adresse Internet
envoi de la requte
lecture de la rponse
criture de la rponse
fermeture de la connexion
21
3OCKETS EXEMPLESERVEUR
#incIude <stdio.h>
#incIude <sys/types.h>
#incIude <sys/socket.h>
#incIude <netinet/in.h>
#incIude <netdb.h>
#incIude <pwd.h>
#define BUFSIZE 200
#define NORMAL 0
#define BACKLOG 1
#define MAXHOSTNAME 32
#define MAXREQ 3
main (argc,argv)
int argc;
char **argv;
void quiest();
taille de la file d'attente initialise par listen
nombre de requtes traites par ce programme, il
s'arrte ds que la limite est atteinte
22
3OCKET EXEMPLESERVEUR
int s, t;
int i,count_req;
struct sockaddr_in sa;
struct sockaddr_in isa;
struct hostent *hp;
struct servent *sp;
char IocaIhost[MAXHOSTNAME+1];
if ((sp = getservbyname("key","tcp")) == NULL) {
fprintf (stderr, "Pas de service QUI sur ce systme \n");
exit (1);
}
sa.sin_port = sp->s_port;
descripteur de socket
stucture adresse Internet
structure service de nom
structure service Internet
voir si service existe
rcupration du numro de
port serveur dans la
structure SA
23
3OCKET EXEMPLESERVEUR
gethostname (IocaIhost, MAXHOSTNAME);
hp = gethostbyname (IocaIhost);
bcopy(hp->h_addr,(char *)&sa.sin_addr,hp->h_Iength);
sa.sin_famiIy = hp->h_addrtype;
if ((s = socket (hp->h_addrtype, SOCK_STREAM,0)) < 0 ) {
perror ("Serveur : probIme cration socket");
exit (1);
}
if ( bind ( s, &sa, sizeof(sa)) < 0 ) {
fprintf (stderr, "Serveur : probIme cration Iien");
exit (1);
}
Iisten (s, BACKLOG);
fprintf ( stdout, "Service %d sur %s en attente\n",sa.sin_port,IocaIhost);
fprintf (stdout, " type d'adresse : %d _n",sa.sin_famiIy);
infos sur le serveur dans la
structure HP
rempli la structure adresse SA
allocation d'un descripteur de
socket
lien socket avec adresse IP et
port
attente de demande de
connexion
24
3OCKET EXEMPLESERVEUR
for (count_req = 0; count_req <=MAXREQ ; count_req++) {
t = accept ( s, &isa, &i );
fprintf (stdout, "Requte %d\n", count_req);
quiest (t);
cIose (t);
}
cIose ( s );
fprintf (stdout,"fin du service pour %s\n",IocaIhost);
exit (0);
}
attend une requte suer la primitive
accept
traitement de la requte
fermeture de la socket rserve au
traitement de cette requte
25
3OCKET EXEMPLESERVEUR
void quiest (sock)
int sock;
{
struct passwd *p;
char buf[BUFSIZE];
int i;
if (( i = recv( sock, buf, BUFSIZE, NORMAL)) <= 0)
return;
if (( p = getpwnam (buf)) == NULL)
strcpy ( buf, "UtiIisateur inconnu sur Ie serveur\n");
eIse
sprintf ( buf, "%s : %s _n",p->pw_name, p->pw_gecos);
send (sock, buf, strIen (buf), NORMAL);
}
procdure de traitement de la requte
rception de la demande
recherche dans le fichier /etc/passwd
rponse
envoie de la rponse

Vous aimerez peut-être aussi