Applications client/serveur TCP/IP - lionne.cnam.frlionne.cnam.fr/Cours/CPI/TCP_IP.pdf · –...
Transcript of Applications client/serveur TCP/IP - lionne.cnam.frlionne.cnam.fr/Cours/CPI/TCP_IP.pdf · –...
C.Crochepeyre Applications CS 1
Applications client/serveurTCP/IP - Sockets
Rappels
C.Crochepeyre Applications CS 2
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 3
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 serveur
C.Crochepeyre Applications CS 4
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
clients clientserveur
M1
M2
M3
C.Crochepeyre Applications CS 5
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
M1
serveur
M2
M3
client
C.Crochepeyre Applications CS 6
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
serveur
M1M2
M3
client
C.Crochepeyre Applications CS 7
• Serveur itératif– Le serveur ne traite qu’une demande à la fois
• Serveur parallèle– Le serveur traite plusieurs demandes simultanément
clients serveur
clientsserveur
C.Crochepeyre Applications CS 8
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 9
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 10
• Les couches basses:– Physique: transmission binaire– Liaison: transmission de trames– Réseau: acheminement des paquets, routage, interconnexion des sous-
ré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 11
• 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…
Le protocole TCP/IP
C.Crochepeyre Applications CS 12
• 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 13
• 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 14
• 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 applicationExemple 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 fluxExemple SMTP (mail)
– Communication entre deux processus via des n° de port
C.Crochepeyre Applications CS 15
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é 163.173.212.27– Symbolique 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 16
• Classe A: 0.0.0.0 à 127.255.255.255@locale
0
1 7
réseau
24
• Classe B: 128.0.0.0 à 191.255.255.255réseau @locale
0
1 1 14 18
1
• Classe C: 192.0.0.0 à 223.255.255.255réseau @locale
0
1 1 1 21 8
1 1
• Classe D: 224.0.0.0 à 239.255.255.255multicast
1 1 1 1 28
1 1 1 1
C.Crochepeyre Applications CS 17
• 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éseauSi @IPdest & masque = @de la machine; alors envoi à la machine - sinon
routeur (@IPdest & masque, @IPmachine)
C.Crochepeyre Applications CS 18
• 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 19
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 20
• 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 21
« Pourquoi? »
PS PC « Pourquoi? »
@S @C
@S @C PS PC « Pourquoi? »
UDP
IP
« Pourquoi? »
PS PC « Pourquoi? »
@S @C PS PC « Pourquoi? »
UDP
IP
Port PS Port PC
Le client interroge le serveur
ClientServeur
C.Crochepeyre Applications CS 22
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 23
• 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 desdescripteurs
duprocessus A
socket
Table desfichiers
Structure socket
i-noeudConnexions en attentesConnexions activesData à émettreData à recevoir
Files
C.Crochepeyre Applications CS 24
• 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 25
– 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 26
• 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 27
Mode datagramme: le protocole UDP
Côté Client Côté Serveurcréation d’une socket
(attachement)socket()/bind()
construction adresse du serveur
envoi message au serveursendto()
à une @serveur connue
attente réponse du serveurréception
recvfrom()
création et attachementd’une socket
socket() et bind()
attente message du client réception
recvfrom()@client
envoi réponse au clientsendto()
C.Crochepeyre Applications CS 28
Mode connecté: le protocole TCP
Côté Client Côté Serveurcréation d’une socket
(attachement)socket()/bind()
construction adresse du serveur
demande connexionconnect()
à une @serveur connue
échangeswrite()read()
création et attachementd’une socket d’écoute
socket() et bind()
Ouverture du servicelisten()
Attente de demande de connexion client
accept()@client
nouvelle socket de service
Échanges socket de serviceread()write()
C.Crochepeyre Applications CS 29
Les primitives de création
• Création d’une socketsock = socket(domaine, type, protocole)
int sock; n° du descripteur socket crééeint domaine; AF_INET ou AF_UNIX (AF_LOCAL..)int type; SOCK_DGRAM ou SOCK_STREAMint 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 30
• Suppression d’une socketclose(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 31
• 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 socketint lgstruct; longueur de la structure selon le domaine
Deux structures différentes : socket interne et socket distante
adresse domaine UNIXstruct sockaddr_un {short sun_family;char sun_path [109];} nom fichier
adresse domaine INTERNETstruct sockaddr_in {short sin_family;u_short sin_port; @portstruct in_addr sin_addr; @IPchar sin_zero [8];}
C.Crochepeyre Applications CS 32
• 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éssin_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 33
• Exemplessocket Unixstruct sockaddr_un sockux;………..sockux.sun_family = AF_UNIX;strcpy(sockux.sun_path, « sockunix.test »)bind(sock,&sockux,strlen(sockux.sun_path)+2)
socket INTERNETstruct 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 34
• Des fonctions pour récupérer les adresses machinesgethostname() récupération du nom de la machine dans une chaîne de caractèresgethostbyname() 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 utilisateurgetsockname() récupération du n° du port attaché à une socket en fournissant le descripteur
C.Crochepeyre Applications CS 35
• 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() adresse réseau entier long en adresse locale– ntohs() adresse réseau entier court en adresse locale– ntonl() adresse locale entier long en adresse réseau– ntons() adresse locale entier court en adresse réseau
C.Crochepeyre Applications CS 36
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ésint sock; n° descripteur socket localechar *msg; adresse message à envoyerInt lg; long du message à envoyerInt option; 0 pour SOCK_DGRAMstruct sockaddr *p_dest; struct socket avec l’adresse du destinataireint lgdest; long structure socket
sendmsg() envoi de plusieurs messages
C.Crochepeyre Applications CS 37
• Réceptionnc = recvfrom(sock,msg,lg,option,p_exp,lgexp)int nc; nb de car reçusint sock; n° descripteur socketchar *msg; adresse récupération du messageInt lg; taille espace réceptionInt option; 0 ou MSG_PEEKstruct sockaddr *p_exp; struct récup l’adresse de l’expéditeurint lgdest; long structure de l’expéditeur
recvmsg() réception de plusieurs messages
C.Crochepeyre Applications CS 38
Primitives en mode TCP• Après création de la socket et attachement• Etablissement du circuit virtuel
côté client côté serveurdemande de connexion préparation du serviceconnect(sock,p_adr,lg_adr) listen(soke,nb)
traitement de la connexion reçuesocks=accept(socke, p_adr,p_lg_adr)
Client:int sock; descripteur socket clientestruct sockaddr *p_adr; structure contenant @machineServeur et n° portint lg_adr; long de la structure
Serveurint socke descripteur socket écoute serveurint nb; nombre maxi de connexions pendantesint socks; descripteur socket de service qui va communiquer avec le clientstruct sockaddr *p_adr; structure récupérant @machineClient et n° portInt lg_adr; long structure
C.Crochepeyre Applications CS 39
• Emissionnc = write(socks,msg,lg)int socks descripteur socket de servicechar *msg adresse du message à envoyerint lg long du messageint nc nb de car réellement émis
Ounc = 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 40
• RéceptionNc = read(socks, msg, lg, option)int socks descripteur socket de servicechar *msg adresse du message reçuint lg long du messageint nc nb de car réellement lus
OuNc = recv(socks, msg, lg, option)
C.Crochepeyre Applications CS 41
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 42
clientsserveur
Serveur parallèle
C.Crochepeyre Applications CS 43
Serveur parallèle: TCP
Côté Client Côté Serveurcréation d’une socket
(attachement)socket()/bind()
construction adresse du serveur
demande connexionconnect()
à une @serveur connue
échangeswrite()read()
création et attachementd’une socket d’écoute
socket() et bind()
Ouverture du servicelisten()
Attente de demande de connexion client
accept()@client
nouvelle socket de service
création d’un processus filsfork() exec()
Échanges socket de serviceread()write()
C.Crochepeyre Applications CS 44
Exemple simple UDP
• Client UDP/**********************************************//* utilisation des sockets mode datagramme *//* client UDP *//* Le client envoie une suite de car au serveur *//*********************************************/
#include <stdio.h>#include <errno.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <netdb.h>extern errno;
main(argc,argv) On passe en argument: n° port du service et l’@IP du serveurchar **argv;{struct hostent *h; Structure pour récupération des propriétés d’une machinestruct sockaddr_in sin; Structure socket on y place l’adresse du serveurchar buf[10]; Zone de messageint sock; descripteur socket
C.Crochepeyre Applications CS 45
if(argc!=3) { fprintf(stderr,"usage: %s remotehost remoteport \n",argv[0]);exit(0); }
if((sock = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP)) < 0) création socket cliente UDP{perror("socket");exit(1); }
if(!(h=gethostbyname(argv[1]))) { récupération @machine serveurperror(argv[1]);exit(2); }
bzero(&sin,sizeof(sin)); maj struct socket clientesin.sin_family = AF_INET;bcopy(h->h_addr,&sin.sin_addr,h->h_length);sin.sin_port = htons(atoi(argv[2])); n° port serveur
C.Crochepeyre Applications CS 46
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 47
• 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 48
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 serveurfor(;;){len = sizeof(adr);n = recvfrom(sock,ligne,10,0,&adr, &len); attend les carac du clientif (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 49
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 <stdio.h>#include <errno.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <netdb.h>extern errno;
main(argc,argv) arguments: @port serveur et @machine serveur communiqués par le printf() du serveurchar **argv;{struct hostent *h; Struct conversion adressesstruct sockaddr_in sin; Struct socket cliente dans laquelle on place l’adresse du serveurchar buf[2048]; Buffer message du serveurint sock; Descripteur socket cliente
C.Crochepeyre Applications CS 50
if(argc!=3){fprintf(stderr,"usage: %s remotehost remoteport \n",argv[0]); @du port serveurexit(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 socketsin.sin_family = AF_INET;bcopy(h->h_addr,&sin.sin_addr,h->h_length); @machine serveursin.sin_port = htons(atoi(argv[2])); @port serveur
if(connect(sock,&sin,sizeof(sin)) < 0) demande connexion au serveur{perror("connect");}printf ("Attente Message Serveur \n"); attente d’un message du serveurread (sock, buf, 18);printf ("Message Recu : %s \n", buf);close (sock);}
C.Crochepeyre Applications CS 51
• 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) création socket serveur TCP{perror("socket");exit(1);}
C.Crochepeyre Applications CS 52
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);}}