89
Systèmes distribu és Sockets 1 Université du Littoral - Côte d’Opale Les sockets L. Deruelle – N. Melab [email protected]

Systèmes distribuésSockets1 Université du Littoral - Côte dOpale Les sockets L. Deruelle – N. Melab [email protected]

Embed Size (px)

Citation preview

Page 1: Systèmes distribuésSockets1 Université du Littoral - Côte dOpale Les sockets L. Deruelle – N. Melab deruelle@lil.univ-littoral.fr

Systèmes distribués Sockets 1

Université du Littoral - Côte d’Opale Université du Littoral - Côte d’Opale

Les sockets

L. Deruelle – N. [email protected]

Page 2: Systèmes distribuésSockets1 Université du Littoral - Côte dOpale Les sockets L. Deruelle – N. Melab deruelle@lil.univ-littoral.fr

Systèmes distribués Sockets 2

Plan

Le modèle Sockets java Sockets C-UNIX BSD 4.X

Page 3: Systèmes distribuésSockets1 Université du Littoral - Côte dOpale Les sockets L. Deruelle – N. Melab deruelle@lil.univ-littoral.fr

Systèmes distribués Sockets 3

Le modèle

Sockets : interface (point de communication) client/serveur utilisée à l’origine dans le monde UNIX et TCP/IP

Etendue aux PCs (Winsock) et mainframes Primitives pour le support de communications

reposant sur les protocoles (TCP/IP, UDP/IP) Les applications client/serveur ne voient les

couches de communication qu’à travers l’API socket (abstraction)

Page 4: Systèmes distribuésSockets1 Université du Littoral - Côte dOpale Les sockets L. Deruelle – N. Melab deruelle@lil.univ-littoral.fr

Systèmes distribués Sockets 4

Application cliente

API Socket

UDP TCP

IP

Physique

Application serveur

API Socket

UDP TCP

IP

Physique

Protocole Applicatif

Sockets/OSI

Page 5: Systèmes distribuésSockets1 Université du Littoral - Côte dOpale Les sockets L. Deruelle – N. Melab deruelle@lil.univ-littoral.fr

Systèmes distribués Sockets 5

Rôle des sockets

Connexion à une machine distante Envoi/Réception de données Fermeture d’une connexion Attachement à un port Acceptation d’une demande de connexion à

un port local Attente de demandes de connexion

Page 6: Systèmes distribuésSockets1 Université du Littoral - Côte dOpale Les sockets L. Deruelle – N. Melab deruelle@lil.univ-littoral.fr

Systèmes distribués Sockets 6

Notion de port

Connexion réseau Adresse internet de la machine Numéro du port

Pourquoi les ports ? Sur une même machine, plusieurs services sont

accessibles simultanément (web, email, etc.) Points d’accès : ports logiques (65535) Rien à avoir avec les ports physiques (série et

parallèle)

Page 7: Systèmes distribuésSockets1 Université du Littoral - Côte dOpale Les sockets L. Deruelle – N. Melab deruelle@lil.univ-littoral.fr

Systèmes distribués Sockets 7

Désignation des ports

Port : numéro allant de 1 à 65535 Les ports 1 à 1023 sont réservés aux

services courants : finger, ftp, http (80), SMTP (25), etc.

Fichier d’assignation de ports : /etc/services

Page 8: Systèmes distribuésSockets1 Université du Littoral - Côte dOpale Les sockets L. Deruelle – N. Melab deruelle@lil.univ-littoral.fr

Systèmes distribués Sockets 8

Adresse internet

Connexion réseau Adresse internet de la machine Numéro : 193.49.192.193

Désignation par des noms symboliques Association de noms symboliques aux adresses

numériques Domain Name System (ou DNS) Exemple : lil.univ-littoral.fr : 193.49.192.193

Page 9: Systèmes distribuésSockets1 Université du Littoral - Côte dOpale Les sockets L. Deruelle – N. Melab deruelle@lil.univ-littoral.fr

Systèmes distribués Sockets 9

Sockets java

Page 10: Systèmes distribuésSockets1 Université du Littoral - Côte dOpale Les sockets L. Deruelle – N. Melab deruelle@lil.univ-littoral.fr

Systèmes distribués Sockets 10

Gestion des ports (adresses) en Java

Classe InetAdress Dans java.net Champs

hostName (exemple : lil.univ-littoral.fr) address (32 bits, exemple : 193.49.192.193)

Pas de constructeur 3 méthodes statiques

public static InetAddress InetAddress .getByName(String hote) public static InetAddress[] InetAddress .getAllByName(String

hote) public static InetAddress InetAddress .getLocalHost()

Classes Socket, SocketServer et SocketImpl getInetAddress()

Page 11: Systèmes distribuésSockets1 Université du Littoral - Côte dOpale Les sockets L. Deruelle – N. Melab deruelle@lil.univ-littoral.fr

Systèmes distribués Sockets 11

Gestion des sockets

Taxinomie Sockets TCP

Point à point : Socket, ServerSocket, SocketImlp

Sockets UDP Point à point : DatagramSocket Multi-point : MultiCastSocket

Dans java.net

Page 12: Systèmes distribuésSockets1 Université du Littoral - Côte dOpale Les sockets L. Deruelle – N. Melab deruelle@lil.univ-littoral.fr

Systèmes distribués Sockets 12

Sockets TCP

Classe Socket Connexion à une machine distante Envoi/Réception de données Fermeture d’une connexion

Classe ServerSocket Attachement à un port Acceptation d’une demande de connexion à un

port local Attente de demandes de connexion

Page 13: Systèmes distribuésSockets1 Université du Littoral - Côte dOpale Les sockets L. Deruelle – N. Melab deruelle@lil.univ-littoral.fr

Systèmes distribués Sockets 13

Classe Socket (1)

Constructeurs public Socket(String hote, int port) throws

UnknownHostException, IOException public Socket(InetAddress hote, int port) throws

IOException public Socket(String hote, int port, InetAddress

adrLocale, int portLocal) throws IOException public Socket(InetAddress hote, int port, InetAddress

adrLocale, int portLocal) throws IOException public Socket() protected Socket(SocketImpl impl)

Page 14: Systèmes distribuésSockets1 Université du Littoral - Côte dOpale Les sockets L. Deruelle – N. Melab deruelle@lil.univ-littoral.fr

Systèmes distribués Sockets 14

Classe Socket (2)

Information public InetAddress getInetAddress() public int getPort() public int getLocalPort() public InetAddress getLocalAddress()

Envoi/Réception de données public InputStream getInputStream() throws IOException public OutputStream getOutputStream() throws IOException

Fermeture public void close() throws IOException

Page 15: Systèmes distribuésSockets1 Université du Littoral - Côte dOpale Les sockets L. Deruelle – N. Melab deruelle@lil.univ-littoral.fr

Systèmes distribués Sockets 15

Classe Socket (3)

Options TCP_NODELAY

Donnée expédiée aussitôt que possible quelque soit leur taille

Méthodes setTcpNoDelay (boolean valid) et getTcpNoDelay() : (true) 1

SO_LINGER Attente ou non avant de fermer une socket au cas où il reste

des données à envoyer Méthodes setSoLinger (boolean valid, int secondes) et

getSoLinger() : 128s

Page 16: Systèmes distribuésSockets1 Université du Littoral - Côte dOpale Les sockets L. Deruelle – N. Melab deruelle@lil.univ-littoral.fr

Systèmes distribués Sockets 16

Classe Socket (4)

SO_TIMEOUT Déclenchement d’exception si le délai spécifié est dépassé

lors de la réception de données Méthodes setSoTimeout (int ms) et getSoTimeout() :

4102ms

Exceptions SocketException

BindException : port déjà utilisé ou le programme n’a pas le droit de l’utiliser

ConnectException : hôte occupé ou aucun processus n’écoute sur le port

NoRouteToHostException : dépassement de temps

Page 17: Systèmes distribuésSockets1 Université du Littoral - Côte dOpale Les sockets L. Deruelle – N. Melab deruelle@lil.univ-littoral.fr

Systèmes distribués Sockets 17

Classe ServerSocket (1)

Rôle : standardiste Gestion d’une connexion

Création d’un nouvel objet ServerSocket affecté à un port : constructeur ServerSocket

Attente de connexions (bloquant) : accept() Echange d’informations : getInputStream() et

getOutputStream() Clôture de la connexion par le client ou le serveur :

close() Nouvelle attente

Page 18: Systèmes distribuésSockets1 Université du Littoral - Côte dOpale Les sockets L. Deruelle – N. Melab deruelle@lil.univ-littoral.fr

Systèmes distribués Sockets 18

Classe ServerSocket (2)

Constructeurs public ServerSocket(int port) throws IOException,

BindException public ServerSocket(int port, int taillefile) throws

IOException, BindException public ServerSocket(int port, int taillefile, InetAddress

adresseAttache) throws IOException protected ServerSocket()

Prise en compte et clôture d’une connexion public Socket accept() throws IOException public void close() throws IOException

Page 19: Systèmes distribuésSockets1 Université du Littoral - Côte dOpale Les sockets L. Deruelle – N. Melab deruelle@lil.univ-littoral.fr

Systèmes distribués Sockets 19

Classe ServerSocket (3)

Information public InetAddress getInetAddress() public int getLocalPort()

Options SO_TIMEOUT

Doit être initialisé avant accept Méthodes setSoTimeout (int ms) et getSoTimeout()

Page 20: Systèmes distribuésSockets1 Université du Littoral - Côte dOpale Les sockets L. Deruelle – N. Melab deruelle@lil.univ-littoral.fr

Systèmes distribués Sockets 20

Protocoles TCP et UDPProtocoles TCP et UDP

TCP Garantie d’arrivée dans l’ordre de paquets de

données Fiabilité de transmission Lenteur des transmissions (http par exemple) Vu comme un «service téléphonique»

UDP Arrivée dans le bon ordre non garantie Non fiabilité des transmissions Rapidité des transmissions Applications audio/vidéo Vu comme un «service postal»

Page 21: Systèmes distribuésSockets1 Université du Littoral - Côte dOpale Les sockets L. Deruelle – N. Melab deruelle@lil.univ-littoral.fr

Systèmes distribués Sockets 21

Sockets UDP point-à-pointSockets UDP point-à-point

Pas de différence de classe entre le client et le serveur

Deux classes Java dans java.net DatagramPacket DatagramSocket

DatagramPacket Assemblage des données en partance en

datagrammes Extraction des données des datagrammes reçus

DatagramSocket Envoi et réception des datagrammes UDP (objets

DatagramPacket)

Page 22: Systèmes distribuésSockets1 Université du Littoral - Côte dOpale Les sockets L. Deruelle – N. Melab deruelle@lil.univ-littoral.fr

Systèmes distribués Sockets 22

Classe DatagramPacket (1)Classe DatagramPacket (1)

Constructeurs DatagramPacket destiné à la réception de

données public DatagramPacket(byte tampon[], int

longueur) Réception des données dans tampon Longueur maximale : 65 507 octets Java remplit les champs de DatagramPacket : adresse IP

de la machine distante et le numéro de port concerné

DatagramPacket destiné à l’envoi de données public DatagramPacket(byte tampon[], int

longueur, InetAddress ia, int port) Conseil : utiliser getBytes() de la classe String pour

transformer des chaînes de caractères en tableaux d’octets

Page 23: Systèmes distribuésSockets1 Université du Littoral - Côte dOpale Les sockets L. Deruelle – N. Melab deruelle@lil.univ-littoral.fr

Systèmes distribués Sockets 23

Classe DatagramPacket (2)Classe DatagramPacket (2)

Information (suite) public byte[] getData()

Tableau d’octets du datagramme Caractères ASCII : String s=new String(dp.getData(), 0,

0, dp.getLength()); Caractères non ASCII : ByteArrayInputStream b=new

ByteArrayInputStream(dp.getData(), 0, 0, dp.getLength());

public InetAddress getLength() Taille en octets du datagramme

Page 24: Systèmes distribuésSockets1 Université du Littoral - Côte dOpale Les sockets L. Deruelle – N. Melab deruelle@lil.univ-littoral.fr

Systèmes distribués Sockets 24

Classe DatagramSocket (1)Classe DatagramSocket (1)

Constructeurs DatagramSocket utilisé par le client

public DatagramSocket() throws SocketException Ports de destination et de partance spécifiés dans le

datagramme (objet DatagramPacket) DatagramSocket utilisé par le serveur

public DatagramSocket(int port) throws SocketException

Remarque : les ports TCP et leurs équivalents UDP ne sont pas liés i.e. un même numéro de port peut être associé à la fois à une socket TCP et une socket UDP sans provoquer aucun problème de conflit

DatagramSocket utilisé par le serveur multi-adresse public DatagramSocket(int port, InetAdress ia)

throws SocketException

Page 25: Systèmes distribuésSockets1 Université du Littoral - Côte dOpale Les sockets L. Deruelle – N. Melab deruelle@lil.univ-littoral.fr

Systèmes distribués Sockets 25

Classe DatagramSocket (2)Classe DatagramSocket (2)

Emission/Réception de datagrammes public void send(DatagramPacket dp) throws

IOException public void receive(DatagramPacket dp) throws

IOException

Information public int getLocalPort() Numéro de port (anonyme et assigné par le système) sur

lequel la socket courante écoute

Fermeture public void close()

Option : SO_TIMEOUT public void setSoTimeout(int timeout) throws

SocketException

Page 26: Systèmes distribuésSockets1 Université du Littoral - Côte dOpale Les sockets L. Deruelle – N. Melab deruelle@lil.univ-littoral.fr

Systèmes distribués Sockets 26

Sockets multi-pointsSockets multi-points

Communication multi-points : on s’adresse à un groupe qu’on peut intégrer et quitter à sa guise Exemples : visio-conférence, radio, télévision, etc.

Multi-points = compromis Multi-diffusions Point-à-point

Caractéristiques Efficace car données dupliquées au moment opportun Basée sur l’utilisation de routeurs multi-point

Applications Jeu réseau multi-utilisateurs, SGF distribués, calcul

parallèle & distribué, etc.

Page 27: Systèmes distribuésSockets1 Université du Littoral - Côte dOpale Les sockets L. Deruelle – N. Melab deruelle@lil.univ-littoral.fr

Systèmes distribués Sockets 27

PrincipePrincipe

Routeurmulti-point

Page 28: Systèmes distribuésSockets1 Université du Littoral - Côte dOpale Les sockets L. Deruelle – N. Melab deruelle@lil.univ-littoral.fr

Systèmes distribués Sockets 28

PrincipePrincipe

Routeurmulti-point

Page 29: Systèmes distribuésSockets1 Université du Littoral - Côte dOpale Les sockets L. Deruelle – N. Melab deruelle@lil.univ-littoral.fr

Systèmes distribués Sockets 29

PrincipePrincipe

Routeurmulti-point

Page 30: Systèmes distribuésSockets1 Université du Littoral - Côte dOpale Les sockets L. Deruelle – N. Melab deruelle@lil.univ-littoral.fr

Systèmes distribués Sockets 30

PrincipePrincipe

Routeurmulti-point

Page 31: Systèmes distribuésSockets1 Université du Littoral - Côte dOpale Les sockets L. Deruelle – N. Melab deruelle@lil.univ-littoral.fr

Systèmes distribués Sockets 31

Adresses et groupes multi-points (1)

Adresse multi-points Référence un groupe d’hôtes (groupe multi-points) Rangée dans la classe D

Groupe multi-points Plusieurs hôtes Internet partageant la même adresse

multi-points Libre adhésion ou départ au/du groupe

lnternet Assigned Number Autority (IANA) est responsable de l’affectation des adresses mutli-points Il en existe 80 Exemple : AUDIONEWS.MCAST.NET --> 224.0.1.7 -

Actualité audio transmise en multi-points

Page 32: Systèmes distribuésSockets1 Université du Littoral - Côte dOpale Les sockets L. Deruelle – N. Melab deruelle@lil.univ-littoral.fr

Systèmes distribués Sockets 32

Adresses et groupes multi-points (2)

Liste exhaustive dans : http://www.iana.org/assignments/multicast-addresses

Il existe des routeurs multi-points (mrouteurs) Datagramme multi-points

...En-tête IP

Hôte expéditeurHôte destinataire

En-tête UDP

Port expéditeurPort destinataire

Charge utile

LongueurContrôle pour fiabilité

TTL

2 octets 2 octets 2 octets 2 octets4 octets 4 octets1 octet

Page 33: Systèmes distribuésSockets1 Université du Littoral - Côte dOpale Les sockets L. Deruelle – N. Melab deruelle@lil.univ-littoral.fr

Systèmes distribués Sockets 33

Time-To-Live (TTL)Time-To-Live (TTL)

Définition Portée d’un datagramme i.e. nombre de routeurs maximum

par lesquels un datagramme transite avant sa suppression Réseau local : TTL=1, Région : TTL=16, Monde entier :

TTL=127 Utilisation

TTL décrémentée à chaque passage dans un routeur TTL=0 : datagramme supprimé

Page 34: Systèmes distribuésSockets1 Université du Littoral - Côte dOpale Les sockets L. Deruelle – N. Melab deruelle@lil.univ-littoral.fr

Systèmes distribués Sockets 34

Mise en œuvre des sockets multi-point

Mise en œuvre des sockets multi-point

Classe java.net.MulticastSocket Dérivée de la classe java.net.DatagramSocket

Constructeurs public MulticastSocket() throws

SocketException Port assigné par le système getLocalPort() : renvoie le numéro du port

public MulticastSocket(int port) throws SocketException

Page 35: Systèmes distribuésSockets1 Université du Littoral - Côte dOpale Les sockets L. Deruelle – N. Melab deruelle@lil.univ-littoral.fr

Systèmes distribués Sockets 35

Communication avec un groupe multi-point (1)

Communication avec un groupe multi-point (1)

Opérations possibles Adhésion à un groupe Echanger (Emettre/Recevoir) des données avec

les membres d’un groupe Quitter un groupe

Méthodes public void joinGroup(InetAddress

adrmultipt) throws SocketException public void leaveGroup(InetAddress

adrmultipt) throws SocketException

Page 36: Systèmes distribuésSockets1 Université du Littoral - Côte dOpale Les sockets L. Deruelle – N. Melab deruelle@lil.univ-littoral.fr

Systèmes distribués Sockets 36

Communication avec un groupe multi-point (2)

Communication avec un groupe multi-point (2)

Public synchronized void send(DatagramPacket dp, byte ttl) throws IOException, SocketException

public void setInterface(InetAddress interface) throws SocketException

public InetAddress getInterface() throws SocketException

Non autorisé avec les applets!

Page 37: Systèmes distribuésSockets1 Université du Littoral - Côte dOpale Les sockets L. Deruelle – N. Melab deruelle@lil.univ-littoral.fr

Systèmes distribués Sockets 37

Exemple de gestion de groupesExemple de gestion de groupes

// join a Multicast group and send the group salutations ... String msg = "Hello"; InetAddress group = InetAddress.getByName("228.5.6.7"); MulticastSocket s = new MulticastSocket(6789); s.joinGroup(group); DatagramPacket hi = new

DatagramPacket(msg.getBytes(),msg.length(),group, 6789);s.send(hi); // get their responses! byte[] buf = new byte[1000]; DatagramPacket recv = new DatagramPacket(buf, buf.length); s.receive(recv); // OK, I'm done talking - leave the group... s.leaveGroup(group);

Page 38: Systèmes distribuésSockets1 Université du Littoral - Côte dOpale Les sockets L. Deruelle – N. Melab deruelle@lil.univ-littoral.fr

Systèmes distribués Sockets 38

Sockets en C/UNIX

Page 39: Systèmes distribuésSockets1 Université du Littoral - Côte dOpale Les sockets L. Deruelle – N. Melab deruelle@lil.univ-littoral.fr

Systèmes distribués Sockets 39

Association d’un descripteur (au niveau système) à une socket (idem fichier) Le concepteur d’application utilise ce descripteur pour référencer la communication client/serveur sous-jacente Une structure de données «socket» est créée à l’ouverture d’une socket

Sockets : abstraction (1)

Page 40: Systèmes distribuésSockets1 Université du Littoral - Côte dOpale Les sockets L. Deruelle – N. Melab deruelle@lil.univ-littoral.fr

Systèmes distribués Sockets 40

Table de descripteursde fichiers

Family : PF_INET

Service : SOCK_STREAM

Local IP : 111.22.3.4

Remote IP : 123.45.6.78

Local Port : 2249

Remote Port : 3726Table de descripteursd’un processus Structure Socket

Structure initialement vide Remplissage par les primitives sur sockets

Sockets : abstraction (2)

Page 41: Systèmes distribuésSockets1 Université du Littoral - Côte dOpale Les sockets L. Deruelle – N. Melab deruelle@lil.univ-littoral.fr

Systèmes distribués Sockets 41

Caractéristiques

Page 42: Systèmes distribuésSockets1 Université du Littoral - Côte dOpale Les sockets L. Deruelle – N. Melab deruelle@lil.univ-littoral.fr

Systèmes distribués Sockets 42

Domaine UNIX Notation : PF_UNIX

Communication intra-machine (mémoire centrale)

Pas de passage par le réseau Domaine Internet

Notation : PF_INET

Communication intra-machine et réseau

Domaine de communication

Page 43: Systèmes distribuésSockets1 Université du Littoral - Côte dOpale Les sockets L. Deruelle – N. Melab deruelle@lil.univ-littoral.fr

Systèmes distribués Sockets 43

Datagram Notation : SOCK_DGRAM

Pas de circuit virtuel entre les 2 sockets : chaque paquet est envoyé indépendamment des autres Non fiable, non séquencé mais préservation des frontières des paquets

Circuit virtuel Notation : SOCK_STREAM

Connexion fixe comme un pipe UNIX Fiable, séquence préservée, pas de doublons

Types de communication (1)

Page 44: Systèmes distribuésSockets1 Université du Littoral - Côte dOpale Les sockets L. Deruelle – N. Melab deruelle@lil.univ-littoral.fr

Systèmes distribués Sockets 44

Pas de préservation des frontières des paquets Exemple : le processus émet par 2 octets, le récepteur reçoit par 3 octets

Raw Notation : SOCK_RAW

Utilisation directe d’IP (réservé à ROOT) Sequenced packet

Notation : SOCK_SEQPACKET

Avantages des circuits virtuels + préservation des frontières des paquets

Types de communication (2)

Page 45: Systèmes distribuésSockets1 Université du Littoral - Côte dOpale Les sockets L. Deruelle – N. Melab deruelle@lil.univ-littoral.fr

Systèmes distribués Sockets 45

Intérêt Un point de transport (ex : socket) n’est

accessible de l’extérieur que si on lui a associé une adresse

Explicitement (primitive bind()) Implicitement (dans Internet, connect(), send(), etc.)

Format général struct sockaddr {

short sa_family; /* famille d’adresses (AF_INET, AF_UNIX,etc) */

char sa_data[14]; /* adresse effective */

};

Adressage des sockets

Page 46: Systèmes distribuésSockets1 Université du Littoral - Côte dOpale Les sockets L. Deruelle – N. Melab deruelle@lil.univ-littoral.fr

Systèmes distribués Sockets 46

Où est-elle mise ? Entrée dans le SGF créée par bind() (type : s)

Ex : /home/deruelle/ma_socket

Format dans <sys/un.h> struct sockadd_un {

short sun_family; /* AF_UNIX ou AF_UNSPEC*/

char sun_path[108]; /* chemin */

};

Format des adresses du domaine UNIX

Page 47: Systèmes distribuésSockets1 Université du Littoral - Côte dOpale Les sockets L. Deruelle – N. Melab deruelle@lil.univ-littoral.fr

Systèmes distribués Sockets 47

Format Adresse internet de la machine + son numéro de port

Format dans <netinet/in.h> struct in_addr {

union {

//struct {u_char s_b1, s_b2, s_b3, s_b4} S_un_b; //struct {u_short s_w1, s_w2} S_un_w;

u_long S_addr;

} S_un;

#define s_addr S_un.S_addr /* should be used for all code */

};

Format des adresses du domaine Internet (1)

Page 48: Systèmes distribuésSockets1 Université du Littoral - Côte dOpale Les sockets L. Deruelle – N. Melab deruelle@lil.univ-littoral.fr

Systèmes distribués Sockets 48

struct sockaddr_in {

short sin_family; /* AF_INET ou AF_UNSPEC */

u_short sin_port; /* Port en format réseau */

struct in_addr sin_addr; /* Adresse internet de la machine

en format réseau (sin_addr.s_addr est u_long) */

char sin_zero[8]; /* Non utilisé, doit être mis à 0 */

};Remarque

htons() (Host To Network Short) permet de transformer

une représentation machine en format réseau.

Format des adresses du domaine Internet (2)

Page 49: Systèmes distribuésSockets1 Université du Littoral - Côte dOpale Les sockets L. Deruelle – N. Melab deruelle@lil.univ-littoral.fr

Systèmes distribués Sockets 49

Construction des adresses internet

Il s’agit d’instancier sin_port et sin_addr Trois utilitaires

A - Socket locale B - Socket distante dont on connaît

le nom de la machine le numéro de port

C - Socket distante dont on connaît le nom de la machine le nom d’un service bien connu et son protocole

Page 50: Systèmes distribuésSockets1 Université du Littoral - Côte dOpale Les sockets L. Deruelle – N. Melab deruelle@lil.univ-littoral.fr

Systèmes distribués Sockets 50

Adresse dans le cas A

void mySelfAddress (struct sockaddr_in *o_a) {

o_a->sin_family = AF_INET;

o_a->sin_port = htons(0); /* Allocation dynamique du port par bind() */

o_a->sin_addr.s_addr = INADDR_ANY; /* Adresse joker */

}

INADDR_ANY : constante signifiant que le serveur est accessible de partout.

Page 51: Systèmes distribuésSockets1 Université du Littoral - Côte dOpale Les sockets L. Deruelle – N. Melab deruelle@lil.univ-littoral.fr

Systèmes distribués Sockets 51

Adresse dans le cas B

void peerAddress (struct sockaddr_in *o_pa,

const char *rhost, int port) { struct hostent *h; o_pa->sin_family = AF_INET;

o_pa->sin_port = port;

if ((h=gethostname(rhost)) == 0) { fprintf(stderr, ’’%s : machine inconnue\n’’,rhost); exit(1); } bcopy((char *)h->h_addr, (char *)&o_pa->sin_addr.s_addr, h->h_length); }

Page 52: Systèmes distribuésSockets1 Université du Littoral - Côte dOpale Les sockets L. Deruelle – N. Melab deruelle@lil.univ-littoral.fr

Systèmes distribués Sockets 52

Adresse dans le cas C

void wellKnownAddress (struct sockaddr_in *o_wa,

const char *rhost, const char *service, const char *proto) { struct servtent *serv = getservbyname (service, proto); if ((serv == 0) { fprintf(stderr, ’’%s/%s : service/protocole inconnu\n’’, service,proto); exit(1); }; peerAddress(o_wa, rhost, serv->s_port); }

Page 53: Systèmes distribuésSockets1 Université du Littoral - Côte dOpale Les sockets L. Deruelle – N. Melab deruelle@lil.univ-littoral.fr

Systèmes distribués Sockets 53

gethostname permet aux processus utilisateurs d’accéder au nom de la machine locale

sethostname permet à des processus privilégiés de définir le nom de la machine locale

getpeername Renvoit le point de terminaison du distant (Port +

Adresse IP) Peut être utilisée par le serveur pour obtenir l’adresse

du client

Primitives de service (1)

Page 54: Systèmes distribuésSockets1 Université du Littoral - Côte dOpale Les sockets L. Deruelle – N. Melab deruelle@lil.univ-littoral.fr

Systèmes distribués Sockets 54

getsockname retourne le nom associé à la socket passée en paramètre

gethostbyname retourne un pointeur vers une structure hostent qui contient les informations propres à un nom de domaine passé en paramètre

gethostbyaddr permet d’obtenir les mêmes informations à partir d’une adresse spécifiée

Primitives de service (2)

Page 55: Systèmes distribuésSockets1 Université du Littoral - Côte dOpale Les sockets L. Deruelle – N. Melab deruelle@lil.univ-littoral.fr

Systèmes distribués Sockets 55

getnetbyname spécifie un nom de réseau et retourne une structure netent contenant les caractéristiques du réseau (/etc/networks)

getnetbyaddr spécifie une adresse réseau et retourne une structure netent

Primitives de service (3)

Page 56: Systèmes distribuésSockets1 Université du Littoral - Côte dOpale Les sockets L. Deruelle – N. Melab deruelle@lil.univ-littoral.fr

Systèmes distribués Sockets 56

Structure NetEnt (#include <netdb.h>)Structure NetEnt (#include <netdb.h>)

struct netent {

char *n_name; /* Nom officiel du reseau */ char **n_aliases; /* Liste d'alias */ int n_addrtype; /* Type d'adresse reseau */ unsigned long int n_net;

/* Adresse du reseau */ } Les membres de la structures netent sont :

– n_name Le nom officiel du reseau. – n_aliases

Une liste, terminee par zero, d'alternatives au nom du reseau. – n_addrtype

Le type d'adresse du reseau, actuellement il vaut toujours AF_INET.

– n_net L'adresse du reseau, utilisant l'ordre des octets de l'hote.

Page 57: Systèmes distribuésSockets1 Université du Littoral - Côte dOpale Les sockets L. Deruelle – N. Melab deruelle@lil.univ-littoral.fr

Systèmes distribués Sockets 57

getprotobyname et getprotobynumber Dans la base de données des protocoles

disponibles sur la machine, chaque protocole a un nom, des alias et un numéro de protocole officiels

getprotobyname permet d’obtenir des informations sur un protocole donné en spécifiant son nom (structure protoent)

getprotobynumber permet d’obtenir les mêmes informations en spécifiant le numéro de protocole

Primitives de service (4)

Page 58: Systèmes distribuésSockets1 Université du Littoral - Côte dOpale Les sockets L. Deruelle – N. Melab deruelle@lil.univ-littoral.fr

Systèmes distribués Sockets 58

Structure protoentStructure protoent

#include <netdb.h> struct protoent {

char *p_name; /* Nom officiel du protocole */ char **p_aliases; /* Liste d'alias */ int p_proto; /* Numéro du protocole */

} Les membres de la structure protoent sont :

– p_name Le nom officiel du protocole. – p_aliases

Une liste, terminée par zéro, d'autres noms pour le protocole.

– p_protoLe numéro du protocole.

Page 59: Systèmes distribuésSockets1 Université du Littoral - Côte dOpale Les sockets L. Deruelle – N. Melab deruelle@lil.univ-littoral.fr

Systèmes distribués Sockets 59

getservbyname Certains numéros de ports sont réservés pour

les services s’exécutant au-dessus des protocoles TCP et UDP

getservbyname retourne les informations relatives à un service donné en spécifiant le numéro de port et le protocole utilisé (structure servent)

Primitives de service (5)

Page 60: Systèmes distribuésSockets1 Université du Littoral - Côte dOpale Les sockets L. Deruelle – N. Melab deruelle@lil.univ-littoral.fr

Systèmes distribués Sockets 60

TCP/IP spécifie une représentation normalisée network byte order pour les entiers

Les applications doivent respecter cette représentation (Ex : numéro de port)

La représentation des données doit passer de la machine locale vers le network byte order

Primitives de service (6)

Page 61: Systèmes distribuésSockets1 Université du Littoral - Côte dOpale Les sockets L. Deruelle – N. Melab deruelle@lil.univ-littoral.fr

Systèmes distribués Sockets 61

htonl : host to network long : convertit une valeur sur 32 bits de la représentation machine vers la représentation réseau

htons : host to network short : convertit une valeur sur 16 bits de la représentation machine vers la représentation réseau

ntohl : network to host long : convertit une valeur sur 32 bits de la représentation réseau vers la représentation machine

ntohs : network to host short : convertit une valeur sur 16 bits de la représentation réseau vers la représentation machine

Primitives de service (7)

Page 62: Systèmes distribuésSockets1 Université du Littoral - Côte dOpale Les sockets L. Deruelle – N. Melab deruelle@lil.univ-littoral.fr

Systèmes distribués Sockets 62

Utilitaires bcopy et bzero

bcopy(const char *source, char *dest, int length); length : taille des 2 buffersbzero(char *zone, int length); length : taille du buffer zone

bcopy copie le contenu d’un buffer dans un autre

bzero met à 0 le contenu d’un buffer

Page 63: Systèmes distribuésSockets1 Université du Littoral - Côte dOpale Les sockets L. Deruelle – N. Melab deruelle@lil.univ-littoral.fr

Systèmes distribués Sockets 63

Une application peut contrôler certains aspects du fonctionnement des sockets Configuration des temporisations Allocation de la mémoire tampon etc.

getsockopt permet à une application d’obtenir les informations relatives à une socket – int getsockopt(int s, int level, int optname,

void *opt_val, int *optlen); – int setsockopt(int s, int level, int optname,

const void *optval, int optlen);

Sockets : options (1)

Page 64: Systèmes distribuésSockets1 Université du Littoral - Côte dOpale Les sockets L. Deruelle – N. Melab deruelle@lil.univ-littoral.fr

Systèmes distribués Sockets 64

level optname get set Description flag type de données IPPROTO_IP IP_OPTIONS • • option de l’entête IP IPPROTO_TCP TCP_MAXSEG • donne la taille max d’un segment tcp • int TCP_NODELAY • • ne pas retarder l’envoi pour

grouper des paquets int

SOL_SOCKET SO_DEBUG • • permet des infos de debugging • int SO_DONTROUTE • • utilise uniquement les adresses

d’interface • int

SO_ERROR • rend le status de l’erreur • int SO_LINGER • • contrôle de l’envoi des données

après close struct

linger SO_OOBINLINE • • concerne la réception de données

hors bande • int

SO_RCVBUF • • taille du buffer de réception int SO_SNDBUF • • taille du buffer d’envoi int SO_RCVTIMEO • • timeout de réception int SO_SNDTIMEO • • timeout d’emission int SO_REUSEADDR • • autorise la réutilisabilité de

l’adresse locale • int

SO_TYPE • fournit le type de socket int

Sockets : options (2)

Page 65: Systèmes distribuésSockets1 Université du Littoral - Côte dOpale Les sockets L. Deruelle – N. Melab deruelle@lil.univ-littoral.fr

Systèmes distribués Sockets 65

Sockets C-UNIX BSD 4.X

Page 66: Systèmes distribuésSockets1 Université du Littoral - Côte dOpale Les sockets L. Deruelle – N. Melab deruelle@lil.univ-littoral.fr

Systèmes distribués Sockets 66

Appels système permettant d’établir un lien de communication sur un réseau

Structurent une application en mode client en mode serveur

Permettent d’échanger des données entre applications Bibliothèques nécessaires

sys/types.h sys/socket.h

Sockets : primitives

Page 67: Systèmes distribuésSockets1 Université du Littoral - Côte dOpale Les sockets L. Deruelle – N. Melab deruelle@lil.univ-littoral.fr

Systèmes distribués Sockets 67

Point d’encrage qui permet à l’application d’obtenir un lien de communication vers la suite de protocole qui servira d’échange Définit le mode de communication utilisé (connecté ou non-connecté)

#include <sys/types.h>#include <sys/socket.h>int socket(int domain, int type, int protocol);

Exemple : s = socket(AF_INET, SOCK_DGGRAM, 0);

La primitive socket

0 : protocole par défaut

Page 68: Systèmes distribuésSockets1 Université du Littoral - Côte dOpale Les sockets L. Deruelle – N. Melab deruelle@lil.univ-littoral.fr

Systèmes distribués Sockets 68

Ferme une socket et restitue les ressources associées au système La socket se comporte comme un descripteur de fichier

close (int s);

La primitive close

Page 69: Systèmes distribuésSockets1 Université du Littoral - Côte dOpale Les sockets L. Deruelle – N. Melab deruelle@lil.univ-littoral.fr

Systèmes distribués Sockets 69

Associe une adresse à une socket

La primitive bind

bind(int s, struct sockaddr *i_saddr, int i_saddrlen);

s.i_saddrlen est la taille de la structure *i_saddr effectivement passée

Page 70: Systèmes distribuésSockets1 Université du Littoral - Côte dOpale Les sockets L. Deruelle – N. Melab deruelle@lil.univ-littoral.fr

Systèmes distribués Sockets 70

Permet d’indiquer avec quel partenaire unique (socket éloignée) les échanges auront lieu

La primitive connect

connect(int s, struct sockaddr *i_peer, int peerlen);

i_peer : adresse de la socket éloignée peerlen : taille en octets de la structure sockaddr Utilisée souvent avec SOCK_STREAM par un serveur Le client se connecte avec la primitive accept (exécutée pas le serveur)

Page 71: Systèmes distribuésSockets1 Université du Littoral - Côte dOpale Les sockets L. Deruelle – N. Melab deruelle@lil.univ-littoral.fr

Systèmes distribués Sockets 71

Permet à un serveur d’entrer dans un mode d’écoute de communication (il est «connectable» par un client)

Le processus est bloqué jusqu’à l’arrivée d’une communication entrante

La primitive listen

listen(int s, int n);

n : nombre possible de connexions (clients) en attente

Page 72: Systèmes distribuésSockets1 Université du Littoral - Côte dOpale Les sockets L. Deruelle – N. Melab deruelle@lil.univ-littoral.fr

Systèmes distribués Sockets 72

Caractéristiques Elle permet à un serveur de recevoir la

communication entrante (client) Elle crée une nouvelle socket et retourne le

descripteur associé à l’application Le serveur utilise ce descripteur pour gérer la

communication entrante Le serveur utilise le descripteur de socket

précédent pour traiter la prochaine communication à venir

La primitive accept (1)

Page 73: Systèmes distribuésSockets1 Université du Littoral - Côte dOpale Les sockets L. Deruelle – N. Melab deruelle@lil.univ-littoral.fr

Systèmes distribués Sockets 73

La primitive accept (2)

int accept(int s, struct sockaddr *cli_addr, int clilen);

cli_addr : adresse de la socket côté client clilen : taille de la structure sockaddr

Page 74: Systèmes distribuésSockets1 Université du Littoral - Côte dOpale Les sockets L. Deruelle – N. Melab deruelle@lil.univ-littoral.fr

Systèmes distribués Sockets 74

Lorsque la communication est établie, client et serveur échangent des données afin d’obtenir (client) et transmettre (serveur) le service désiré

En mode connecté, clients et serveurs utilisent read et write; en mode non-connecté, ils utilisent les primitives recvfrom et sendto.

Les primitives read et write

Page 75: Systèmes distribuésSockets1 Université du Littoral - Côte dOpale Les sockets L. Deruelle – N. Melab deruelle@lil.univ-littoral.fr

Systèmes distribués Sockets 75

La primitive read

int read(int s, char *buffer, int bufferlen);

buffer : pointeur sur un buffer de communication bufferlen : nombre de caractères à lire à partir du buffer retour : nombre de caractères effectivement lus

Primitive blocante Initialisation du buffer nécessaire avec bzero

Page 76: Systèmes distribuésSockets1 Université du Littoral - Côte dOpale Les sockets L. Deruelle – N. Melab deruelle@lil.univ-littoral.fr

Systèmes distribués Sockets 76

La primitive write

int write(int s, char *buffer, int bufferlen);

buffer : pointeur sur un buffer de communication bufferlen : nombre de caractères à lire à partir du buffer retour : nombre de caractères effectivement lus

Initialisation du buffer nécessaire avec bzero

Page 77: Systèmes distribuésSockets1 Université du Littoral - Côte dOpale Les sockets L. Deruelle – N. Melab deruelle@lil.univ-littoral.fr

Systèmes distribués Sockets 77

La primitive recvfrom

int recvfrom(int s, char *buffer, int bufferlen, int flag, struct sockaddr *from, int *fromlen);

buffer : pointeur sur un buffer de communication bufferlen : nombre de caractères à lire à partir du buffer retour : nombre de caractères lus, -1 si erreur from : adresse de la socket côté client fromlen : pointeur sur la taille de la structure flag : option souvent mise à 0

Page 78: Systèmes distribuésSockets1 Université du Littoral - Côte dOpale Les sockets L. Deruelle – N. Melab deruelle@lil.univ-littoral.fr

Systèmes distribués Sockets 78

La primitive sendto

int sendto(int s, char *buffer, int bufferlen, int flag, struct sockaddr *from, int fromlen);

buffer : pointeur sur un buffer de communication bufferlen : taille du buffer en octets retour : nombre de caractères envoyés, -1 si erreur from : adresse de la socket de destination fromlen : taille de la structure flag : option souvent mise à 0

Page 79: Systèmes distribuésSockets1 Université du Littoral - Côte dOpale Les sockets L. Deruelle – N. Melab deruelle@lil.univ-littoral.fr

Systèmes distribués Sockets 79

SERVEURsocket

bind

listen

accept

read

write

close

socket

connect

write

read

close

CLIENTEn mode connecté il y a établissement (listen,connect, accept) puis libération (close) d’une connexion entre le cleint et le serveur.

connexion

requête

réponse

Sockets : mode connecté

Page 80: Systèmes distribuésSockets1 Université du Littoral - Côte dOpale Les sockets L. Deruelle – N. Melab deruelle@lil.univ-littoral.fr

Systèmes distribués Sockets 80

Squelette du serveur (1)

/* Bibliothèques */#include <stdio.h>/* Structures de données nécessaires aux appels système */#include <sys/types.h>/* Primitives de manipulation de sockets */#include <sys/socket.h>/* Adresses du domaine internet */#include <netinet/in.h>

/* Traitement des erreurs sur sockets */void error(char *msg){ perror(msg); exit(1);}

Page 81: Systèmes distribuésSockets1 Université du Littoral - Côte dOpale Les sockets L. Deruelle – N. Melab deruelle@lil.univ-littoral.fr

Systèmes distribués Sockets 81

Squelette du serveur (2)

int main(int argc, char *argv[]){ int sockfd, newsockfd, portno, clilen; char buffer[256]; struct sockaddr_in serv_addr, cli_addr; int n; if (argc<2) { fprintf(stderr, ``Usage: %s port\n’’, argv[0]); exit(1); }

Page 82: Systèmes distribuésSockets1 Université du Littoral - Côte dOpale Les sockets L. Deruelle – N. Melab deruelle@lil.univ-littoral.fr

Systèmes distribués Sockets 82

Squelette du serveur (3)

/* Création de la socket d’écoute du serveur (domaine : internet, type de communication : circuit virtuel, protocole : TCP) */sockfd = socket(AF_INET, SOCK_STREAM, 0);if (sockfd<0) error(``Error opening socket’’);

/* Construction de l’adresse de la socket */bzero((char *) &serv_addr, sizeof(serv_addr));portno = atoi(argv[1]);serv_addr.sin_family = AF_INET;serv_addr.sin_addr.s_addr = INADDR_ANY;serv_addr.sin_port = htons(0);

Page 83: Systèmes distribuésSockets1 Université du Littoral - Côte dOpale Les sockets L. Deruelle – N. Melab deruelle@lil.univ-littoral.fr

Systèmes distribués Sockets 83

Squelette du serveur (4)

/* Liaison de la socket et son adresse */if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) <0) error(``Error on binding’’);

/* Serveur en écoute, 5 (max) connexions possibles en attente */listen(sockfd,5);

/* Connexion d’un client */clilen = sizeof(cli_addr);newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);if (newsockfd<0) error(``Error on accept’’);

Page 84: Systèmes distribuésSockets1 Université du Littoral - Côte dOpale Les sockets L. Deruelle – N. Melab deruelle@lil.univ-littoral.fr

Systèmes distribués Sockets 84

Squelette du serveur (5)/* Lecture du contenu du buffer associé à la socket (message du client) */bzero(buffer,256);n = read(newsockfd, buffer,255);if (n<0) error(``Error reading from socket’’);printf(``Here is the message: %s\n’’, buffer);

/* Ecriture dans le buffer associé à la socket (réponse au client) */write(newsockfd, ``I got your message’’,18);if (n<0) error(``Error writing to socket’’);

/* Fermeture des sockets */close(newsockfd);close(sockfd);}

Page 85: Systèmes distribuésSockets1 Université du Littoral - Côte dOpale Les sockets L. Deruelle – N. Melab deruelle@lil.univ-littoral.fr

Systèmes distribués Sockets 85

Squelette du client (1)/* Bibliothèques */#include <stdio.h>/* Structures de données nécessaires aux appels système */#include <sys/types.h>/* Primitives de manipulation de sockets */#include <sys/socket.h>/* Adresses du domaine internet */#include <netinet/in.h>/* Primitives de gestion de noms, ... */#include <netdb.h>

/* Traitement des erreurs sur sockets */void error(char *msg){ perror(msg); exit(0);}

Page 86: Systèmes distribuésSockets1 Université du Littoral - Côte dOpale Les sockets L. Deruelle – N. Melab deruelle@lil.univ-littoral.fr

Systèmes distribués Sockets 86

Squelette du client (2)

int main(int argc, char *argv[]){ int sockfd, portno, n; struct sockaddr_in serv_addr; struct hostent *server; char buffer[256]; if (argc<3) { fprintf(stderr, ``Usage: %s hostname port\n’’, argv[0]); exit(0); }

Page 87: Systèmes distribuésSockets1 Université du Littoral - Côte dOpale Les sockets L. Deruelle – N. Melab deruelle@lil.univ-littoral.fr

Systèmes distribués Sockets 87

Squelette du client (3)

portno = atoi(argv[2]);/* Création de la socket côté client (domaine : internet, type de communication : circuit virtuel, protocole : TCP) */sockfd = socket(AF_INET, SOCK_STREAM, 0);if (sockfd<0) error(``Error opening socket’’);

/* Construction de l’adresse de la socket */server = gethostname(argv[1]);if (server == NULL) { fprintf(stderr, ``Error: no such host’’); exit(0);}

Page 88: Systèmes distribuésSockets1 Université du Littoral - Côte dOpale Les sockets L. Deruelle – N. Melab deruelle@lil.univ-littoral.fr

Systèmes distribués Sockets 88

Squelette du client (4)

bzero((char *) &serv_addr, sizeof(serv_addr));serv_addr.sin_family = AF_INET;bcopy((char *)server h_addr, (char *)&serv_addr.sin_addr.s_addr, server h_length);serv_addr.sin_port = htons(portno);

/* Connexion au serveur */if (connect(sockfd, &serv_addr, sizeof(serv_addr)) <0) error(``Error on connecting’’);

/* Ecriture dans le buffer associé à la socket (message au serveur) */printf(``Please, enter the message: ’’);bzero(buffer, 256);fgets(buffer, 255, stdin);

Page 89: Systèmes distribuésSockets1 Université du Littoral - Côte dOpale Les sockets L. Deruelle – N. Melab deruelle@lil.univ-littoral.fr

Systèmes distribués Sockets 89

Squelette du client (5)write(sockfd, buffer,strlen(buffer));if (n<0) error(``Error writing to socket’’);

/* Lecture du contenu du buffer associé à la socket (réponse du serveur) */bzero(buffer,256);n = read(sockfd, buffer,255);if (n<0) error(``Error reading from socket’’);printf(``Here is the message: %s\n’’, buffer);

/* Fermeture de la socket */close(sockfd);}