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

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

Présentations similaires


Présentation au sujet: "Systèmes distribuésSockets1 Université du Littoral - Côte dOpale Les sockets L. Deruelle – N. Melab"— Transcription de la présentation:

1

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

3 Systèmes distribuésSockets2 Plan n Le modèle n Sockets java n Sockets C-UNIX BSD 4.X

4 Systèmes distribuésSockets3 Le modèle n Sockets : interface (point de communication) client/serveur utilisée à lorigine dans le monde UNIX et TCP/IP n Etendue aux PCs (Winsock) et mainframes n Primitives pour le support de communications reposant sur les protocoles (TCP/IP, UDP/IP) n Les applications client/serveur ne voient les couches de communication quà travers lAPI socket (abstraction)

5 Systèmes distribuésSockets4 Application cliente API Socket UDPTCP IP Physique Application serveur API Socket UDPTCP IP Physique Protocole Applicatif Sockets/OSI

6 Systèmes distribuésSockets5 Rôle des sockets n Connexion à une machine distante n Envoi/Réception de données n Fermeture dune connexion n Attachement à un port n Acceptation dune demande de connexion à un port local n Attente de demandes de connexion

7 Systèmes distribuésSockets6 Notion de port n Connexion réseau * Adresse internet de la machine * Numéro du port n Pourquoi les ports ? * Sur une même machine, plusieurs services sont accessibles simultanément (web, , etc.) * Points daccès : ports logiques (65535) * Rien à avoir avec les ports physiques (série et parallèle)

8 Systèmes distribuésSockets7 Désignation des ports n Port : numéro allant de 1 à n Les ports 1 à 1023 sont réservés aux services courants : finger, ftp, http (80), SMTP (25), etc. n Fichier dassignation de ports : /etc/services

9 Systèmes distribuésSockets8 Adresse internet n Connexion réseau * Adresse internet de la machine * Numéro : n Désignation par des noms symboliques * Association de noms symboliques aux adresses numériques * Domain Name System (ou DNS) * Exemple : lil.univ-littoral.fr :

10 Systèmes distribuésSockets9 Sockets java

11 Systèmes distribuésSockets10 Gestion des ports (adresses) en Java n 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() n Classes Socket, SocketServer et SocketImpl * getInetAddress()

12 Systèmes distribuésSockets11 Gestion des sockets n Taxinomie * Sockets TCP ó Point à point : Socket, Server Socket, SocketImlp * Sockets UDP ó Point à point : DatagramSocket ó Multi-point : MultiCastSocket * Dans java.net

13 Systèmes distribuésSockets12 Sockets TCP n Classe Socket ò Connexion à une machine distante ò Envoi/Réception de données ò Fermeture dune connexion n Classe Server Socket ò Attachement à un port ò Acceptation dune demande de connexion à un port local ò Attente de demandes de connexion

14 Systèmes distribuésSockets13 Classe Socket (1) n 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)

15 Systèmes distribuésSockets14 Classe Socket (2) n Information ò public InetAddress getInetAddress() ò public int getPort() ò public int getLocalPort() ò public InetAddress getLocalAddress() n Envoi/Réception de données ò public InputStream getInputStream() throws IOException ò public OutputStream getOutputStream() throws IOException n Fermeture ò public void close() throws IOException

16 Systèmes distribuésSockets15 Classe Socket (3) n 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

17 Systèmes distribuésSockets16 Classe Socket (4) ò SO_TIMEOUT ó Déclenchement dexception 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 n Exceptions ò SocketException ó BindException : port déjà utilisé ou le programme na pas le droit de lutiliser ó ConnectException : hôte occupé ou aucun processus nécoute sur le port ó NoRouteToHostException : dépassement de temps

18 Systèmes distribuésSockets17 Classe ServerSocket (1) n Rôle : standardiste n Gestion dune connexion ò Création dun nouvel objet ServerSocket affecté à un port : constructeur ServerSocket ò Attente de connexions (bloquant) : accept() ò Echange dinformations : getInputStream() et getOutputStream() ò Clôture de la connexion par le client ou le serveur : close() ò Nouvelle attente

19 Systèmes distribuésSockets18 Classe ServerSocket (2) n 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() n Prise en compte et clôture dune connexion ò public Socket accept() throws IOException ò public void close() throws IOException

20 Systèmes distribuésSockets19 Classe ServerSocket (3) n Information ò public InetAddress getInetAddress() ò public int getLocalPort() n Options ò SO_TIMEOUT ó Doit être initialisé avant accept ó Méthodes setSoTimeout (int ms) et getSoTimeout()

21 Systèmes distribuésSockets20 Protocoles TCP et UDP n TCP * Garantie darrivée dans lordre de paquets de données * Fiabilité de transmission * Lenteur des transmissions (http par exemple) * Vu comme un «service téléphonique» n 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»

22 Systèmes distribuésSockets21 Sockets UDP point-à-point n Pas de différence de classe entre le client et le serveur n Deux classes Java dans java.net * DatagramPacket * DatagramSocket n DatagramPacket * Assemblage des données en partance en datagrammes * Extraction des données des datagrammes reçus n DatagramSocket * Envoi et réception des datagrammes UDP (objets DatagramPacket)

23 Systèmes distribuésSockets22 Classe DatagramPacket (1) n 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é à lenvoi 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 doctets

24 Systèmes distribuésSockets23 Classe DatagramPacket (2) n Information (suite) * public byte[] getData() ( Tableau doctets 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

25 Systèmes distribuésSockets24 Classe DatagramSocket (1) n 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

26 Systèmes distribuésSockets25 Classe DatagramSocket (2) n Emission/Réception de datagrammes * public void send(DatagramPacket dp) throws IOException * public void receive(DatagramPacket dp) throws IOException n Information * public int getLocalPort() *Numéro de port (anonyme et assigné par le système) sur lequel la socket courante écoute n Fermeture * public void close() n Option : SO_TIMEOUT * public void setSoTimeout(int timeout) throws SocketException

27 Systèmes distribuésSockets26 Sockets multi-points n Communication multi-points : on sadresse à un groupe quon peut intégrer et quitter à sa guise * Exemples : visio-conférence, radio, télévision, etc. n Multi-points = compromis * Multi-diffusions * Point-à-point n Caractéristiques * Efficace car données dupliquées au moment opportun * Basée sur lutilisation de routeurs multi-point n Applications * Jeu réseau multi-utilisateurs, SGF distribués, calcul parallèle & distribué, etc.

28 Systèmes distribuésSockets27 Principe Routeur multi-point

29 Systèmes distribuésSockets28 Principe Routeur multi-point

30 Systèmes distribuésSockets29 Principe Routeur multi-point

31 Systèmes distribuésSockets30 Principe Routeur multi-point

32 Systèmes distribuésSockets31 Adresses et groupes multi-points (1) n Adresse multi-points ò Référence un groupe dhôtes (groupe multi-points) ò Rangée dans la classe D n Groupe multi-points ò Plusieurs hôtes Internet partageant la même adresse multi- points ò Libre adhésion ou départ au/du groupe n lnternet Assigned Number Autority (IANA) est responsable de laffectation des adresses mutli-points ò Il en existe 80 ò Exemple : AUDIONEWS.MCAST.NET --> Actualité audio transmise en multi-points

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

34 Systèmes distribuésSockets33 Time-To-Live (TTL) n Définition ò Portée dun 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 n Utilisation * TTL décrémentée à chaque passage dans un routeur * TTL=0 : datagramme supprimé

35 Systèmes distribuésSockets34 Mise en œuvre des sockets multi-point n Classe java.net.MulticastSocket ò Dérivée de la classe java.net.DatagramSocket n Constructeurs ò public MulticastSocket() throws SocketException ó Port assigné par le système ó getLocalPort() : renvoie le numéro du port ò public MulticastSocket(int port) throws SocketException

36 Systèmes distribuésSockets35 Communication avec un groupe multi-point (1) n Opérations possibles ò Adhésion à un groupe ò Echanger (Emettre/Recevoir) des données avec les membres dun groupe ò Quitter un groupe n Méthodes ò public void joinGroup(InetAddress adrmultipt) throws SocketException ò public void leaveGroup(InetAddress adrmultipt) throws SocketException

37 Systèmes distribuésSockets36 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!

38 Systèmes distribuésSockets37 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);

39 Systèmes distribuésSockets38 Sockets en C/UNIX

40 Systèmes distribuésSockets39 n Association dun descripteur (au niveau système) à une socket (idem fichier) n Le concepteur dapplication utilise ce descripteur pour référencer la communication client/serveur sous-jacente n Une structure de données «socket» est créée à louverture dune socket Sockets : abstraction (1)

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

42 Systèmes distribuésSockets41 Caractéristiques

43 Systèmes distribuésSockets42 n Domaine UNIX * Notation : PF_UNIX * Communication intra-machine (mémoire centrale) * Pas de passage par le réseau n Domaine Internet * Notation : PF_INET * Communication intra-machine et réseau Domaine de communication

44 Systèmes distribuésSockets43 n 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 n Circuit virtuel * Notation : SOCK_STREAM * Connexion fixe comme un pipe UNIX * Fiable, séquence préservée, pas de doublons Types de communication (1)

45 Systèmes distribuésSockets44 * Pas de préservation des frontières des paquets ( Exemple : le processus émet par 2 octets, le récepteur reçoit par 3 octets n Raw * Notation : SOCK_RAW * Utilisation directe dIP (réservé à ROOT ) n Sequenced packet * Notation : SOCK_SEQPACKET * Avantages des circuits virtuels + préservation des frontières des paquets Types de communication (2)

46 Systèmes distribuésSockets45 n Intérêt * Un point de transport (ex : socket) nest accessible de lextérieur que si on lui a associé une adresse ( Explicitement (primitive bind()) ( Implicitement (dans Internet, connect(), send(), etc.) n Format général struct sockaddr { short sa_family; /* famille dadresses (AF_INET, AF_UNIX,etc) */ char sa_data[14]; /* adresse effective */ }; Adressage des sockets

47 Systèmes distribuésSockets46 n Où est-elle mise ? * Entrée dans le SGF créée par bind() (type : s) ( Ex : /home/deruelle/ma_socket n Format dans struct sockadd_un { short sun_family; /* AF_UNIX ou AF_UNSPEC*/ char sun_path[108]; /* chemin */ }; Format des adresses du domaine UNIX

48 Systèmes distribuésSockets47 n Format * Adresse internet de la machine + son numéro de port n Format dans 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)

49 Systèmes distribuésSockets48 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)

50 Systèmes distribuésSockets49 Construction des adresses internet n Il sagit dinstancier sin_port et sin_addr n 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 dun service bien connu et son protocole

51 Systèmes distribuésSockets50 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.

52 Systèmes distribuésSockets51 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); }

53 Systèmes distribuésSockets52 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); }

54 Systèmes distribuésSockets53 n gethostname permet aux processus utilisateurs daccéder au nom de la machine locale n sethostname permet à des processus privilégiés de définir le nom de la machine locale n getpeername * Renvoit le point de terminaison du distant (Port + Adresse IP) * Peut être utilisée par le serveur pour obtenir ladresse du client Primitives de service (1)

55 Systèmes distribuésSockets54 n getsockname retourne le nom associé à la socket passée en paramètre n gethostbyname retourne un pointeur vers une structure hostent qui contient les informations propres à un nom de domaine passé en paramètre n gethostbyaddr permet dobtenir les mêmes informations à partir dune adresse spécifiée Primitives de service (2)

56 Systèmes distribuésSockets55 n getnetbyname spécifie un nom de réseau et retourne une structure netent contenant les caractéristiques du réseau (/etc/networks) n getnetbyaddr spécifie une adresse réseau et retourne une structure netent Primitives de service (3)

57 Systèmes distribuésSockets56 Structure NetEnt (#include ) 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 */ } n 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.

58 Systèmes distribuésSockets57 n 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 dobtenir des informations sur un protocole donné en spécifiant son nom (structure protoent) * getprotobynumber permet dobtenir les mêmes informations en spécifiant le numéro de protocole Primitives de service (4)

59 Systèmes distribuésSockets58 Structure protoent #include struct protoent { char *p_name; /* Nom officiel du protocole */ char **p_aliases; /* Liste d'alias */ int p_proto; /* Numéro du protocole */ } n 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.

60 Systèmes distribuésSockets59 n getservbyname * Certains numéros de ports sont réservés pour les services sexé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)

61 Systèmes distribuésSockets60 n TCP/IP spécifie une représentation normalisée network byte order pour les entiers n Les applications doivent respecter cette représentation (Ex : numéro de port) n La représentation des données doit passer de la machine locale vers le network byte order Primitives de service (6)

62 Systèmes distribuésSockets61 * 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)

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

64 Systèmes distribuésSockets63 n Une application peut contrôler certains aspects du fonctionnement des sockets * Configuration des temporisations * Allocation de la mémoire tampon * etc. n getsockopt permet à une application dobtenir 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)

65 Systèmes distribuésSockets64 Sockets : options (2)

66 Systèmes distribuésSockets65 Sockets C-UNIX BSD 4.X

67 Systèmes distribuésSockets66 n Appels système permettant détablir un lien de communication sur un réseau n Structurent une application * en mode client * en mode serveur n Permettent déchanger des données entre applications n Bibliothèques nécessaires * sys/types.h * sys/socket.h Sockets : primitives

68 Systèmes distribuésSockets67 n Point dencrage qui permet à lapplication dobtenir un lien de communication vers la suite de protocole qui servira déchange n Définit le mode de communication utilisé (connecté ou non-connecté) #include int socket(int domain, int type, int protocol); Exemple : s = socket( AF_INET, SOCK_DGGRAM, 0 ); La primitive socket 0 : protocole par défaut

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

70 Systèmes distribuésSockets69 n Associe une adresse à une socket La primitive bind bind(int s, struct sockaddr *i_saddr, int i_saddrlen); n s.i_saddrlen est la taille de la structure *i_saddr effectivement passée

71 Systèmes distribuésSockets70 n Permet dindiquer avec quel partenaire unique (socket éloignée) les échanges auront lieu La primitive connect connect(int s, struct sockaddr *i_peer, int peerlen); n i_peer : adresse de la socket éloignée n peerlen : taille en octets de la structure sockaddr n Utilisée souvent avec SOCK_STREAM par un serveur n Le client se connecte avec la primitive accept (exécutée pas le serveur)

72 Systèmes distribuésSockets71 n Permet à un serveur dentrer dans un mode découte de communication (il est «connectable» par un client) n Le processus est bloqué jusquà larrivée dune communication entrante La primitive listen listen(int s, int n); n n : nombre possible de connexions (clients) en attente

73 Systèmes distribuésSockets72 n Caractéristiques * Elle permet à un serveur de recevoir la communication entrante (client) * Elle crée une nouvelle socket et retourne le descripteur associé à lapplication * 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)

74 Systèmes distribuésSockets73 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

75 Systèmes distribuésSockets74 n Lorsque la communication est établie, client et serveur échangent des données afin dobtenir (client) et transmettre (serveur) le service désiré n 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

76 Systèmes distribuésSockets75 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 n Primitive blocante n Initialisation du buffer nécessaire avec bzero

77 Systèmes distribuésSockets76 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 n Initialisation du buffer nécessaire avec bzero

78 Systèmes distribuésSockets77 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

79 Systèmes distribuésSockets78 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

80 Systèmes distribuésSockets79 SERVEUR socket bind listen accept read write close socket connect write read close CLIENT En mode connecté il y a établissement (listen,connect, accept) puis libération (close) dune connexion entre le cleint et le serveur. connexion requête réponse Sockets : mode connecté

81 Systèmes distribuésSockets80 Squelette du serveur (1) /* Bibliothèques */ #include /* Structures de données nécessaires aux appels système */ #include /* Primitives de manipulation de sockets */ #include /* Adresses du domaine internet */ #include /* Traitement des erreurs sur sockets */ void error(char *msg) { perror(msg); exit(1); }

82 Systèmes distribuésSockets81 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); }

83 Systèmes distribuésSockets82 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 ladresse 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);

84 Systèmes distribuésSockets83 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 dun client */ clilen = sizeof(cli_addr); newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen); if (newsockfd<0) error(``Error on accept);

85 Systèmes distribuésSockets84 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); }

86 Systèmes distribuésSockets85 Squelette du client (1) /* Bibliothèques */ #include /* Structures de données nécessaires aux appels système */ #include /* Primitives de manipulation de sockets */ #include /* Adresses du domaine internet */ #include /* Primitives de gestion de noms,... */ #include /* Traitement des erreurs sur sockets */ void error(char *msg) { perror(msg); exit(0); }

87 Systèmes distribuésSockets86 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); }

88 Systèmes distribuésSockets87 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 ladresse de la socket */ server = gethostname(argv[1]); if (server == NULL ) { fprintf(stderr, ``Error: no such host); exit(0); }

89 Systèmes distribuésSockets88 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);

90 Systèmes distribuésSockets89 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); }


Télécharger ppt "Systèmes distribuésSockets1 Université du Littoral - Côte dOpale Les sockets L. Deruelle – N. Melab"

Présentations similaires


Annonces Google