Upload
paule-bellet
View
106
Download
0
Embed Size (px)
Citation preview
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]
Systèmes distribués Sockets 2
Plan
Le modèle Sockets java Sockets C-UNIX BSD 4.X
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)
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
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
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)
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
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
Systèmes distribués Sockets 9
Sockets java
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()
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
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
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)
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
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
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
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
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
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()
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»
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)
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
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
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
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
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.
Systèmes distribués Sockets 27
PrincipePrincipe
Routeurmulti-point
Systèmes distribués Sockets 28
PrincipePrincipe
Routeurmulti-point
Systèmes distribués Sockets 29
PrincipePrincipe
Routeurmulti-point
Systèmes distribués Sockets 30
PrincipePrincipe
Routeurmulti-point
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
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
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é
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
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
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!
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);
Systèmes distribués Sockets 38
Sockets en C/UNIX
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)
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)
Systèmes distribués Sockets 41
Caractéristiques
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
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)
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)
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
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
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)
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)
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
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.
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); }
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); }
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)
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)
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)
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.
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)
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.
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)
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)
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)
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
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)
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)
Systèmes distribués Sockets 65
Sockets C-UNIX BSD 4.X
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
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
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
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
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)
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
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)
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
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
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
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
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
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
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é
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);}
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); }
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);
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’’);
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);}
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);}
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); }
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);}
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);
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);}