Universit du Littoral Cte dOpale - PowerPoint PPT Presentation

1 / 89
About This Presentation
Title:

Universit du Littoral Cte dOpale

Description:

Sockets : interface (point de communication) client/serveur utilis e ... address (32 bits, exemple : 193.49.192.193) Pas de constructeur. 3 m thodes statiques ... – PowerPoint PPT presentation

Number of Views:73
Avg rating:3.0/5.0
Slides: 90
Provided by: Fant56
Category:

less

Transcript and Presenter's Notes

Title: Universit du Littoral Cte dOpale


1
Université du Littoral - Côte dOpale
Les sockets
L. Deruelle N. Melab deruelle_at_lil.univ-littoral.
fr
2
Plan
  • Le modèle
  • Sockets java
  • Sockets C-UNIX BSD 4.X

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

4
Sockets/OSI
Protocole Applicatif
Application serveur
Application cliente
API Socket
API Socket
UDP
TCP
UDP
TCP
IP
IP
Physique
Physique
5
Rôle des sockets
  • Connexion à une machine distante
  • Envoi/Réception de données
  • Fermeture dune connexion
  • Attachement à un port
  • Acceptation dune demande de connexion à un port
    local
  • Attente de demandes de connexion

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

7
Désignation des ports
  • Port numéro allant de 1 à 65535
  • Les ports 1 à 1023 sont réservés aux services
    courants finger, ftp, http (80), SMTP (25),
    etc.
  • Fichier dassignation de ports /etc/services

8
Adresse internet
  • Connexion réseau
  • Adresse internet de la machine
  • Numéro 193.49.192.193
  • Désignation par des noms symboliques
  • Association de noms symboliques aux adresses
    numériques
  • Domain Name System (ou DNS)
  • Exemple lil.univ-littoral.fr 193.49.192.193

9
Sockets java
10
Gestion des ports (adresses) en Java
  • Classe InetAdress
  • Dans java.net
  • Champs
  • hostName (exemple lil.univ-littoral.fr)
  • address (32 bits, exemple 193.49.192.193)
  • Pas de constructeur
  • 3 méthodes statiques
  • public static InetAddress InetAddress
    .getByName(String hote)
  • public static InetAddress InetAddress
    .getAllByName(String hote)
  • public static InetAddress InetAddress
    .getLocalHost()
  • Classes Socket, SocketServer et SocketImpl
  • getInetAddress()

11
Gestion des sockets
  • Taxinomie
  • Sockets TCP
  • Point à point Socket, ServerSocket, SocketImlp
  • Sockets UDP
  • Point à point DatagramSocket
  • Multi-point MultiCastSocket
  • Dans java.net

12
Sockets TCP
  • Classe Socket
  • Connexion à une machine distante
  • Envoi/Réception de données
  • Fermeture dune connexion
  • Classe ServerSocket
  • Attachement à un port
  • Acceptation dune demande de connexion à un port
    local
  • Attente de demandes de connexion

13
Classe Socket (1)
  • Constructeurs
  • public Socket(String hote, int port) throws
    UnknownHostException, IOException
  • public Socket(InetAddress hote, int port) throws
    IOException
  • public Socket(String hote, int port, InetAddress
    adrLocale, int portLocal) throws IOException
  • public Socket(InetAddress hote, int port,
    InetAddress adrLocale, int portLocal) throws
    IOException
  • public Socket()
  • protected Socket(SocketImpl impl)

14
Classe Socket (2)
  • Information
  • public InetAddress getInetAddress()
  • public int getPort()
  • public int getLocalPort()
  • public InetAddress getLocalAddress()
  • Envoi/Réception de données
  • public InputStream getInputStream() throws
    IOException
  • public OutputStream getOutputStream() throws
    IOException
  • Fermeture
  • public void close() throws IOException

15
Classe Socket (3)
  • Options
  • TCP_NODELAY
  • Donnée expédiée aussitôt que possible quelque
    soit leur taille
  • Méthodes setTcpNoDelay (boolean valid) et
    getTcpNoDelay() (true) 1
  • SO_LINGER
  • Attente ou non avant de fermer une socket au cas
    où il reste des données à envoyer
  • Méthodes setSoLinger (boolean valid, int
    secondes) et getSoLinger() 128s

16
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
  • 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

17
Classe ServerSocket (1)
  • Rôle standardiste
  • 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

18
Classe ServerSocket (2)
  • Constructeurs
  • public ServerSocket(int port) throws IOException,
    BindException
  • public ServerSocket(int port, int taillefile)
    throws IOException, BindException
  • public ServerSocket(int port, int taillefile,
    InetAddress adresseAttache) throws IOException
  • protected ServerSocket()
  • Prise en compte et clôture dune connexion
  • public Socket accept() throws IOException
  • public void close() throws IOException

19
Classe ServerSocket (3)
  • Information
  • public InetAddress getInetAddress()
  • public int getLocalPort()
  • Options
  • SO_TIMEOUT
  • Doit être initialisé avant accept
  • Méthodes setSoTimeout (int ms) et getSoTimeout()

20
Protocoles TCP et UDP
  • 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
  • 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

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

22
Classe DatagramPacket (1)
  • Constructeurs
  • DatagramPacket destiné à la réception de données
  • public DatagramPacket(byte tampon, int
    longueur)
  • Réception des données dans tampon
  • Longueur maximale 65 507 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

23
Classe DatagramPacket (2)
  • Information (suite)
  • public byte getData()
  • Tableau doctets du datagramme
  • Caractères ASCII String snew
    String(dp.getData(), 0, 0, dp.getLength())
  • Caractères non ASCII ByteArrayInputStream bnew
    ByteArrayInputStream(dp.getData(), 0, 0,
    dp.getLength())
  • public InetAddress getLength()
  • Taille en octets du datagramme

24
Classe DatagramSocket (1)
  • Constructeurs
  • DatagramSocket utilisé par le client
  • public DatagramSocket() throws SocketException
  • Ports de destination et de partance spécifiés
    dans le datagramme (objet DatagramPacket)
  • DatagramSocket utilisé par le serveur
  • public DatagramSocket(int port) throws
    SocketException
  • Remarque les ports TCP et leurs équivalents UDP
    ne sont pas liés i.e. un même numéro de port peut
    être associé à la fois à une socket TCP et une
    socket UDP sans provoquer aucun problème de
    conflit
  • DatagramSocket utilisé par le serveur
    multi-adresse
  • public DatagramSocket(int port, InetAdress ia)
    throws SocketException

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

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

27
Principe
Routeur multi-point
28
Principe
Routeur multi-point
29
Principe
Routeur multi-point
30
Principe
Routeur multi-point
31
Adresses et groupes multi-points (1)
  • Adresse multi-points
  • Référence un groupe dhôtes (groupe multi-points)
  • Rangée dans la classe D
  • Groupe multi-points
  • Plusieurs hôtes Internet partageant la même
    adresse multi-points
  • Libre adhésion ou départ au/du groupe
  • lnternet Assigned Number Autority (IANA) est
    responsable de laffectation des adresses
    mutli-points
  • Il en existe 80
  • Exemple AUDIONEWS.MCAST.NET --gt 224.0.1.7 -
    Actualité audio transmise en multi-points

32
Adresses et groupes multi-points (2)
  • Liste exhaustive dans http//www.iana.org/assign
    ments/multicast-addresses
  • Il existe des routeurs multi-points (mrouteurs)
  • Datagramme multi-points

En-tête IP
En-tête UDP
Charge utile
TTL
...
2 octets
2 octets
2 octets
2 octets
4 octets
4 octets
1 octet
Contrôle pour fiabilité
Longueur
Port destinataire
Port expéditeur
Hôte destinataire
Hôte expéditeur
33
Time-To-Live (TTL)
  • Définition
  • Portée dun datagramme i.e. nombre de routeurs
    maximum par lesquels un datagramme transite avant
    sa suppression
  • Réseau local TTL1, Région TTL16, Monde
    entier TTL127
  • Utilisation
  • TTL décrémentée à chaque passage dans un routeur
  • TTL0 datagramme supprimé

34
Mise en uvre des sockets multi-point
  • Classe java.net.MulticastSocket
  • Dérivée de la classe java.net.DatagramSocket
  • Constructeurs
  • public MulticastSocket() throws SocketException
  • Port assigné par le système
  • getLocalPort() renvoie le numéro du port
  • public MulticastSocket(int port) throws
    SocketException

35
Communication avec un groupe multi-point (1)
  • Opérations possibles
  • Adhésion à un groupe
  • Echanger (Emettre/Recevoir) des données avec les
    membres dun groupe
  • Quitter un groupe
  • Méthodes
  • public void joinGroup(InetAddress adrmultipt)
    throws SocketException
  • public void leaveGroup(InetAddress adrmultipt)
    throws SocketException

36
Communication avec un groupe multi-point (2)
  • Public synchronized void send(DatagramPacket dp,
    byte ttl) throws IOException, SocketException
  • public void setInterface(InetAddress interface)
    throws SocketException
  • public InetAddress getInterface() throws
    SocketException
  • Non autorisé avec les applets!

37
Exemple de gestion de groupes
// join a Multicast group and send the group
salutations ... String msg "Hello"
InetAddress group InetAddress.getByName("228.5.
6.7") MulticastSocket s new
MulticastSocket(6789) s.joinGroup(group)
DatagramPacket hi new DatagramPacket(msg.getByt
es(),msg.length(),group, 6789) s.send(hi) //
get their responses! byte buf new
byte1000 DatagramPacket recv new
DatagramPacket(buf, buf.length)
s.receive(recv) // OK, I'm done talking -
leave the group... s.leaveGroup(group)
38
Sockets en C/UNIX
39
Sockets abstraction (1)
  • Association dun descripteur (au niveau système)
  • à une socket (idem fichier)
  • Le concepteur dapplication utilise ce
    descripteur
  • pour référencer la communication
    client/serveur
  • sous-jacente
  • Une structure de données socket est créée à
  • louverture dune socket

40
Sockets abstraction (2)
Family PF_INET
Table de descripteurs de fichiers
Service SOCK_STREAM
Local IP 111.22.3.4
Remote IP 123.45.6.78
Local Port 2249
Remote Port 3726
Table de descripteurs dun processus
Structure Socket
  • Structure initialement vide
  • Remplissage par les primitives sur sockets

41
Caractéristiques
42
Domaine de communication
  • Domaine UNIX
  • Notation PF_UNIX
  • Communication intra-machine (mémoire centrale)
  • Pas de passage par le réseau
  • Domaine Internet
  • Notation PF_INET
  • Communication intra-machine et réseau

43
Types de communication (1)
  • Datagram
  • Notation SOCK_DGRAM
  • Pas de circuit virtuel entre les 2 sockets
    chaque paquet
  • est envoyé indépendamment des autres
  • Non fiable, non séquencé mais préservation des
  • frontières des paquets
  • Circuit virtuel
  • Notation SOCK_STREAM
  • Connexion fixe comme un pipe UNIX
  • Fiable, séquence préservée, pas de doublons

44
Types de communication (2)
  • Pas de préservation des frontières des paquets
  • Exemple le processus émet par 2 octets, le
    récepteur
  • reçoit par 3 octets
  • Raw
  • Notation SOCK_RAW
  • Utilisation directe dIP (réservé à ROOT)
  • Sequenced packet
  • Notation SOCK_SEQPACKET
  • Avantages des circuits virtuels préservation
    des
  • frontières des paquets

45
Adressage des sockets
  • 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.)
  • Format général
  • struct sockaddr
  • short sa_family / famille dadresses
    (AF_INET, AF_UNIX,etc) /
  • char sa_data14 / adresse effective /

46
Format des adresses du domaine UNIX
  • Où est-elle mise ?
  • Entrée dans le SGF créée par bind() (type s)
  • Ex /home/deruelle/ma_socket
  • Format dans ltsys/un.hgt
  • struct sockadd_un
  • short sun_family / AF_UNIX ou AF_UNSPEC/
  • char sun_path108 / chemin /

47
Format des adresses du domaine Internet (1)
  • Format
  • Adresse internet de la machine son numéro de
    port
  • Format dans ltnetinet/in.hgt
  • 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 /

48
Format des adresses du domaine Internet (2)
  • struct sockaddr_in
  • short sin_family / AF_INET ou AF_UNSPEC
    /
  • u_short sin_port / Port en format réseau
    /
  • struct in_addr sin_addr / Adresse
    internet de la machine
  • en format réseau
    (sin_addr.s_addr est u_long) /
  • char sin_zero8 / Non utilisé, doit
    être mis à 0 /
  • Remarque
  • htons() (Host To Network Short) permet de
    transformer
  • une représentation machine en format
    réseau.

49
Construction des adresses internet
  • Il sagit dinstancier sin_port et sin_addr
  • Trois utilitaires
  • A - Socket locale
  • B - Socket distante dont on connaît
  • le nom de la machine
  • le numéro de port
  • C - Socket distante dont on connaît
  • le nom de la machine
  • le nom dun service bien connu et son protocole

50
Adresse dans le cas A
  • void mySelfAddress (struct sockaddr_in o_a)
  • o_a-gtsin_family AF_INET
  • o_a-gtsin_port htons(0) / Allocation
    dynamique du port par bind() /
  • o_a-gtsin_addr.s_addr INADDR_ANY /
    Adresse joker /

INADDR_ANY constante signifiant que le serveur
est accessible de partout.
51
Adresse dans le cas B
  • void peerAddress (struct sockaddr_in o_pa,
  • const
    char rhost, int port)
  • struct hostent h
  • o_pa-gtsin_family AF_INET
  • o_pa-gtsin_port port
  • if ((hgethostname(rhost)) 0)
  • fprintf(stderr, s machine
    inconnue\n,rhost)
  • exit(1)
  • bcopy((char )h-gth_addr,
  • (char )o_pa-gtsin_addr.s_addr,
  • h-gth_length)

52
Adresse dans le cas C
  • void wellKnownAddress (struct sockaddr_in
    o_wa,
  • const char rhost,
    const char service,
  • const char proto)
  • struct servtent serv getservbyname
    (service, proto)
  • if ((serv 0)
  • fprintf(stderr, s/s
    service/protocole inconnu\n,
  • service,proto)
  • exit(1)
  • peerAddress(o_wa, rhost, serv-gts_port)

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

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

55
Primitives de service (3)
  • getnetbyname spécifie un nom de réseau et
    retourne une structure netent contenant les
    caractéristiques du réseau (/etc/networks)
  • getnetbyaddr spécifie une adresse réseau et
    retourne une structure netent

56
Structure NetEnt (include ltnetdb.hgt)
  • struct netent
  • char n_name / Nom officiel du reseau /
  • char n_aliases / Liste d'alias /
  • int n_addrtype / Type d'adresse reseau /
  • unsigned long int n_net
  • / Adresse du reseau /
  • Les membres de la structures netent sont
  • n_name Le nom officiel du reseau.
  • n_aliasesUne liste, terminee par zero,
    d'alternatives au nom du reseau.
  • n_addrtypeLe 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.

57
Primitives de service (4)
  • getprotobyname et getprotobynumber
  • Dans la base de données des protocoles
    disponibles sur la machine, chaque protocole a un
    nom, des alias et un numéro de protocole
    officiels
  • getprotobyname permet 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

58
Structure protoent
  • include ltnetdb.hgt
  • struct protoent
  • char p_name / Nom officiel du protocole /
  • char p_aliases / Liste d'alias /
  • int p_proto / Numéro du protocole /
  • Les membres de la structure protoent sont
  • p_name Le nom officiel du protocole.
  • p_aliasesUne liste, terminée par zéro, d'autres
    noms pour le protocole.
  • p_protoLe numéro du protocole.

59
Primitives de service (5)
  • 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)

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

61
Primitives de service (7)
  • htonl host to network long convertit une
    valeur sur 32 bits de la représentation machine
    vers la représentation réseau
  • htons host to network short convertit une
    valeur sur 16 bits de la représentation machine
    vers la représentation réseau
  • ntohl network to host long convertit une
    valeur sur 32 bits de la représentation réseau
    vers la représentation machine
  • ntohs network to host short convertit une
    valeur sur 16 bits de la représentation réseau
    vers la représentation machine

62
Utilitaires bcopy et bzero
  • bcopy copie le contenu dun buffer dans un autre
  • bzero met à 0 le contenu dun buffer

bcopy(const char source, char dest, int
length) length taille des 2
buffers bzero(char zone, int length)
length taille du buffer zone

63
Sockets options (1)
  • Une application peut contrôler certains aspects
    du fonctionnement des sockets
  • Configuration des temporisations
  • Allocation de la mémoire tampon
  • etc.
  • getsockopt permet à une application 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)

64
Sockets options (2)
65
Sockets C-UNIX BSD 4.X
66
Sockets primitives
  • Appels système permettant détablir un lien de
    communication sur un réseau
  • Structurent une application
  • en mode client
  • en mode serveur
  • Permettent déchanger des données entre
  • applications
  • Bibliothèques nécessaires
  • sys/types.h
  • sys/socket.h

67
La primitive socket
  • Point dencrage qui permet à lapplication
    dobtenir
  • un lien de communication vers la suite de
    protocole
  • qui servira déchange
  • Définit le mode de communication utilisé
    (connecté ou non-connecté)
  • include ltsys/types.hgt
  • include ltsys/socket.hgt
  • int socket(int domain, int type, int protocol)
  • Exemple s socket(AF_INET, SOCK_DGGRAM, 0)

0 protocole par défaut
68
La primitive close
  • Ferme une socket et restitue les ressources
  • associées au système
  • La socket se comporte comme un descripteur de
    fichier
  • close (int s)

69
La primitive bind
  • Associe une adresse à une socket

bind(int s, struct sockaddr i_saddr, int
i_saddrlen)
  • s.i_saddrlen est la taille de la structure
    i_saddr
  • effectivement passée

70
La primitive connect
  • Permet dindiquer avec quel partenaire unique
    (socket éloignée) les échanges auront lieu

connect(int s, struct sockaddr i_peer, int
peerlen)
  • i_peer adresse de la socket éloignée
  • peerlen taille en octets de la structure
    sockaddr
  • Utilisée souvent avec SOCK_STREAM par un
  • serveur
  • Le client se connecte avec la primitive accept
    (exécutée pas le serveur)

71
La primitive listen
  • Permet à un serveur dentrer dans un mode
    découte de communication (il est connectable
    par un client)
  • Le processus est bloqué jusquà larrivée dune
    communication entrante

listen(int s, int n)
  • n nombre possible de connexions (clients) en
  • attente

72
La primitive accept (1)
  • Caractéristiques
  • Elle permet à un serveur de recevoir la
    communication entrante (client)
  • Elle crée une nouvelle socket et retourne le
    descripteur associé à 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

73
La primitive accept (2)
int accept(int s, struct sockaddr cli_addr, int
clilen) cli_addr adresse de la socket
côté client clilen taille de la structure
sockaddr
74
Les primitives read et write
  • Lorsque la communication est établie, client et
    serveur échangent des données afin dobtenir
    (client) et transmettre (serveur) le service
    désiré
  • En mode connecté, clients et serveurs utilisent
    read et write en mode non-connecté, ils
    utilisent les primitives recvfrom et sendto.

75
La primitive read
int read(int s, char buffer, int
bufferlen) buffer pointeur sur un buffer
de communication bufferlen nombre de
caractères à lire à partir du buffer retour
nombre de caractères effectivement lus
  • Primitive blocante
  • Initialisation du buffer nécessaire avec bzero


76
La primitive write
int write(int s, char buffer, int bufferlen)
buffer pointeur sur un buffer de
communication bufferlen nombre de
caractères à lire à partir du buffer retour
nombre de caractères effectivement lus
  • Initialisation du buffer nécessaire avec bzero


77
La primitive recvfrom
int recvfrom(int s, char buffer, int bufferlen,
int flag, struct sockaddr
from, int fromlen) buffer pointeur sur
un buffer de communication bufferlen nombre
de caractères à lire à partir du buffer
retour nombre de caractères lus, -1 si erreur
from adresse de la socket côté client
fromlen pointeur sur la taille de la structure
flag option souvent mise à 0
78
La primitive sendto
int sendto(int s, char buffer, int bufferlen,
int flag, struct sockaddr
from, int fromlen) buffer pointeur sur
un buffer de communication bufferlen taille
du buffer en octets retour nombre de
caractères envoyés, -1 si erreur from
adresse de la socket de destination fromlen
taille de la structure flag option souvent
mise à 0

79
Sockets mode connecté
SERVEUR
CLIENT
socket
En mode connecté il y a établissement
(listen,connect, accept) puis libération
(close) dune connexion entre le cleint et le
serveur.
bind
listen
socket
connexion
accept
connect
requête
read
write
réponse
write
read
close
close
80
Squelette du serveur (1)
/ Bibliothèques / include ltstdio.hgt /
Structures de données nécessaires aux appels
système / include ltsys/types.hgt / Primitives
de manipulation de sockets / include
ltsys/socket.hgt / Adresses du domaine internet
/ include ltnetinet/in.hgt / Traitement des
erreurs sur sockets / void error(char msg)
perror(msg) exit(1)
81
Squelette du serveur (2)
int main(int argc, char argv) int sockfd,
newsockfd, portno, clilen char buffer256
struct sockaddr_in serv_addr, cli_addr int n
if (argclt2) fprintf(stderr, Usage s
port\n, argv0) exit(1)
82
Squelette du serveur (3)
/ Création de la socket découte du serveur
(domaine internet, type de communication
circuit virtuel, protocole TCP) / sockfd
socket(AF_INET, SOCK_STREAM, 0) if (sockfdlt0)
error(Error opening socket) / Construction
de ladresse de la socket / bzero((char )
serv_addr, sizeof(serv_addr)) portno
atoi(argv1) serv_addr.sin_family
AF_INET serv_addr.sin_addr.s_addr
INADDR_ANY serv_addr.sin_port htons(0)
83
Squelette du serveur (4)
/ Liaison de la socket et son adresse / if
(bind(sockfd, (struct sockaddr ) serv_addr,
sizeof(serv_addr)) lt0) 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 (newsockfdlt0) error(Error on
accept)
84
Squelette du serveur (5)
/ Lecture du contenu du buffer associé à la
socket (message du client) / bzero(buffer,256) n
read(newsockfd, buffer,255) if (nlt0)
error(Error reading from socket) printf(Her
e 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 (nlt0) error(Error writing
to socket) / Fermeture des sockets
/ close(newsockfd) close(sockfd)
85
Squelette du client (1)
/ Bibliothèques / include ltstdio.hgt /
Structures de données nécessaires aux appels
système / include ltsys/types.hgt / Primitives
de manipulation de sockets / include
ltsys/socket.hgt / Adresses du domaine internet
/ include ltnetinet/in.hgt / Primitives de
gestion de noms, ... / include ltnetdb.hgt /
Traitement des erreurs sur sockets / void
error(char msg) perror(msg) exit(0)
86
Squelette du client (2)
int main(int argc, char argv) int sockfd,
portno, n struct sockaddr_in serv_addr
struct hostent server char buffer256
if (argclt3) fprintf(stderr, Usage s
hostname port\n, argv0) exit(0)
87
Squelette du client (3)
portno atoi(argv2) / 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
(sockfdlt0) error(Error opening socket) /
Construction de ladresse de la socket / server
gethostname(argv1) if (server NULL)
fprintf(stderr, Error no such host)
exit(0)
88
Squelette du client (4)
bzero((char ) serv_addr, sizeof(serv_addr)) ser
v_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))
lt0) 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)
89
Squelette du client (5)
write(sockfd, buffer,strlen(buffer)) if (nlt0)
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 (nlt0)
error(Error reading from socket) printf(Her
e is the message s\n, buffer) / Fermeture
de la socket / close(sockfd)
Write a Comment
User Comments (0)
About PowerShow.com