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
2Plan
- Le modèle
- Sockets java
- Sockets C-UNIX BSD 4.X
3Le 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)
4Sockets/OSI
Protocole Applicatif
Application serveur
Application cliente
API Socket
API Socket
UDP
TCP
UDP
TCP
IP
IP
Physique
Physique
5Rô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
6Notion 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)
7Dé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
8Adresse 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
9Sockets java
10Gestion 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()
11Gestion des sockets
- Taxinomie
- Sockets TCP
- Point à point Socket, ServerSocket, SocketImlp
- Sockets UDP
- Point à point DatagramSocket
- Multi-point MultiCastSocket
- Dans java.net
12Sockets 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
13Classe 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)
14Classe 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
15Classe 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
16Classe 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
17Classe 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
18Classe 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
19Classe ServerSocket (3)
- Information
- public InetAddress getInetAddress()
- public int getLocalPort()
- Options
- SO_TIMEOUT
- Doit être initialisé avant accept
- Méthodes setSoTimeout (int ms) et getSoTimeout()
20Protocoles 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
21Sockets 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)
22Classe 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
23Classe 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
24Classe 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
25Classe 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
26Sockets 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.
27Principe
Routeur multi-point
28Principe
Routeur multi-point
29Principe
Routeur multi-point
30Principe
Routeur multi-point
31Adresses 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
32Adresses 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
33Time-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é
34Mise 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
35Communication 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
36Communication 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!
37Exemple 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)
38Sockets en C/UNIX
39Sockets 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
40Sockets 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
41Caractéristiques
42Domaine 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
43Types 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
44Types 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
45Adressage 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 /
-
46Format 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 /
-
47Format 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 / -
48Format 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.
49Construction 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
50Adresse 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.
51Adresse 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)
-
52Adresse 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)
-
53Primitives 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
54Primitives 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
55Primitives 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
56Structure 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.
57Primitives 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
58Structure 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.
59Primitives 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)
60Primitives 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
61Primitives 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
62Utilitaires 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
63Sockets 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)
64Sockets options (2)
65Sockets C-UNIX BSD 4.X
66Sockets 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
67La 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
68La 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)
69La 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
70La 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)
71La 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
72La 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
73La 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
74Les 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.
75La 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
76La 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
77La 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
78La 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
79Sockets 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
80Squelette 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)
81Squelette 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)
82Squelette 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)
83Squelette 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)
84Squelette 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)
85Squelette 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)
86Squelette 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)
87Squelette 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)
88Squelette 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)
89Squelette 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)