Interface des sockets - PowerPoint PPT Presentation

About This Presentation
Title:

Interface des sockets

Description:

Interface des sockets Patrick F lix Ann e 2001-2002 I.S.T / IUT Bordeaux I A quoi a sert les sockets ? Applications client/serveur Transfert de fichiers Connexion ... – PowerPoint PPT presentation

Number of Views:81
Avg rating:3.0/5.0
Slides: 45
Provided by: Patri212
Category:

less

Transcript and Presenter's Notes

Title: Interface des sockets


1
Interface des sockets
Patrick Félix Année 2001-2002 I.S.T / IUT
Bordeaux I
2
A quoi ça sert les sockets ?
  • Applications client/serveur
  • Transfert de fichiers
  • Connexion à distance
  • Courrier électronique
  • Groupe de discussions
  • Web
  • Et maintenant tous les domaines de
    linformatique
  • Multimedia, jeux, télémaintenance
  • Comment implémenter de telles applications
  • Interface des sockets

3
Les sockets
  • Mécanisme de communication inter-processus
  • Bref historique
  • UNIX BSD4.2 (Berkeley Software Distribution)
  • Windows de Microsoft, UNIX System V...
  • Interface applicative
  • Ensemble de primitives permettant des E/S avec la
    pile de protocole TCP/IP
  • socket, connect, write, read, close, bind,
    listen, accept
  • Interface entre couches application et transport
  • Adaptée aux protocoles TCP et UDP, mais
    utilisable avec d'autres familles de protocoles

4
Communication sous UNIX
  • Rappels
  • tube (pipe) du système UNIX
  • tube nommé
  • Socketsgénéralisation des tubes nommés
  • Point de communication bidirectionnelle par
    lequel un processus pourra émettre ou recevoir
    des informations
  • processus sur des machines (éventuellement)
    différentes
  • systèmes dexploitation (éventuellement)
    différents

5
Attributs des sockets
  • un nom
  • Descripteur de fichier
  • un type
  • SOCK_STREAMmode connecté, remise fiable (TCP/IP)
  • SOCK_DGRAMmode non connecté, remise non fiable
    (UDP/IP)
  • RAW mode caractère (pour accès direct aux
    couches inférieures)
  • associé à un processus
  • une adresse (adresse IP n port)

6
Interface des sockets
  • Partie 0 Notions sur larchitecture TCP/IP

7
Découpage en couches
Modèle OSI
Modèle TCP/IP
8
Réseau local
9
Réseau local
10
Schéma d'une interconnexion
11
Adresses et Nom
  • Chaque machine a
  • adresse physique (ou MAC) dans son réseau local
  • 00-a0-cc-da-a7-73
  • adresse IP au niveau interconnexion
  • 172.16.94.4
  • Un nom de domaine
  • ist.ga
  • Un (ou plusieurs) nom(s)
  • stargate.ist.ga (pop.ist.ga, smtp.ist.ga)

12
Adressage IP (Internet Protocol)
Exemples 147.210.94.1. Réseau de classe B
d'adresse 147.210
13
Adressage IP
14
Protocole TCP
  • Transmission Control Protocol
  • protocole de transfert fiable en mode connecté
  • utile car IP est un protocole de remise non
    fiable
  • du style de la couche transport ISO classe 4

15
Protocole TCP
  • Principes
  • message est un flot de octets (UNIX !)
  • mécanisme d'anticipation (fenêtre glissante)
  • taille de la fenêtre d'émission variable
  • on acquitte sur le dernier octet d'une "séquence
    sans trou"
  • retransmission si temporisateur expire
  • notion de port
  • Permet de localiser de façon unique le processus
    impliqué dans la communication
  • Le couple (adresse IP n port) permet de
    déterminer de façon unique le processus
    destinataire/expéditeur des données
  • Les processus correspondant à des services
    normalisés utilisent des numéros de port
    prédéfinis (et connu de tous)

16
Protocole UDP
  • User Datagram Protocol
  • UDP offre un service de remise non fiable en mode
    sans connexion. Les messages UDP peuvent être
    perdus, déséquencés, dupliqués ou retardés.
  • UDP utilise un mécanisme de "port" identique à
    TCP.

17
Interface des sockets
  • Partie I Généralités

18
Types de socket et protocoles
19
Modes de dialogue et primitives
20
Structure de données
  • include ltsys/types.hgt //Bibliothèques requises
  • include ltsys/socket.hgt
  • struct sockaddr
  • unsigned short sa_family //famille de protocole
    pour cette adresse
  • char sa_data14 // 14 octets dadresse
  • struct sockaddr_in // _in pour Internet
  • short sin_family //famille de protocole
    pour cette adresse
  • u_short sin_port //numéro de port
    (0port non utilisé)
  • struct in_addr sin_addr //adresse IP
  • char sin_zero8 //non utilisé
  • struct in_addr
  • u_long s_addr //soit 4 octets bien pour une
    adresse IP !

21
Création fermeture
  • int socket(int af, int type, int protocole)
  • création de la structure de donnée (appelée
    socket) permettant la communication,
  • af famille de protocole (TCP/IP, ou
    d'autres...)
  • AF_INET domaine Internet (domaine que nous
    utiliserons)
  • AF_UNIX domaine UNIX (pour donner un autre
    exemple)
  • type SOCK_STREAM, SOCK_DGRAM, RAW
  • Protocole 0 pour protocole par défaut (voir
    ltnetinet/in.hgt)
  • socket() retourne
  • un descripteur de socket
  • -1 si erreur
  • close(int socket)
  • Ferme la connexion et supprime la structure de
    données associée à la socket
  • Shutdown(int socket, int how)
  • how 0/1/2 pour réception interdite/émission
    interdite/réceptionémission interdite

22
Spécification dadresse locale
  • int bind(int socket, struct sockaddr
    adresse-locale, int longueur-adresse)
  • Associe un numéro de port et une adresse locale à
    une socket, retourne 1 si erreur.
  • socket descripteur de socket
  • adresse-locale structure qui contient l'adresse
    (adresse IP n de port)
  • adresse-locale struct sockaddr
  • sockaddr_un si AF_UNIX
  • sockaddr_in si AF_INET (adresse IP)
  • longueur adresse sizeof(struct sock_addr)
  • Si sin_port0 choix dun numéro de port non
    utilisé
  • Si sin_addr.s_addr INADDR_ANY utilisation de
    ladresse IP de la machine

23
Diverses primitives utiles
  • struct hostent gethostbyname(char name)
  • pour traduire un nom de domaine en adresse IP
  • struct hostent h
  • hgethostbyname("stargate.ist.ga")
  • printf("adresse IP s\n",
  • inet_ntoa(((struct in_addr )h-gth_addr)))
  • getservbyname()
  • pour traduire en n de port le nom d'un service
  • getsockname(int desc, struct sock_addr p_adr,
    int p_longueur)
  • pour récupérer ladresse effective dune socket
    (après bind)

24
  • Conversion Network Byte Order (68000) Host Byte
    Order (Intel)
  • htons() Host to Network Short
  • htonl() Host to Network Long
  • ntohs() Network to Host to Short
  • ntohl() Network to Host to Long
  • ATTENTION toujours mettre les octets dans
    lordre Network Order avant de les envoyer sur
    le réseau
  • in_addr inet_addr(char )
  • Convertit une adresse ASCII en entier long
    signé (en Network Order)
  • socket_ad.sin_addr.s_addr inet_addr("172.16.94.1
    00")
  • char inet_ntoa(in_addr)
  • Convertit entier long signé en une adresse
    ASCII
  • char ad1_ascii
  • ad1_asciiinet_ntoa(socket_ad.sin_addr),
  • printf("adresse s\n",ad1_ascii)

25
Interface des sockets
  • Partie II Mode datagramme

26
Lecture-Ecriture en mode datagramme (UDP)
  • int sendto()
  • Permettent l'envoi de datagrammes en mode
    non-connecté
  • Contient adresse du destinataire (sendto)
  • int recvfrom()
  • réception (bloquante)
  • Contient adresse de lémetteur

27
sendto et recvfrom syntaxe
  • int sendto(
  • int socket, // descripteur socket
  • void tampon, // message à envoyer
  • int longueur, // longueur du message
  • int drapeaux, // 0
  • struct sockaddr p_adresse,//adresse
    destinataire
  • int longueur_adresse //longueur adresse
  • int recvfrom(
  • int desc, // descripteur socket
  • void tampon, // zone pour recevoir le message
  • int longueur, // longueur de la zone réservée
  • int option, // 0 ou MSG_PEEK
  • struct sockaddr p_adresse, //adresse émetteur
  • int longueur_adresse //longueur adresse

28
Dialogue (datagramme)
29
Protocoles  application  utilisant UDP
  • Un protocole non normalisé BigBen
  • CHEURE
  • SHH
  • SMM
  • SSS
  • Un schéma classique (mais non général)
  • Envoi dune requête par un client
  • Réponse du serveur
  • Un protocole normalisé
  • TFTP (port 69)
  • Voir prochains cours sur les applications

30
Source SocketMode Datagramme
31
  • BigbenServeur-UDP
  • int main(int argc, char argv)
  • struct sockaddr_in addr_serveur
  • socklen_t lg_addr_serveur sizeof
    addr_serveur
  • /
  • / creation de la prise /
  • fdPortsocket(AF_INET,SOCK_DGRAM,0)
  • if (fdPortlt0) FATAL("socket")
  • / nommage de la prise /
  • addr_serveur.sin_family AF_INET
  • addr_serveur.sin_addr.s_addr INADDR_ANY
  • addr_serveur.sin_port
    htons(atoi(argv1))
  • if (bind(fdPort,(struct sockaddr
    )addr_serveur, lg_addr_serveur) lt 0)
  • FATAL("bind")
  • / Recuperation du nom de la prise /
  • if (getsockname(fdPort,(struct sockaddr
    )addr_serveur, lg_addr_serveur) lt 0)
  • FATAL("getsockname")
  • / Le serveur est a l'ecoute /

32
  • void travail(int fd)
  • struct sockaddr_in addr_client
  • socklen_t lg_addr_client sizeof addr_client
  • long horloge
  • struct tm temps
  • char demande1024
  • char tampon2
  • int h,m,s
  • / attente d'une demande d'un client /
  • recvfrom(fd, demande, 1024, 0,(struct sockaddr
    )addr_client, lg_addr_client)
  • / affichage de la demande a l'ecran /
  • printf("s\n",demande)
  • / preparation de la reponse /
  • time(horloge) tempslocaltime(horloge)
  • h temps-gttm_hour m temps-gttm_min s
    temps-gttm_sec
  • / envoi de la reponse /
  • sprintf(tampon, "02d", h)
  • sendto(fd, tampon, 2, 0,(struct sockaddr
    )addr_client, lg_addr_client)
  • sprintf(tampon, "02d", m)

33
  • BigbenClient-UDP
  • /
  • static int fdPort
  • int main(int argc, char argv)
  • struct sockaddr_in addr_serveur
  • socklen_t lg_addr_serveur sizeof
    addr_serveur
  • struct hostent serveur
  • /
  • / creation de la prise /
  • fdPortsocket(AF_INET,SOCK_DGRAM,0)
  • if (fdPortlt0)FATAL("socket")
  • / recherche de la machine serveur /
  • serveur gethostbyname(argv1)
  • if (serveur NULL) FATAL("gethostbyname")
  • / remplissage adresse socket du serveur /
  • addr_serveur.sin_family AF_INET
  • addr_serveur.sin_port
    htons(atoi(argv2))
  • addr_serveur.sin_addr (struct in_addr
    ) serveur-gth_addr

34
  • void travail(int fd, struct sockaddr
    addr_serveur, socklen_t lg_addr_serveur)
  • char h3,m3,s3
  • char question6
  • / envoi d'une question au serveur /
  • strcpy(question,"HEURE")
  • sendto(fd, question, strlen(question), 0,
    addr_serveur, lg_addr_serveur)
  • / recuperation de la reponse du serveur /
  • recvfrom(fd, h, 2, 0, addr_serveur,
    lg_addr_serveur)
  • h2'\0'
  • recvfrom(fd, m, 2, 0, addr_serveur,
    lg_addr_serveur)
  • m2'\0'
  • recvfrom(fd, s, 2, 0, addr_serveur,
    lg_addr_serveur)
  • s2'\0'
  • / affichage de la reponse du serveur a l'ecran
    /
  • printf("Il est sss sur le
    serveur\n",h,m,s)

35
Exercice 1 Successeur dun caractère
  • On se propose dimplémenter lapplication
    client-serveur (datagramme)  Successeur  basée
    sur le protocole suivant  un client envoie un
    caractère et le serveur répond en envoyant son
    successeur .
  • Un source pour le client, ainsi quun source
    incomplet pour le serveur sont fournis dans
    seanceUDP/Succ  à vous de compléter le code du
    serveur

36
Exercice 2 Simulation client/serveur d'une
caisse enregistreuse
  • Les sources de départ se trouvent dans
    seanceUDP/Caisse.
  • Le serveur tient à jour une liste de produits
    (référence, description, quantité en stock), et
    permet à un ou plusieurs clients distants de
    l'interroger et d'agir sur cette liste.
  • Les fonctionnalités de l'application de départ
    sont les suivantes 
  • Côté client  envoi d'une demande d'Information
    sous la forme
  • I ltreferencegt
  • Côté serveur  réponse à une demande
    d'Information sous la forme
  • Y ltquantitegt ltdescriptiongt si la référence est
    connue,
  • N ltmessage d'erreurgt sinon.
  • Exécutez cette application client/serveur et
    familiarisez vous avec les sources (le code
    contient des commentaires qui complèteront la
    description sommaire précédente).

37
Exercice 3 Simulation client/serveur d'une
caisse enregistreuse (suite)
  • Le but de l'exercice est d'ajouter des
    fonctionnalités à cette application.
  • Le serveur est capable actuellement de gérer un
    autre type de demande, de type Achat, de la forme
  • A ltreferencegt ltquantitegt
  • Le format de la réponse est le suivant 
  • Y si la référence est connue et qu'il y a assez
    de produits disponibles,
  • N ltmessage d'erreurgt sinon.
  • Modifiez le client pour qu'il gère cette demande.

38
Exercice 3 Simulation client/serveur d'une
caisse enregistreuse (suitefin)
  • Modifiez le serveur et le client pour gérer une
    demande du type Réapprovisionnement.
  • Format demande
  • R ltreferencegt ltquantite supplementairegt
  • Format réponse
  • Y
  • si c'est OK,
  • N ltmessage d'erreurgt
  • sinon.

39
Interface des sockets
  • Partie III Mode connecté

40
Communication en mode connecté
  • Dissymétrie lors de la connexion
  • Le serveur attend
  • Le client demande une connexion
  • Symétrie dans léchange dinformations
  • Le client ou le serveur peut
  • envoyer/recevoir des informations
  • Demander la fin de la connexion
  • Echange dun flot continu de caractères
  • Pas de structure en message

41
Connexion
  • connect (socket, adr-destination, longueur-adr)
  • Côté client
  • Pour établir une connexion TCP avec le processus
    serveur
  • Ladresse IP et le numéro de port sont spécifiés
  • Appel bloquant jusquà la fin de la prise en
    compte de la connexion par le serveur
  • (configuration par défaut, peut-être modifiée)

42
Création dune file dattente
  • listen(int socket, int lgr-file)
  • Côté serveur
  • crée une file d'attente pour les demandes de
    connexion
  • Place la socket en mode connexion
  • lgr-file indique le nombre maximal de demandes de
    connexion autorisées dans la file (5, 10 ou 20)
  • file d'attente exploitée par la primitive accept.

43
Acceptation dune connexion
  • newsock accept (socket, adresse, lgr-adresse)
  • côté serveur
  • prise en compte d'une demande de connexion
    entrante sur une socket de connexion.
  • primitive bloquante
  • newsock nouveau descripteur de socket sur
    laquelle s'effectuera léchange de données
  • adresse adresse du client.
  • Le processus peut traiter lui-même la nouvelle
    connexion, puis revenir à accept, ou bien se
    répliquer (fork() en UNIX) pour la traiter, le
    processus père étant toujours à l'écoute.

44
Lecture-Ecriture TCP
  • write(socket, tampon, longueur ) read(socket,
    tampon, longueur)
  • Envoie/reçoit des données sur une connexion TCP
  • Plus besoin de ladresse émetteur/destinataire !
  • send(socket, tampon, longueur, drapeaux)
    recv(socket, tampon, longueur, drapeaux)
  • Idem, avec drapeaux permettant l'utilisation
    d'options

45
Exemple de dialogue (connecté)
  • Sur le serveur
  • socket()
  • bind() nommage
  • listen()
  • accept()
  • read write
  • Sur le client
  • Créer une socket (socket)
  • Connecter la socket au serveur (connect)
  • Tant que pas fini
  • envoyer une requête (write)
  • lire la réponse (read)
  • traiter la réponse
  • Fermer la socket (close)

46
Telnetun client universel
  • gttelnet stargate.ist.ga
  • User felix
  • Password
  • gttelnet stargate.ist.ga 110
  • OK Qpopper (version 4.0.4) at stargate starting.
  • USER felixp
  • OK Password required for felixp.
  • PASS Devine!!!
  • OK felixp has 3 visible messages (0 hidden) in
    4235 octets.
  • STAT
  • OK 3 4235

47
  • LIST
  • OK 3 visible messages (4235 octets)
  • 1 1508
  • 2 1464
  • 3 1263
  • .
  • RETR 3
  • OK 1263 octets
  • Return-Path ltfelixp_at_ist.gagt
  • Received from komet (172.16.94.87)
  • by stargate.ist.ga (8.12.3/8.12.3) with
    SMTP id g4S9hEpN004334
  • for ltfelixp_at_ist.gagt Tue, 28 May 2002
    104320 0100
  • Message-ID lt008201c2062b4c266420575e10ac_at_ist.ga
    gt

48
  • Reply-To "Patrick FELIX" ltfelix_at_labri.frgt
  • From "Patrick FELIX" ltfelixp_at_ist.gagt
  • To ltfelixp_at_ist.gagt
  • Subject un message
  • Date Tue, 28 May 2002 103729 0100
  • /
  • X-Mailer Microsoft Outlook Express
    6.00.2600.0000
  • C'est bientot l'heure, alors "Bonne appetit " et
    tout a l'heure.
  • Patrick FELIX.
  • --------------------------------------------------
    ------------------------
  • LaBRI - UniversitÚ Bordeaux I 351 crs de la
    LibÚration - F-33405 TALENCE
  • Tel. 33 5 56 84 69 15 - Fax. 33 5 56 84 66 69
    Mél. felix_at_labri.fr
  • --------------------------------------------------
    ------------------------
  • IUT Bordeaux 1 - DÚpartement Informatique
  • Domaine Universitaire - F-33405 TALENCE
  • Tel. 33 5 56 84 58 19 - Fax. 33 5 56 84 58 86
  • Mél felix_at_info.iuta.u-bordeaux.fr
  • --------------------------------------------------
    ------------------------
  • .

49
Source SocketMode connecté
50
  • BigbenServeur
  • int main(int argc, char argv)
  • int fdTravail, port
  • ...
  • / initialisation du service /
  • portatoi(argv1)
  • fdinit_service(port)
  • / gestion des connexions de clients /
  • while(1)
  • / acceptation d'une connexion /
  • fdTravailaccept(fd,NULL,NULL)
  • if (fdTravaillt0) FATAL("accept")
  • if (fork()0) / fils gestion du
    dialogue avec client /
  • close(fd)
  • travail_fils(fdTravail)
  • close(fdTravail)
  • exit(0)

51
  • int init_service(int port)
  • int fdPort
  • struct sockaddr_in addr_serveur
  • socklen_t lg_addr_serveur sizeof
    addr_serveur
  • / creation de la prise /
  • fdPortsocket(AF_INET,SOCK_STREAM,0)
  • if (fdPortlt0) FATAL("socket")
  • / nommage de la prise /
  • addr_serveur.sin_family AF_INET
  • addr_serveur.sin_addr.s_addr INADDR_ANY
  • addr_serveur.sin_port htons(port)
  • if (bind(fdPort,(struct sockaddr
    )addr_serveur, lg_addr_serveur) lt 0)
  • FATAL("bind")
  • / Recuperation du nom de la prise /
  • if (getsockname(fdPort,(struct sockaddr
    )addr_serveur, lg_addr_serveur) lt 0)
  • FATAL("getsockname")
  • / Le serveur est a l'ecoute /

52
  • void travail_fils(int fdTravail)
  • long horloge
  • struct tm temps
  • char tampon2
  • int h,m,s
  • / preparation de la reponse /
  • time(horloge)
  • tempslocaltime(horloge)
  • h temps-gttm_hour
  • m temps-gttm_min
  • s temps-gttm_sec
  • / envoi de la reponse /
  • sprintf(tampon, "02d", h)
  • write(fdTravail,tampon,2)
  • sprintf(tampon, "02d", m)
  • write(fdTravail,tampon,2)

53
  • BigbenClient
  • ...
  • int main(int argc, char argv)
  • int port
  • char hostname
  • ...
  • / ouverture de la connexion /
  • hostnameargv1
  • portatoi(argv2)
  • fdconnexion(hostname,port)
  • / travail /
  • travail(fd)

54
  • int connexion(char hostname, int port)
  • int fdPort
  • struct sockaddr_in addr_serveur
  • socklen_t lg_addr_serveur sizeof
    addr_serveur
  • struct hostent serveur
  • / creation de la prise /
  • fdPortsocket(AF_INET,SOCK_STREAM,0)
  • if (fdPortlt0) FATAL("socket")
  • / recherche de la machine serveur /
  • serveur gethostbyname(hostname)
  • if (serveur NULL) FATAL("gethostbyname")
  • / remplissage adresse socket du serveur /
  • addr_serveur.sin_family AF_INET
  • addr_serveur.sin_port htons(port)
  • addr_serveur.sin_addr (struct in_addr
    ) serveur-gth_addr

55
  • void travail(int fd)
  • char h3,m3,s3
  • / recuperation reponse du serveur /
  • if (read(fd,h,2) ! 2) FATAL("read h")
  • h2'\0'
  • if (read(fd,m,2) ! 2) FATAL("read m")
  • m2'\0'
  • if (read(fd,s,2) ! 2) FATAL("read s")
  • s2'\0'
  • printf("Il est sss sur le
    serveur\n",h,m,s)

56
Exercice 1 BigBen Expérimentation avec Telnet
  • Copier sur votre compte le contenu du
    répertoire  /seanceTCP.
  • Les sources TCP BigBen vus en cours vous sont
    fournis dans seanceTCP/BigBen.
  • Exécutez un serveur BigBen sur une machine, et
    connectez vous à ce serveur grâce
  • -         au client fourni,
  • -         à la commande telnet machine_serveur
    num_port.

57
Exercice 2 POP3
  • Se connecter au service POP3 telnet pop.ist.ga
    110.
  • Il faut ensuite donner une ligne de commande,
    terminée par CR/LF (en pratique, un retour
    chariot suffit).
  • Quelques commandes du protocole POP3
  • Commande Fonction
  • USER utilisateur Nom du compte de l'utilisateur
  • PASS mot de passe Mot de passe
  • STAT Nombre de messages et leur taille totale
  • RETR n Récupère le message numéro n
  • DELE n Supprime le message numéro n
  • LAST Numéro du dernier message auquel on a
    accédé
  • LIST n Taille du n-ième message
  • LIST Taille de tous les messages
  • RSET Annule la suppression de tous les
    messages.
  • TOP n k Affiche entêtes et k lignes du messages
    n
  • NOOP Ne fait rien
  • QUIT Temine la session POP3

58
Exercice 2 POP3 (suite)
  • 1.Exécutez cette application et familiarisez vous
    avec les sources
  • 2.Rajoutez un menu qui permet de réaliser les
    fonctionnalités suivantes
  • (a)      Affichez le premier message.
  • (b)     Affichez uniquement le nom de
    l'expéditeur et le sujet du premier message.
  • (c)      Affichez le nom de l'expéditeur et le
    sujet de tous les messages.

59
TP
  • Serveur de calcul (UDP)
  • On demande au serveur des requêtes du style
  • Opération opérande1 opérande2 (exemple DIV 12
    3)
  • Et, si cela se passe sans erreur, le serveur
    répond par
  • OK résultat (exemple OK 4)
  • Dans les autres cas
  • PB message derreur (exemple PB division par 0)
  • Client POP Implémenter
  • des extensions des fonctionnalités vues en TD,
  • de nouvelles fonctionnalités.
  • Jeu de bataille navale en réseau (socket TCP)
  • Jeu Awale en réseau (socket TCP)

60
RFC
  • Les protocoles classiques sont normalisés et
    décrits par des documents appelés RFC (Requests
    For Comments) qui sont accessibles très
    facilement sur le Web. Ceux pour finger (rfc742)
    et POP3 (rfc1939) vous sont fournis dans
    seanceTCP.

61
Source SocketMode connectéAvec fichier de haut
niveau
62
  • BigbenServeurFichier de haut niveau
  • / Taille maximale d'une ligne envoyee par
    serveur /
  • define TAILLEMAXLIGNE 8
  • int main(int argc, char argv)
  • int fdTravail, port
  • FILE out
  • ...
  • / gestion des connexions de clients /
  • while(1)
  • / acceptation d'une connexion /
  • fdTravailaccept(fd,NULL,NULL)
  • if (fdTravaillt0)
  • FATAL("accept")
  • if (fork()0) / fils gestion du
    dialogue avec client /
  • close(fd)
  • / Ouverture de fichiers de haut niveau
    (cf. polycop systeme) /
  • out fdopen(fdTravail,"w")

63
  • void ecrireligne(FILE out, char ligne)
  • fprintf(out,"s\n",ligne)
  • fflush(out)
  • void travail_fils(FILE out)
  • long horloge
  • struct tm temps
  • char tamponTAILLEMAXLIGNE
  • int h,m,s
  • / preparation de la reponse /
  • time(horloge)
  • tempslocaltime(horloge)
  • h temps-gttm_hour
  • m temps-gttm_min
  • s temps-gttm_sec

64
  • BigbenClientFichier de haut niveau
  • / Taille maximale d'une ligne recue du serveur
    /
  • define TAILLEMAXLIGNE 8
  • int main(int argc, char argv)
  • int port
  • char hostname
  • FILE in
  • ...
  • / ouverture de la connexion /
  • hostnameargv1
  • portatoi(argv2)
  • fdconnexion(hostname,port)
  • / Ouverture de fichiers de haut niveau (cf.
    polycop systeme) /
  • in fdopen(fd,"r")

65
  • char lireligne(FILE in, char ligne)
  • char p
  • p fgets(ligne,TAILLEMAXLIGNE,in)
  • / la lecture sarrête après \n /
  • return p
  • void travail(FILE in)
  • char hTAILLEMAXLIGNE,mTAILLEMAXLIGNE,sTAILL
    EMAXLIGNE
  • / recuperation reponse du serveur /
  • lireligne(in,h)
  • lireligne(in,m)
  • lireligne(in,s)
  • printf("Il est sss sur le
    serveur\n",h,m,s)

Affichage 13 15 25
66
Source SocketMode connectéScénario avec longs
messages
67
  • COTE SERVEUR
  • ------------
  • void travail_fils(int fd)
  • char tampon4096
  • int rep, env
  • / reception de la chaine /
  • repread(fd, tampon, 4096)
  • printf("recu d\n",rep)
  • / envoi de la chaine recue /
  • envwrite(fd, tampon, rep)
  • printf("envoye d\n\n",env)
  • close(fd)

COTE CLIENT ----------- void travail(int fd)
char tampon4096 int rep, env, i /
envoi de la chaine / for (i0 ilt4096 i)
tamponi'1' envwrite(fd, tampon, 4096)
printf("envoye d\n",env) memset(tampon, 0,
4096) / reception de la chaine /
repread(fd, tampon, 4096) printf("recu
d\n",rep)
tubagt serveur 3000 helicongt client tuba
3000 Le serveur ecoute le port 3000 envoye
4096 recu 4096 envoye 4096 recu
4096
68
tubagt serveur 3000 helicongt client tuba
3000 Le serveur ecoute le port 3000 envoye
4096 recu 2896 envoye 2896 recu
2896
tubagt serveur 3000 helicongt client tuba
3000 Le serveur ecoute le port 3000 envoye
4096 recu 2896 envoye 2896 recu
1448
Write a Comment
User Comments (0)
About PowerShow.com