Documente Academic
Documente Profesional
Documente Cultură
Olivier Dalle
Universit de Nice - Sophia Antipolis
http://deptinfo.unice.fr/
Daprs le cours original de
Sacha Krakowiak
Universit Joseph Fourier
Projet Sardes (INRIA et IMAG-LSR)
http://sardes.inrialpes.fr/~krakowia
Client
Serveur
(demande un service)
(fournit un service)
7-2
Client
(demande un service)
adresse IP :
216.239.39.99
Serveur
(fournit un service)
194.199.25.39:34231
socket
client
Client
(demande un service)
socket
serveur
216.239.39.99:45321
adresse IP
n de port
Serveur
(fournit un service)
7-4
Application
sockets mode
connect
sockets mode
non connect
TCP
UDP
interfaces
socket
interfaces
transport
interface
rseau
IP
7-5
Le protocole TCP
Principales caractristiques de TCP
Communication bidirectionnelle par flots doctets
Transmission fiable
Fiabilit garantie ds lors que la liaison physique existe
Transmission ordonne
Ordre de rception identique lordre dmission
Contrle de flux
Permet au rcepteur de limiter le dbit dmission en fonction de ses
capacits de rception
Contrle de congestion
Permet dagir sur le dbit dmission pour viter la surcharge du rseau
ne pas confondre contrle de flux (entre rcepteur et metteur ) et contrle de
congestion (entre rseau et metteur)
O. Dalle (cours original de S. Krakowiak)
7-6
connsock
attente
serveur
socket serveur
demande de
connexion
connsock
cration
socket de
communication
O. Dalle (cours original de S. Krakowiak)
serveur
newsock
La socket de communication
est associe au mme
numro de port que la socket
serveur, mais avec un
descripteur diffrent
7-7
serveur
Internet
TCP
protocole,
sans usage ici
port
serveur
7-8
serveur
Taille max de la file dattente des demandes
7-9
serveur
servfd
file
cration
serveur
newsock
socket de
communication
7-11
N.B. : opration
identique la cration
dune socket serveur
clisock = socket.socket(socket.AF_INET,
socket.SOCK_STREAM, 0)
Internet
TCP
protocole,
sans usage ici
socket serveur
clientfd
socket client
client
port
serveur
Le serveur est en attente
sur la socket (accept)
7-12
clientfd
connect
socket serveur
socket client
port
cration
client
serveur
connexion tablie
connfd
Le client et le serveur peuvent maintenant dialoguer sur la connexion
O. Dalle (cours original de S. Krakowiak)
7-13
7-14
Client
clientfd
connexion
(bidirectionnelle)
servfd
connfd
Serveur
7-15
7-16
7-17
7-18
Client
t.listen()
Serveur
connexion initiale
s=t.accept()
s.connect()
s.send()
s.recv()
s.close()
exit()
O. Dalle (cours original de S. Krakowiak)
requte
rponse
s.recv()
attente
nouvelle
connexion
s.send()
s.close(s)
7-19
7-20
Serveur concurrent
Veilleur
t=socket()
t.bind()
t=socket()
bind()
t.listen()
Excutant
listen()
s=accept()
read()
traitement
write()
close(s)
t.close()
s=t.accept()
Client
fork()
s=socket()
s.close()
s.read()
s.connect()
s.send()
traitement
traitement
s.send()
s.recv()
s.close()
exit()
boucle du veilleur
(attente de nouvelles
connexions)
s.close()
exit()
7-21
La primitive select.select
temps ?
Par exemple attendre en mme temps:
soit une entre au clavier => lire fd=0
soit l'arrive d'un message sur un socket connect =>lire listensock
soit l'arrive d'une demande de connection => lire connsock
...
Pb: si je me bloque en attendant sur fd=0 (stdin=clavier), je ne peux pas
savoir ce qui se passe sur listensock ou connsock
Solutions
Serveur concurrent
select.select
O. Dalle (cours original de S. Krakowiak)
7-22
liste_lectures = [clisock,sys.stdin]
# en entre on surveille clisock et sys.stdin
liste_ecritures,liste_erreurs = [],[]
# en criture et en erreur on ne surveille rien
readers,writers,errors =
select.select(liste_lectures,liste_ecritures,
liste_erreurs,delai)
# on recupre le rsultat de l'attente dans 3 listes
for input in readers:
if input == clisock:
# ici on a quelque chose a lire sur clisock
msg = clisock.recv(1000) # ne bloque pas !
if input == sys.stdin:
# ici on a quelque chose a lire sur stdin
msg = sys.stdin.readline() # ne bloque pas
7-23
Rsum de la sance 7
Select
7-24