Applications client/serveur TCP/IP
Transcription
Applications client/serveur TCP/IP
Applications client/serveur TCP/IP - Sockets Rappels C.Crochepeyre Applications CS 1 PLAN • • • • • Modèle client/serveur Modèle ISO et protocole TCP/IP Comment ça marche? La programmation: les sockets Exemples client/serveur: UDP et TCP C.Crochepeyre Applications CS 2 Modèle client/serveur : C/S • L’application informatique est éclatée entre – La partie application cliente : processus « client » – La partie application serveur : processus « serveur » • Le client fournit au serveur les données pour effectuer des traitements: demande de service • Le serveur rend le service et retourne au client les résultats client C.Crochepeyre serveur Applications CS 3 Pourquoi? • • • • Le serveur peut être sollicité par plusieurs clients pour le même service Chaque application peut être distante : réseau Clients et serveur peuvent s’exécuter sur des machines différentes. Les puissances de calcul peuvent être mieux réparties Les applications clientes peuvent être différentes M2 M1 M3 serveur clients C.Crochepeyre Applications CS client 4 Côté client • Le client est à l’initiative de la demande – – – – Il doit s’adresser au bon serveur Lui fournir toutes les données pour effectuer le service Attendre les résultats Assurer la présentation M3 M2 M1 serveur client C.Crochepeyre Applications CS 5 Côté serveur • Le serveur doit être actif et attendre une demande • A la demande d’un client, il doit récupérer les données pour effectuer le traitement • Il doit renvoyer au client concerné les résultats non formatés M3 serveur client M1 C.Crochepeyre M2 Applications CS 6 • Serveur itératif – Le serveur ne traite qu’une demande à la fois clients serveur • Serveur parallèle – Le serveur traite plusieurs demandes simultanément clients C.Crochepeyre serveur Applications CS 7 Les échanges par réseaux • Communication entre équipements – LAN: Local Area Network (10 mètres à quelques km) – MAN: Metropolitan Network (de 10 à 100 km) – WAN: Wide Area Network (100km au monde entier) • • • • Architectures: étoile, anneau, maillage, arbre… Canaux: bus, satellite,… Débits: bits/s, Kbits/s, Mbits/s, Gbits/s .. Protocoles entre équipements: format, ordre des échanges (envois et réceptions), actions associées • Echanges sur des réseaux hétérogènes: Inter-Net C.Crochepeyre Applications CS 8 Modèle OSI • ISO International Organisation for Standardization • Le modèle OSI Open System Interconnection – Architecture en 7 couches – Principes: • Chaque système possède un ensemble de couches • La communication entre 2 applications de même couche s’effectue selon un protocole propre à cette couche • Chaque couche se réfère aux services fournis par les couches inférieures • Lors d’un dialogue entre 2 couches de même niveau, les couches inférieures sont transparentes C.Crochepeyre Applications CS 9 • Les couches basses: – Physique: transmission binaire – Liaison: transmission de trames – Réseau: acheminement des paquets, routage, interconnexion des sousréseaux • Les couches hautes – Transport: transport de bout en bout des messages, découpage et réassemblage (paquets), gestion de la connexion – Session: dialogue entre tâches distantes synchronisation – Présentation: présentation des données échangées entre applications – Application: accès aux services par l’utilisateur • Protocole simplifié: TCP/IP C.Crochepeyre Applications CS 10 Le protocole TCP/IP • Des solutions d’échange de données entre deux processus distants: fichiers, ftp, applications… • Le protocole de communication TCP/IP – TCP utilisé avec IP ou UDP avec IP – Les couches • Network Access (couches OSI 1 et 2): ethernet ou autre • Internet (couche OSI 3): IP • Host/Host (couche OSI 4): TCP ou UDP • Processus et applications (couches OSI 5,6 et 7) :tftp, telnet, smtp, http… C.Crochepeyre Applications CS 11 • Le réseau Ethernet – – – – – – – Réseau local Norme IEEE 802.3 technique d’accès CSMA/CD Topologie: segment de bus Vitesse de transmission de 10Mbits/s à 1000 Mbits/s Supports: câble coaxial, paires torsadées, fibre optique Avantages: simplicité, faible coût, débit élevé, connexion/déconnexion, … Inconvénients: durée de transmission bornée, absence de récupération d’erreurs au niveau liaison, pas de mécanisme de priorité… C.Crochepeyre Applications CS 12 • Le protocole IP – Interconnexion de machines situées sur des réseaux différents. – Assure: • • • • • • L’adressage par des adresses Internet Le routage La fragmentation et réassemblage des paquets Le contrôle des erreurs Le contrôle des flux Le contrôle de la durée de vie du datagramme – Deux services: send et deliver – Avantage: hétérogénéité des sous réseaux que doivent traverser les messages des deux machines – Met en communication deux machines via des adresses Internet C.Crochepeyre Applications CS 13 • UDP et TCP – Deux services transport, couche supérieure à IP – UDP: communication légère sans exigence de fiabilité ni de temps de réponse • Transmission de messages • Possibilité de perte, duplication, déséquencement des messages: contrôle par la couche supérieure application Exemple TFTP (transfert de fichiers) – TCP: communication fiable avec connexion • circuit virtuel entre deux processus • Pas de message mais un flot d’octets fragmentés en segments • Fiabilité avec numérotation des octets, acquittement, réordonnancement: contrôle de flux Exemple SMTP (mail) – Communication entre deux processus via des n° de port C.Crochepeyre Applications CS 14 Adresses IP • Une adresse IP est unique pour chaque machine • Attribuée par l’AFNIC centre d'information et de gestion des noms de domaine internet (France et île de la Réunion). • Adresse de 32 bits découpés selon l’utilité – Adresse réseau – Adresse de la machine • Classes réseaux: A, B, C, D, E • Codage adresse IP: – Décimal pointé – Symbolique 163.173.212.27 lion.cnam.fr machine.sous-domaine.domaine • DNS Domain Name System – Table de correspondances entre un nom symbolique et une adresse pointée: 163.173.212.27 lion.cnam.fr – Hiérarchie des serveurs C.Crochepeyre Applications CS 15 • Classe A: 0.0.0.0 à 127.255.255.255 @locale réseau 0 1 7 • 24 Classe B: 128.0.0.0 à 191.255.255.255 réseau @locale 1 0 1 1 • 14 18 Classe C: 192.0.0.0 à 223.255.255.255 réseau @locale 1 1 0 1 1 1 • 21 8 Classe D: 224.0.0.0 à 239.255.255.255 multicast 1 1 1 1 1 1 1 1 C.Crochepeyre 28 Applications CS 16 • Adresse réseau – Identificateur réseau suivi de zéro • 163.173.0.0 : réseau 163.173 de classe B – Diffusion au réseau (broadcast) • Identificateur du réseau suivi de un • 163.173.255.255 diffusion au réseau 163.173 de classe B • Adresse machine – – – – Identificateur réseau et machine 163.173.224.27: machine 224.27 du réseau 163.173 de classe B 163.x.x.x: localhost désigne la machine locale 0.0.0.0 utilisé si adresse inconnue de la machine • Adresse sous réseau – Utilisation des adresses machines comme adresse sous réseau – Masque de réseau: 255.255.0.0 pour la classe B – Masque de sous réseau: 255.255.255.0 pour le sous réseau Si @IPdest & masque = @de la machine; alors envoi à la machine - sinon routeur (@IPdest & masque, @IPmachine) C.Crochepeyre Applications CS 17 • Adresse Ethernet – Chaque machine = adresse éthernet sur 48 bits – Adresse physique – Correspondance entre @IP et @Ethernet (@MAC) • ARP Adress Resolution Protocol: – @IP -> @Ethernet -> machine – M1 envoie un message ARP avec son @IPM1et @EthernetM1 à toutes les machines, si M2 reconnaît son @IPM2 – M2 répond et renvoie @EthernetM2 – M1 met à jour sa table ARP avec les deux adresses de M2 – M2 met à jour sa table ARP avec les deux adresses de M1 • RARP Reverse ARP: – Une station recherche son @IP dans une table inversée de correspondance – machine -> @Ethernet -> @IP C.Crochepeyre Applications CS 18 Comment ça marche? • Les ports: – Côté serveur: chaque service (application) ouvre un port de communication identifié par un n° – Côté client : chaque client (application) ouvre un port de communication identifié par n° – La communication s’établit entre deux applications identifiées (ports) sur deux machines identifiées (@IP). • Envoi de paquets : – UDP: le message envoyé est découpée en datagrammes – TCP: le flot d’octets est bufferisé en segments • Les couches UDP et TCP – UDP et TCP ajoutent aux données les n° ports: port_dest, port_exp C.Crochepeyre Applications CS 19 • Couche IP: – IP ajoute, entre autres, aux données transmises par UDP ou TCP les adresses IP des machines (destinataire et expéditeur) @dest, @exp, données…. @dest, @exp, données…. • Les paquets sont acheminés via les réseaux jusqu’à la machine destinataire @dest • Les données sont transmises à l’application identifiée par son n° de port et récupère l’@IP de l’expéditeur C.Crochepeyre Applications CS 20 Le client interroge le serveur Serveur Client Port PC Port PS « Pourquoi? » « Pourquoi? » UDP UDP PS PC « Pourquoi? » PS PC « Pourquoi? » IP IP @S @C PS PC « Pourquoi? » @S @C PS PC « Pourquoi? » @S C.Crochepeyre @C Applications CS 21 Programmation: les sockets • Programmation des points terminaux de communication entre deux processus – Une socket à chaque extrémité du canal de communication • Point de sortie pour l’émission de données • Point d’entrée pour la réception de données • • • Utilisation essentielle pour des processus distants. Pour les processus locaux, d’autres outils (IPCs, PIPE) A chaque socket sont associés: descripteur, domaine, nom..... Le SGF est impliqué dans la gestion des sockets C.Crochepeyre Applications CS 22 • Descripteur – Référence attribuée dans le processus créateur – utilisation des descripteurs de fichiers: • Entrée dans la table des descripteurs du processus avec pointeur vers une structure interne de type socket • Redirection possible d’un fichier standard vers une socket • fork() : le fils hérite des descripteurs donc des sockets • Lecture et écriture en spécifiant le descripteur Table des fichiers Table des descripteurs du processus A i-noeud socket Files Connexions en attentes Connexions actives Data à émettre Data à recevoir Structure socket C.Crochepeyre Applications CS 23 • Domaine – Deux domaines possibles • Internet pour une communication distante • Unix pour une communication interne (si besoin) – Un format d’adresses de la socket selon le domaine – Des protocoles associés au domaine • Nom – Référence pour le processus et les autres processus • Une structure interne avec: – Pour une communication locale: nom de fichier – Pour une communication distante: une adresse transport adresse réseau + n° de port • Tout processus, non fils, peut hériter de la socket à condition que le descripteur soit « attaché » à cette référence – Similitude avec un fichier • La référence d’une socket est dans un i-nœud particulier C.Crochepeyre Applications CS 24 – Socket distante • Côté client – Un client doit connaître la référence de la socket serveur afin de l’appeler – La référence de la socket cliente peut être laissée à la charge du système • Côté serveur – La référence de la socket serveur doit être connue du client – La référence de la socket cliente est transmise automatiquement au serveur lors de la demande du client. Le serveur peut ainsi lui répondre. C.Crochepeyre Applications CS 25 • Le type – Sémantique associée à la communication • SOCK_DGRAM pour mode datagramme : des messages • SOCK_STREAM pour mode connecté : un flot de données – Similitudes avec • le courrier : l’expéditeur écrit au destinataire avec son adresse dans le courrier, pour la réponse • le téléphone : l’appelant compose le n°, l’appelé décroche et une ligne de communication est établie entre les deux n°. Ils raccrochent, la ligne est libérée. • Deux protocoles, deux modes de communication – Pour assurer la sémantique (type) • UDP pour SOCK_DGRAM • TCP pour SOCK_STREAM C.Crochepeyre Applications CS 26 Mode datagramme: le protocole UDP Côté Client Côté Serveur création d’une socket (attachement) socket()/bind() création et attachement d’une socket socket() et bind() construction adresse du serveur envoi message au serveur sendto() à une @serveur connue attente message du client réception recvfrom() @client attente réponse du serveur réception recvfrom() envoi réponse au client sendto() C.Crochepeyre Applications CS 27 Mode connecté: le protocole TCP Côté Client Côté Serveur création d’une socket (attachement) socket()/bind() création et attachement d’une socket d’écoute socket() et bind() construction adresse du serveur Ouverture du service listen() demande connexion connect() à une @serveur connue Attente de demande de connexion client accept() @client nouvelle socket de service échanges write() read() Échanges socket de service read() write() C.Crochepeyre Applications CS 28 Les primitives de création • Création d’une socket sock = socket(domaine, type, protocole) int sock; n° du descripteur socket créée int domaine; AF_INET ou AF_UNIX (AF_LOCAL..) int type; SOCK_DGRAM ou SOCK_STREAM int protocole; O protocole par défaut – Implication des différentes tables du SGF Unix – Suppression au close() de la socket – Fonction assimilable à la fonction pipe() mais un seul n° de descripteur, pas de nom de fichier – Les processus fils héritent des descripteurs du père donc du descripteur de la socket C.Crochepeyre Applications CS 29 • Suppression d’une socket close(sock) int sock; descripteur socket – à la fermeture du dernier descripteur de la socket – Cas STOCK_STREAM: il peut arriver que la suppression soit bloquante car le tampon d’émission a encore des caractères non transmis. C.Crochepeyre Applications CS 30 • Attachement d’une adresse à une socket: nom de la socket – Le descripteur doit être associé à un nom de fichier si domaine Unix ou un n° de port et une @IP si domaine Internet bind(sock, adresse, lgstruct) int sock; descripteur socket int lgstruct; longueur de la structure selon le domaine Deux structures différentes : socket interne et socket distante adresse domaine UNIX struct sockaddr_un {short sun_family; char sun_path [109];} nom fichier C.Crochepeyre adresse domaine INTERNET struct sockaddr_in {short sin_family; u_short sin_port; @port struct in_addr sin_addr; @IP char sin_zero [8];} Applications CS 31 • Après le bind() le descripteur pointe sur la structure système associée à la socket – avec le nom du fichier de type S (socket) spécifié dans sun_path si Unix – avec le n° du port et l’adresse IP si Internet • Possibilités sin_addr = INADDR_ANY (une des adresses de la machine) = ou gethostname()… sin_port = 0 un port libre alloué par le système = n° port choisi = getservbyname() …. C.Crochepeyre Applications CS 32 • Exemples socket Unix struct sockaddr_un sockux; ……….. sockux.sun_family = AF_UNIX; strcpy(sockux.sun_path, « sockunix.test ») bind(sock,&sockux,strlen(sockux.sun_path)+2) socket INTERNET struct sockaddr_in sockit; ……………..; sockit.sin_family = AF_INET; sockit.sin_port = n° du port associé à la socket; (format réseau) sockit.sin_addr = adresse de la machine; (format réseau) bind(sock, &sockit,sizeof(sockit)); C.Crochepeyre Applications CS 33 • Des fonctions pour récupérer les adresses machines gethostname() récupération du nom de la machine dans une chaîne de caractères gethostbyname() récupération du nom de la machine dans une structure hostent • Des fonctions pour récupérer les n° ports des services – Si le service est connu getservbyname() getservent() getservbyport() permettent de récupérer les caractéristiques des services dans un structure « servent » – Service quelconque utilisateur getsockname() récupération du n° du port attaché à une socket en fournissant le descripteur C.Crochepeyre Applications CS 34 • Conversion des formats des données – Chaque machine code ses données selon un format local, les échanges entre machines impliquent donc des conversions • du format local au format réseau et • du format réseau au format local – L’adresse IP et n° port doivent être au format réseau dans la structure système avant envoi – L’adresse IP et n° port reçus dans la structure doivent être reconvertis au format local avant utilisation (ex: pour un printf de l’adresse de la machine) • Primitives conversion des données – – – – ntohl() ntohs() ntonl() ntons() C.Crochepeyre adresse réseau entier long en adresse locale adresse réseau entier court en adresse locale adresse locale entier long en adresse réseau adresse locale entier court en adresse réseau Applications CS 35 Les primitives d’échanges mode UDP • Après création de la socket et attachement • Emission nc = sendto(sock,msg,option,p_dest,lgdest) int nc; nb de car envoyés int sock; n° descripteur socket locale char *msg; adresse message à envoyer Int lg; long du message à envoyer Int option; 0 pour SOCK_DGRAM struct sockaddr *p_dest; struct socket avec l’adresse du destinataire int lgdest; long structure socket sendmsg() envoi de plusieurs messages C.Crochepeyre Applications CS 36 • Réception nc = recvfrom(sock,msg,lg,option,p_exp,lgexp) int nc; nb de car reçus int sock; n° descripteur socket char *msg; adresse récupération du message Int lg; taille espace réception Int option; 0 ou MSG_PEEK struct sockaddr *p_exp; struct récup l’adresse de l’expéditeur int lgdest; long structure de l’expéditeur recvmsg() réception de plusieurs messages C.Crochepeyre Applications CS 37 Primitives en mode TCP • Après création de la socket et attachement • Etablissement du circuit virtuel côté client côté serveur demande de connexion connect(sock,p_adr,lg_adr) préparation du service listen(soke,nb) traitement de la connexion reçue socks=accept(socke, p_adr,p_lg_adr) Client: int sock; struct sockaddr *p_adr; int lg_adr; descripteur socket cliente structure contenant @machineServeur et n° port long de la structure Serveur int socke int nb; int socks; struct sockaddr *p_adr; Int lg_adr; descripteur socket écoute serveur nombre maxi de connexions pendantes descripteur socket de service qui va communiquer avec le client structure récupérant @machineClient et n° port long structure C.Crochepeyre Applications CS 38 • Emission nc = write(socks,msg,lg) int socks descripteur socket de service char *msg adresse du message à envoyer int lg long du message int nc nb de car réellement émis Ou nc = send(socks,msg,lg,option) option 0 idem write MSG_OOB caractère urgent (out-of-band) MSG_PEEK conservation message… C.Crochepeyre Applications CS 39 • Réception Nc = read(socks, msg, lg, option) int socks descripteur socket de service char *msg adresse du message reçu int lg long du message int nc nb de car réellement lus Ou Nc = recv(socks, msg, lg, option) C.Crochepeyre Applications CS 40 Serveur parallèle: TCP • Pour éviter que le serveur prenne en charge qu’un seul service à la fois, il crée un processus fils à chaque demande client • Le processus fils hérite automatiquement des descripteurs ouverts par le père (socke et socks) dans sa propre table des descripteurs ainsi que des données associées. • Chaque fils remplace son code par le code du service à exécuter exec(service demandé) avec passage en paramètres : socke et socks • Le fils communique alors directement avec son client • Le processus serveur est déchargé de ce service et peut accepter une autre demande. • Ne pas oublier de fermer – La socket d’écoute dans le processus fils (non utile) – La socket de service dans le processus père (non utile) C.Crochepeyre Applications CS 41 Serveur parallèle clients C.Crochepeyre serveur Applications CS 42 Serveur parallèle: TCP Côté Client Côté Serveur création d’une socket (attachement) socket()/bind() création et attachement d’une socket d’écoute socket() et bind() construction adresse du serveur Ouverture du service listen() demande connexion connect() à une @serveur connue Attente de demande de connexion client accept() @client nouvelle socket de service création d’un processus fils fork() exec() échanges write() read() C.Crochepeyre Échanges socket de service read() write() Applications CS 43 Exemple simple UDP • Client UDP /**********************************************/ /* utilisation des sockets mode datagramme */ /* client UDP */ /* Le client envoie une suite de car au serveur */ /*********************************************/ #include #include #include #include #include #include extern <stdio.h> <errno.h> <sys/types.h> <sys/socket.h> <netinet/in.h> <netdb.h> errno; main(argc,argv) char **argv; { struct hostent *h; struct sockaddr_in sin; char buf[10]; int sock; C.Crochepeyre On passe en argument: n° port du service et l’@IP du serveur Structure pour récupération des propriétés d’une machine Structure socket on y place l’adresse du serveur Zone de message descripteur socket Applications CS 44 if(argc!=3) { fprintf(stderr,"usage: %s remotehost remoteport \n",argv[0]); exit(0); } if((sock = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP)) < 0) { perror("socket"); exit(1); } if(!(h=gethostbyname(argv[1]))) { perror(argv[1]); exit(2); } bzero(&sin,sizeof(sin)); sin.sin_family = AF_INET; bcopy(h->h_addr,&sin.sin_addr,h->h_length); sin.sin_port = htons(atoi(argv[2])); C.Crochepeyre création socket cliente UDP récupération @machine serveur maj struct socket cliente n° port serveur Applications CS 45 if(sendto(sock,"ABC",3,0,&sin, sizeof(sin))!=3) { fprintf(stderr,"erreur ecriture \n"); exit(1); } if(sendto(sock,"DEFGH",5, 0,&sin, sizeof(sin))!=5) { fprintf(stderr,"erreur ecriture \n"); exit(1); } if(sendto(sock,"IJ",2, 0,&sin, sizeof(sin))!=2) { fprintf(stderr,"erreur ecriture \n"); exit(1); } if(sendto(sock,"KLMNOPQRS",9,0,&sin, sizeof(sin))!=9) { fprintf(stderr,"erreur ecriture \n"); exit(1); } sleep(2); if(sendto(sock,"TUV",3, 0,&sin, sizeof(sin))!=3) { fprintf(stderr,"erreur ecriture \n"); exit(1); } if(sendto(sock,"WXYZ",4, 0,&sin, sizeof(sin))!=4){ fprintf(stderr,"erreur ecriture \n"); exit(1); } close (sock);} C.Crochepeyre Applications CS 46 • Serveur UDP /************************************************/ /* utilisation de socket sur le reseau mode datagramme */ /* partie serveur */ /* Le serveur reçoit du client les caractères */ /************************************************/ #include <unistd.h> #include<stdio.h> #include <fcntl.h> #include <sys/socket.h> #include <sys/time.h> #include <netinet/in.h> #include <netdb.h> struct sockaddr_in sin = {AF_INET}; Struct pour la socket serveur main() { int len, sock; char ligne[10]; int n; struct sockaddr_in adr; Struct pour récupérer l’adresse client if((sock = socket(AF_INET,SOCK_DGRAM,0)) < 0) {perror("socket"); exit(1); } C.Crochepeyre Applications CS 47 if(bind(sock, &sin, sizeof(sin)) < 0) attachement de la socket serveur {perror("bind"); exit(2); } len = sizeof(sin); if(getsockname(sock, &sin, &len) < 0) récupération n° port attribué à la socket serveur {perror("getsockname"); exit(3); } printf("server bound to port %u 0x%x \n",ntohs(sin.sin_port),sin.sin_port); affiche le n° port socket serveur for(;;) {len = sizeof(adr); n = recvfrom(sock,ligne,10,0,&adr, &len); attend les carac du client if (n == -1) {perror (" pb socket lecture"); exit(); } ligne[n] ='\0'; printf("la chaine lue par le serveur est %s\n",ligne); affichage } } C.Crochepeyre Applications CS 48 Exemple simple TCP • Client TCP /*************************************/ /* client.c tcp_client */ /* socket mode connecte */ /* le client attend un message du serveur */ /* il n’envoie rien au serveur */ /*************************************/ #include #include #include #include #include #include extern <stdio.h> <errno.h> <sys/types.h> <sys/socket.h> <netinet/in.h> <netdb.h> errno; main(argc,argv) char **argv; { struct hostent *h; struct sockaddr_in sin; char buf[2048]; int sock; C.Crochepeyre arguments: @port serveur et @machine serveur communiqués par le printf() du serveur Struct conversion adresses Struct socket cliente dans laquelle on place l’adresse du serveur Buffer message du serveur Descripteur socket cliente Applications CS 49 if(argc!=3) {fprintf(stderr,"usage: %s remotehost remoteport \n",argv[0]); @du port serveur exit(0); } if((sock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)) < 0) création socket cliente TCP {perror("socket"); exit(1); } if(!(h=gethostbyname(argv[1]))) @machine serveur {perror(argv[1]); exit(2); } bzero(&sin,sizeof(sin)); maj struct socket sin.sin_family = AF_INET; bcopy(h->h_addr,&sin.sin_addr,h->h_length); @machine serveur sin.sin_port = htons(atoi(argv[2])); @port serveur if(connect(sock,&sin,sizeof(sin)) < 0) {perror("connect"); } printf ("Attente Message Serveur \n"); read (sock, buf, 18); printf ("Message Recu : %s \n", buf); close (sock); } C.Crochepeyre demande connexion au serveur attente d’un message du serveur Applications CS 50 • Serveur TCP /*************************************/ /* server.c tcp_serveur */ /* socket mode connecte */ /* le serveur envoie un message au client */ /* il n’attend rien du client */ /*************************************/ #include <stdio.h> #include <signal.h> #include <sys/types.h> #include <sys/socket.h> #include <sys/time.h> #include <netinet/in.h> #include <netdb.h> struct sockaddr_in sin = {AF_INET}; structure socket serveur main(argc,argv) char **argv; { int namelen, newsock, sock; if((sock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)) < 0) {perror("socket"); exit(1); } C.Crochepeyre Applications CS création socket serveur TCP 51 if(bind(sock, &sin, sizeof(sin)) < 0) attachement de la socket serveur {perror("bind"); exit(2); } namelen = sizeof(sin); if(getsockname(sock, &sin, &namelen) < 0) récupération n° port socket serveur {perror("getsockname"); exit(3); } printf("server bound to port %u 0x%x \n",ntohs(sin.sin_port),sin.sin_port); affichage n° port if(listen(sock,5) < 0) ouverture du service, 5 connexions pendantes {perror("listen"); exit(4); } for (;;) {if((newsock = accept(sock,&sin,&namelen)) < 0) attente de connexion cliente, acceptation {perror("accept"); et création de la socket de service et récupération de exit(5); } l’adresse du client dans &sin write (newsock, "bonjour du Serveur", 18); le serveur envoie son bonjour au client close(newsock); } } C.Crochepeyre Applications CS 52