La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

Université du Littoral - Côte d’Opale

Présentations similaires


Présentation au sujet: "Université du Littoral - Côte d’Opale"— Transcription de la présentation:

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

2 Plan Le modèle Sockets java Sockets C-UNIX BSD 4.X Systèmes distribués

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 Sockets/OSI IP IP Physique Physique Protocole Applicatif API Socket
Application cliente Application serveur API Socket API Socket UDP TCP UDP TCP IP IP Physique Physique 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 Pourquoi les ports ?
Adresse internet de la machine Numéro du port Pourquoi les ports ? Sur une même machine, plusieurs services sont accessibles simultanément (web, , 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 Désignation par des noms symboliques
Adresse internet de la machine Numéro : Désignation par des noms symboliques Association de noms symboliques aux adresses numériques Domain Name System (ou DNS) Exemple : lil.univ-littoral.fr : 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 : ) 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 Sockets UDP Dans java.net
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 Classe ServerSocket
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 Envoi/Réception de données Fermeture
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) Exceptions
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 UDP TCP UDP
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-à-point
Pas de différence de classe entre le client et le serveur Deux classes Java dans java.net DatagramPacket DatagramSocket Assemblage des données en partance en datagrammes Extraction des données des datagrammes reçus Envoi et réception des datagrammes UDP (objets DatagramPacket) Systèmes distribués Sockets

22 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 : 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)
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)
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)
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-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 Principe Routeur multi-point Systèmes distribués Sockets

28 Principe Routeur multi-point Systèmes distribués Sockets

29 Principe Routeur multi-point Systèmes distribués Sockets

30 Principe Routeur multi-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 --> Actualité audio transmise en multi-points Systèmes distribués Sockets

32 Adresses et groupes multi-points (2)
Liste exhaustive dans : Il existe des routeurs multi-points (mrouteurs) Datagramme multi-points TTL En-tête IP En-tête UDP Charge utile ... 4 octets 4 octets 2 octets 2 octets 2 octets 2 octets 1 octet Contrôle pour fiabilité Longueur Port destinataire Port expéditeur Hôte destinataire Systèmes distribués Sockets Hôte expéditeur

33 Time-To-Live (TTL) Définition Utilisation
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
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)
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)
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 groupes
// join a Multicast group and send the group salutations ... String msg = "Hello"; InetAddress group = InetAddress.getByName(" "); 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 Sockets : abstraction (1)
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 Systèmes distribués Sockets

40 Sockets : abstraction (2)
Family : PF_INET Table de descripteurs de fichiers Service : SOCK_STREAM Local IP : Remote IP : Local Port : 2249 Remote Port : 3726 Table de descripteurs d’un processus Structure Socket Structure initialement vide Remplissage par les primitives sur sockets Systèmes distribués Sockets

41 Caractéristiques Systèmes distribués Sockets

42 Domaine de communication
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 Systèmes distribués Sockets

43 Types de communication (1)
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 Systèmes distribués Sockets

44 Types de communication (2)
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 Systèmes distribués Sockets

45 Adressage des sockets Intérêt Format général struct sockaddr {
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 */ }; Systèmes distribués Sockets

46 Format des adresses du domaine UNIX
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 */ }; Systèmes distribués Sockets

47 Format des adresses du domaine Internet (1)
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 */ }; Systèmes distribués Sockets

48 Format des adresses du domaine Internet (2)
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. 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 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 Primitives de service (1)
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 Systèmes distribués Sockets

54 Primitives de service (2)
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 Systèmes distribués Sockets

55 Primitives de service (3)
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 Systèmes distribués Sockets

56 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 Primitives de service (4)
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 Systèmes distribués Sockets

58 Structure 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_proto Le numéro du protocole. Systèmes distribués Sockets

59 Primitives de service (5)
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) Systèmes distribués Sockets

60 Primitives de service (6)
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 Systèmes distribués Sockets

61 Primitives de service (7)
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 Systèmes distribués Sockets

62 Utilitaires bcopy et bzero
bcopy copie le contenu d’un buffer dans un autre bzero met à 0 le contenu d’un buffer bcopy(const char *source, char *dest, int length); length : taille des 2 buffers bzero(char *zone, int length); length : taille du buffer zone Systèmes distribués Sockets

63 Sockets : options (1) 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); Systèmes distribués Sockets

64 Sockets : options (2) Systèmes distribués Sockets

65 Sockets C-UNIX BSD 4.X Systèmes distribués Sockets

66 Sockets : primitives 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 Systèmes distribués Sockets

67 La primitive socket 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); 0 : protocole par défaut Systèmes distribués Sockets

68 La primitive close Ferme une socket et restitue les ressources
associées au système La socket se comporte comme un descripteur de fichier close (int s); Systèmes distribués Sockets

69 La primitive bind Associe une adresse à une socket
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 La primitive connect Permet d’indiquer avec quel partenaire unique (socket éloignée) les échanges auront lieu 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 La primitive listen 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 listen(int s, int n); n : nombre possible de connexions (clients) en attente Systèmes distribués Sockets

72 La primitive accept (1) 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 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 Les primitives read et write
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. 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 Sockets : mode connecté
SERVEUR CLIENT socket En mode connecté il y a établissement (listen,connect, accept) puis libération (close) d’une connexion entre le cleint et le serveur. bind listen socket accept connexion connect requête read write réponse write read close Systèmes distribués Sockets close

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); 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); error(``Error reading from socket’’); printf(``Here is the message: %s\n’’, buffer); /* Fermeture de la socket */ close(sockfd); } Systèmes distribués Sockets


Télécharger ppt "Université du Littoral - Côte d’Opale"

Présentations similaires


Annonces Google