You are on page 1of 29

Prpar par : A.

Begdouri
4ISI 2015 2016

Introduction
Sockets
Cration, attachement, fermeture

Sockets dans le domaine unix


Mode connect
Mode non connect

Sockets dans le domaine internet


Mode connect
Mode non connect
Serveur parallle

Un ordinateur connect Internet possde au moins 2


adresses rseau:
Adresse ethernet:
Assigne par le constructeur sur 48 bits
Notation hexadcimale: 6 groupes de 8 bits spars par /

Adresse IP de 32 bits:
Assigne par ladministrateur rseau
Notation dcimale pointe: 4 dcimaux spars par des .

En plus dun nom DNS (optionnel)

Ladresse IP contient assez dinformation pour identifier de


manire unique un rseau donn et un ordinateur spcifique
sur le rseau
5 classes dadresse IP

Un nom de domaine peut tre associ une adresse IP


Un nom de domaine est organis sous forme dune structure
hirarchique:
Un code didentification du pays (ma pour le Maroc, fi pour

Finlande, ca pour Canada, us pour les tats Unis, etc).


Un code didentification de lorganisation (ac pour acadmique,
com pour commercial, edu pour education, gov pour
gouvernement, etc).
Un code didentification dun sous domaine (fstf.smba).
Le nom de la machine hte.

Mamachine.fstf.usmba.ac.ma

Un processus doit tre identifi de manire unique afin de


pouvoir raliser une communication inter-processus.
Un numro de port de 16 bits est associ chaque processus.

La couche Internet utilise ladresse IP pour transfrer des


donnes dun ordinateur un autre.
La couche Transport utilise le numro de port pour livrer
les donnes au processus appropri sur lordinateur de
destination.

Protocole UDP (User Datagram Protocol)


Lentte est minimale.
La livraison des donnes nest pas fiable.
Pas besoin dtablir une connexion.

Protocole TCP (Transmission Control Protocol)


Le total de contrle (checksum) est calcul et inclus dans chaque

paquet.
La livraison des donnes est fiable.
tablir la connexion avant la transmission de donnes.

Le champ Checksum est optionnel => Il est mis zro


lorsquil nest pas utilis.
Si le total de contrle nest pas effectu aucun contrle
nest effectu sur les donnes

le protocole IP effectue le checksum sur lentte IP et non sur le

champ des donnes

Aprs sa cration, une socket n'est connue que du processus


qui l'a cr (et de ses descendants).
Elle doit tre dsigne par une adresse pour pouvoir tre
contacte de l'extrieur (autres processus locaux ou
distants).
Adresse de socket

Adresse de la domaine Unix AF_UNIX

une entre dans le systme de fichiers (local ou par NFS)

Adresse du domaine Internet AF_INET


(adresse IP de lla machine, numro de port)

Adresse IP + numro de port

Un port est un entier sur 16 bits

Sos Unix, les ports < 1024 sont privilgis

Certains ports sont allous des services reconnus

La liste des services se trouve dans:


/etc/services sous unix/linux

La liste des excutables servant ces services via inetd se

trouve dans /etc/ inetd

La structure dune adresse de socket dans le domaine


internet est predfinie dans le fichier <netinet/in.h>

Struct in_addr{ ulong s_addr ;} ;

Struct sockaddr_in
{
Short
sin_family;
U_short
sin_port ;
Struct in_addr sin_addr;
Char
sin_zero[8];
};

/*la famille de ladresse: AF_INET*/


/*le numro de port*/
/*N IP de la machine au format rseau*/
/*champ de 8 zros (bourrage)*/

Adresse locale tre attache une socket localement


ct serveur

Adresse loigne afin de pouvoir contacter un processus


distant
Le client doit connaitre ladresse loigne du serveur afin de

pouvoir le contacter
Gnralement, il utilise la rsolution de nom DNS

Structure dfinie dans <netdb.h>

Dcrit un hte du rseau


Son nom (au sens DNS)

Les alias de ce nom


Le type et la longueur des adresses rseau de ce hte

Lensemble des adresses rseau de cet hte

Include<netdb.h>
Struct hostent
{
Char *h_name;
Char **h_aliases;
Int h_addrtype;
Int h_length;
Char **h_addr_list;
#define h_addr h_addr_list[O];
};

/*nom officiel de la machine*/


/*liste d'alias*/
/*type d'adresse: AF-INET*/
/*longueur de l'adresse*/
/*liste d'adresses de type struct in_addr*/
/*la premire adresse de la liste*/

Obtenir une adresse IP partir d'un nom DNS

#include<sys/types.h> #include<sys/socket.h>
#include<netinet/in.h> #include<netdb.h> #include<arpa.h>
Struct hostent* gethostbyname(char *name);

Retourne un pointeur sur la structure hostent correspondant la


machine ayant le nom DNS name
#include<sys/types.h> #include<sys/socket.h>
#include<netinet/in.h> #include<netdb.h> #include<arpa.h>
Struct hostent* gethostbyaddr(char *adrIP, int len, int type);

Retourne un pointeur sur la structure hostent correspondant la


machine dont ladresse IP est adrIP. (le type correspond
AF_INET)

Ladresse IP retourne est de format rseau: de type struct in_addr


Fonctions de conversion

#include<sys/types.h> #include<sys/socket.h>
#include<netinet/in.h> #include<netdb.h> #include<arpa.h>
char* inetntoa(struct in_addr adr);

Convertit ladresse de type in_addr en adresse en notation dcimale


pointe
#include<sys/types.h> #include<sys/socket.h>
#include<netinet/in.h> #include<netdb.h> #include<arpa.h>
Unsigned long inetaddr(char* adr);

Convertit une adresse en notation dcimale pointe vers la notation


rseau condense

Pour rcuprer le nom de la machine locale

Pour rcuprer ladresse IP de la machine locale


Long gethostid();

Renvoie la premire adresse IP de la machine locale


sous forme dun entier dcimal de 4 octets

Info. sur une machine dont on connait ladresse


Gethostbyaddr()

Info. Sur le protocole utilis


Getprotobyname(), getprotobynumber()

Info. Sur le rseau


Getnetbyname(), getnetbyaddr()

Info. Sur les services


Getservbyname(), getservbyport()
(liste des services dans le fichier /etc/services)

Toutes les structures utilises et/ou renvoyes par ces


fonctions sont dfinies dans <netdb.h>

Adresse destine tre attache localement (ct serveur)

#define ip_local 127.0.0.1


struct sockaddr_in adr_loc

adr_loc.sin_family = AF_INET;
adr_loc.sin_port = 0;
/* le port sera allou dynamiquement */
adr_loc.sin_addr.s_addr = htonl(INADDR_ANY); /* adresse jocker */
OU
adr_loc.sin_addr.s_addr = inet_addr(ip_local);

Adresse loigne (ct client)

#define ip_serveur 192.123.1.1


struct sockaddr_in adr_dis, char *nom_hte_dis, int port
struct hostent *hp;
Adr_dis.sin_family = AF_INET;
Adr_dis.sin_port = htons(port);
hp=gethostbyname(nom_hte_dis)
If (hp==NULL) print("%s : machine inconnue ",nom_hte_dis);
bcopy(hp->h_addr,&adr_serveur.sin_addr.s_addr,hp->h_length);
OU
adr_serveur.sin_addr.s_addr = inet_addr(ip_serveur)

NBO: Network Byte Order

Conversion entre la reprsentation interne et la


reprsentation rseau des entiers

- Passage de la reprsentation rseau d'un entier long sa reprsentation


ntohl(x) Network to host long locale
- utiliser avant dinterprter localement un champs de type long

- Passage de la reprsentation rseau d'un entier court sa reprsentation


ntohs(x) Network to host short locale
- utiliser avant dinterprter localement un champs de type short
- Passage de la reprsentation locale d'un entier long sa reprsentation
htonl(x) Host to network long rseau.
- utiliser avant denvoyer ou initialiser un champs de type long
- Passage de la reprsentation locale d'un entier court sa reprsentation
htons(x) Host to network short rseau
- utiliser avant denvoyer ou initialiser un champs de type short

Ecrire un programme permettant dafficher:


Le nom DNS
Toutes les adresses IP

de votre machine.