6. Entrées/sorties

ovarieswhynotΛογισμικό & κατασκευή λογ/κού

5 Ιουλ 2012 (πριν από 5 χρόνια και 2 μήνες)

489 εμφανίσεις

C#
C#
io net thread réflexivité
LionelSeinturier
Lionel

Seinturier
Université Lille 1
Lionel.Seinturier@univ-lille1.fr
//
C#
1
Lionel Seinturier
23
/
08
/
10
Plan
6.I/O
7.Threads
8.Réseau
9.Reflexivité
C#
2
Lionel Seinturier
6. I/O
6.1 Entrées/sorties en mode binaire
62Entrées/sortiesenmodecaractère
6
.
2

Entrées/sorties

en

mode

caractère
C#
3
Lionel Seinturier
6. Entrées/sorties
Entrées/sorties
Géréesàl
'
aidedesclassesdupackage
SystemIO
Gérées

à

laide

des

classes

du

package

System
.
IO
But : lire/écrire des données à partir de fichiers, mémoire, réseau, ...
2 formes d'I/O
-mode binaire (BinaryWriter et BinaryReader)
-mode caractère (TextWriter et TextReader)
C#
4
Lionel Seinturier
6.1 Mode binaire
BinaryReader
Fournitdesméthodes
BinaryWriter
Fournitdesméthodes
Fournit

des

méthodes
pour lire des données
intRead()
Fournit

des

méthodes
pour écrire des données
voidWrite(intb)
int

Read()
-lecture d'un octet
blt
void

Write(int

b)
-écriture d'un octet
flfl
-
bl
oquan
t
-retourne -1 si fin du flux
BinaryReaderbr=
-Close()
p
our
f
ermer
l
e
fl
ux
BinaryWriterbw
=
...
BinaryReader

br

=
...
int i = br.Read();
while ( i != -1 ) {
byte b = (byte) i;
BinaryWriter

bw

...
bw.Write(12);
bw.Write(45);
...
...
i = br.Read();
}
isClose();
bw.Close();
C#
5
Lionel Seinturier
is
.
Close();
6.1 Mode binaire
BinaryReader
Autresméthodespourliredesdonnées
Autres

méthodes

pour

lire

des

données
int Read( byte[] tab, int offset, int length )

letableaudoitêtrealloué(ex
byte[256]
)
avantl
'
appelàRead

le

tableau

doit

être

alloué

(ex

byte[256]
)

avant

lappel

à

Read
•offset,length : lecture de au max length octets, écrits à partir de offset dans tab
offset + length <= tab.length
ltblt

l
ec
t
ure
bl
oquan
t
e
•retourne le nombre d'octets lus
Autres méthodes
byte ReadByte();byte[] ReadBytes(int count);
char ReadChar();char[] ReadChar(int count);
ReadDouble, ReadInt16, ReadInt32, ReadInt64, ReadString, ...lèvent EndOfStreamException
lorsque la fin du flux est atteinte
C#
6
Lionel Seinturier
6.1 Mode binaire
BinaryWriter
Autresméthodespourécriredesdonnées
Autres

méthodes

pour

écrire

des

données
void Write( byte[] tab )
void Write( byte[] tab, int offset, int length )
•offset,length : écriture de length octets à partir de offset
offset + length <= tab.length
Autres méthodes
Write(char), Write(char[]), Write(char[],int,int),
Write(double), Write(int), Write(short), Write(boolean),
Write(string), ...
C#
7
Lionel Seinturier
6.1 Mode binaire
BinaryWriter / BinaryReader
Créationnécessiteunflux(
stream
)
Création

nécessite

un

flux

(
stream
)
Classe
Stream
FileStream( string name, FileMode mode )
BufferedStream(Stream)
MemoryStream
NetworkStream
FileMode

Append
ajoutdanslefichier
FileStream fs = new FileStream("foo.bin",FileMode.Create);
BinaryWriter bw = new BinaryWriter(fs);
Append
ajout

dans

le

fichier
•Createcréation, écrasement si existence
•CreateNewcréation, exception si existence

Truncate
ouvertureenécritureexceptionsinonexistence

Truncate
ouverture

en

écriture
,
exception

si

non

existence
•Openouverture, exception si non existence
•O
p
enOrCreateouverture ou création
C#
8
Lionel Seinturier
p
6.2 Mode caractère
TextReader
Fournitdesméthodes
TextWriter
Fournitdesméthodes
Fournit

des

méthodes
pour lire des caractères
intRead()
Fournit

des

méthodes
pour écrire des caractères
voidWrite(charb)
int

Read()
-lecture d'un caractère
blt
void

Write(char

b)
-écriture d'un caractère
flfl
-
bl
oquan
t
-retourne -1 si fin du flux
TextReadertr=
-Close()
p
our
f
ermer
l
e
fl
ux
TextWritertw
=
...
TextReader

tr

=
...
int i = tr.Read();
while ( i != -1 ) {
char c = (char) i;
TextWriter

tw

...
tw.Write('c');
tw.Write('Z');
...
...
i = tr.Read();
}
trClose();
tw.Close();
C#
9
Lionel Seinturier
tr
.
Close();
6.2 Mode caractère
TextReader
Autresméthodespourliredesdonnées
Autres

méthodes

pour

lire

des

données
int Read( char[] tab, int offset, int length )

letableaudoitêtrealloué(ex
char[256]
)
avantl
'
appelàread

le

tableau

doit

être

alloué

(ex

char[256]
)

avant

lappel

à

read
•offset,length : lecture de au max length caractères, écrits à partir de offset
offset + length <= tab.length
ltblt

l
ec
t
ure
bl
oquan
t
e
•retourne le nombre de caractères lus
Autres méthodes
string ReadLine()
strin
g
ReadToEnd()
g
Lecture au clavier
strings=ConsoleReadLine()
C#
10
Lionel Seinturier
string

s

=

Console
.
ReadLine()
6.2 Mode caractère
TextWriter
Autresméthodespourécriredesdonnées
Autres

méthodes

pour

écrire

des

données
void Write( char[] tab )
void Write( char[] tab, int offset, int length )
•offset,length : écriture de length caractères à partir de offset
offset + length <= tab.length
Autres méthodes
Write(String), Write(Boolean), Write(Double), Write(int), ...
idem WriteLine(String), ...
C#
11
Lionel Seinturier
6.2 Mode caractère
Classe System.IO.File
Permetdegérerdesfichiers
Permet

de

gérer

des

fichiers
Méthodes
FileStream staticFile.Create( string nom )
FileStream staticFile.Open( string nom )
StreamWriter static File.CreateText( string nom )
id
id
em
O
penText, OpenRead, OpenWrite
boolean static Exists(string)
boolean static Delete(string)
boolean static Copy(string,string)
boolean static Move(string,string)
... + manipulation des attributs (date création, accès, …) des fichiers
Remarque : classe
Directory pour la gestion des répertoires
C#
12
Lionel Seinturier
7. Threads
7.1 Introduction
72Modèledeprogrammation
7
.
2

Modèle

de

programmation
7.3 Synchronisation
7.4 Exclusion mutuelle
75Autrespolitiques
7
.
5

Autres

politiques
7.6 Fonctionnalités complémentaires
C#
13
Lionel Seinturier
7.1 Introduction
Threads
Possibilitédeprogrammerdestraitementsconcurrents
Possibilité

de

programmer

des

traitements

concurrents
simplifie la programmation dans de nbreux cas
-programmation événementielle (ex. IHM)
-I/O non bloquantes
-
timersdéclenchementspériodiques
timers
,
déclenchements

périodiques
-servir +sieurs clients simultanément (serveur Web, BD, ...)

浥楬汥畲mu瑩汩獡瑩潮d敳捡灡捩瓩c(䍐唩摥污浡捨楮m

浥楬汥畲m

畴楬楳慴楯u

摥d

捡灡捩瓩c

⡃偕(





浡捨楮m
-u瑩汩獡瑩潮⁤敳t瑥浰猠浯牴m


䱩潮敬⁓敩湴畲楥L
㜮ㄠ⁉湴牯摵捴楯7
Threads
Processusvs
threads
(=processuslégers)
Processus

vs

threads

(=

processus

légers)
•processus: espaces mémoire séparés
•threads: es
p
ace mémoire
p
arta
g
é
ppg
(seules les piles d'exécution des threads sont )
+ efficace
-robuste
-le plantage d'un threadpeut perturber les autres
-le
p
lanta
g
e d'un
p
rocessus n'a
p
as
(
normalement
)
d'incidence sur les autres
pgpp()
Approches mixtes : +sieurs processus ayant +sieurs threads chacun
RilblC#illSDiiP
R
q : processus man
i
pu
l
a
bl
es en
C#
v
i
a
l
a c
l
asse
S
ystem.
Di
agnost
i
c.
P
rocess
C#
15
Lionel Seinturier
7.2 Modèle de programmation
Modèle de programmation
NamespaceSystemThreading
Namespace

System
.
Threading
Ecriture d'une méthode délégué (delegate)
•de type
delegate void ThreadStart();
•instanciation de la classe
Thread
avec une instance de
ThreadStart

lancementdu
thread
enappelantméthode
Start
lancement

du

thread

en

appelant

méthode

Start
ThreadStart ts = new ThreadStart(Go);
Thread t = new Thread
(
ts
)
;
Go
Start
()
t.Start();
// ... la suite du programme ...
void Go() {
// les instructions à exécuter dans le thread
}

éiddld
hd
C#
16
Lionel Seinturier


é
捵c
i
潮⁣潮捵牲敮瑥o
d
甠捯
d

l
慮捥畲⁥琠
d
甠t
h
rea
d
7.2 Modèle de programmation
Modèle de programmation
Remarques
Remarques
•création d'autant de threadsque nécessaire (même méthode ou méthodes )
•a
pp
el de Start
()
une fois et une seule
p
our cha
q
ue thread
pp
()
pq
•un threadmeurt lorsque sa méthode se termine
•!! on appelle jamais directement la méthode (
Start()
le fait) !!
C#
17
Lionel Seinturier
7.2 Modèle de programmation
Modèle de programmation
Remarques
Remarques
•pas de passage de paramètre au thread via la méthode
Start()

défiidibld'it

défi
n
i
r
d
es var
i
a
bl
es
d'i
ns
t
ance
les initialiser lors de la construction
class Foo {
int P1;
Object P2;
public Foo(int p1,Object p2) {this.P1=p1; this.P2=p2; }
public void Run() { ... P1 ... P2 ... }
}
Foo aFoo = new Foo(12,aRef);
new Thread( new ThreadStart(aFoo.Run) ).start();
C#
18
Lionel Seinturier
7.3 Synchronisation
Modèle d'objets multi-threadé passifs
EnC#:
threads

潢橥瑳




:

threads

潢橥瑳
•threads non liés à des objets particuliers
•exécutent des traitements sur
éventuellement +sieurs objets
•sont eux-même des objets
"autonomie" possible pour un objet (notion d'agent)

≡畴漢
thread

≡畴漢
-
thread
public class Foo {
public Foo() { new Thread(new ThreadStart(Run)).Start(); }
ii
publ
i
c vo
i
d Run() { ... }
}
la construction d'un ob
j
et lui assi
g
ne des instructions à exécuter
C#
19
Lionel Seinturier
jg
7.3 Synchronisation
Modèle d'objets multi-threadé passifs
2ou+sieurs
threads
peuventexécuterla
mêmeméthode
simultanément
2

ou

+sieurs

threads
peuvent

exécuter

la

même

méthode

simultanément
2 flux d'exécutions distincts (2 piles)
1 même es
p
ace mémoire
p
arta
g
é
(
les cham
p
s de l'ob
j
et
)
ppg(pj)
C#
20
Lionel Seinturier
7.4 Exclusion mutuelle
Exclusion mutuelle
Besoin:coded
'
uneméthodesectioncritique
Besoin

:

code

dune

méthode

section

critique
au plus 1 threadsimultanément exécute le code de cette méthode pour cet objet

瑩汩瑩搧瑴楢tléd

u
瑩汩


潮o

畮⁡

r

u
t
⁰潵爠
l
愠a
é
o
d
e
[MethodImpl(MethodImplOptions.Synchronized)]
publicvoidEcrire(){}
public

void

Ecrire(
...
)

{
...
}
si 1 threadexécute la méthode, les autres restent bloqués à l'entrée
dès qu'il termine, le 1er threadresté bloqué est libéré
les autres restent bloqués
C#
21
Lionel Seinturier
7.4 Exclusion mutuelle
Exclusion mutuelle
Autrebesoin:blocdecode(

à畮u淩瑨潤攩s散瑩潮c物瑩煵r
䅵瑲

扥獯楮

:

扬潣



捯摥

(

à

畮u

淩瑨潤攩

獥捴楯s

捲楴楱略
au plus 1 threadsimultanément exécute le code de cette méthode pour cet objet

瑩汩瑩dt泩

u
瑩汩


潮o
d
甠浯
t



lock
public void Ecrire2(...) {
...
lock(objet) { ... }// section critique
...
}
objet
:objet de référence pour assurer l'exclusion mutuelle (en général
this)
Chaque objet est associé à un verroulock = demande de prise du verrou
C#
22
Lionel Seinturier
7.4 Exclusion mutuelle
Exclusion mutuelle
Lecontrôledeconcurrences
'
effectueauniveaudel
'
objet
Le

contrôle

de

concurrence

seffectue

au

niveau

de

lobjet

+sieurs exécutions d'une même méth.
Synchronized
dans des objets possibles
si +sieurs méthodes
Synchronized
dans 1 même objet
au plus 1 threaddans toutes les méthodes Synchronized
de l'objet

汥la畴牥um桯摥é(湯n
Synchronized
)sonttjrsexécutablesconcurrement

汥l

慵瑲敳

淩瑨潤敳

⡮潮

Synchronized
)

sont

tjrs

exécutables

concurrement
Remarques
Remarques
•coût
appelméthode
synchronized

3fois
+
longqu
'
appelméthode
"
normal
"
appel

méthode

synchronized
3

fois

long

quappel

méthode

normal
à utiliser à bon escient
C#
23
Lionel Seinturier
7.4 Exclusion mutuelle
Exclusion mutuelle
Autrebesoin:exclusionmutuelle
"
à+sieurs
"
Autre

besoin

:

exclusion

mutuelle

à

+sieurs
i.e. + méthodes et/ou blocs de codes dans des obj. en exclusion entre eux

hi搧扪tdél'li

c
h
o
i


畮

e
t

d
攠e
é
牥湣攠灯畲r

數e
l

i

tous les autres se "
synchronized" sur lui
obj 1
obj 2
obj 3
lock
obj verrou
C#
24
Lionel Seinturier
7.5 Autres politiques
Autres politiques de synchronisation
Ex:lecteurs/écrivainproducteur(s)/consommateur(s)
Ex

:

lecteurs/écrivain
,
producteur(s)/consommateur(s)
utilisation des méthodes
t
(
)
Monitor.Wait()
e
t
Monitor.Pulse()
(
namespace System.Threading
)
Wait()
: met en attente le threaden cours d'exécution
Pulse()
: réactive un threadmis en attente par
Wait()
si pas de threaden attente, RAS
!! ces méthodes nécessitent un accès exclusif à l'objet exécutant !!
à utiliser avec méthode
Synchronized
ou bloc lock(object)
lk
(
thi
){MitWit(thi)}
l
oc
k
(
thi
s
)

{

M
on
it
or.
W
a
it(thi
s
)
;
}
lock(this) { Monitor.Pulse(this); }
C#
25
Lionel Seinturier
7.5 Autres politiques
Méthode Wait()
Fonctionnement
Fonctionnement
Entrée dans Synchronized ou lock
iitidl'èlifàl'bjt
-acqu
i
s
iti
on
d
e
l'
acc
è
s exc
l
us
if

à

l'
o
bj
e
t
Wait()
itttd
thd
-m
i
se en a
tt
en
t
e
d
u
th
rea
d
-relachement de l'accès exclusif
-attente d'un appel à
Pulse()par un autre thread
-attente de la réacquisition de l'accès exclusif
-reprise de l'accès exclusif
Sortie du
synchronized
ou lock
-relachement de l'accès exclusif à l'objet
C#
26
Lionel Seinturier
7.5 Autres politiques
Méthode Pulse()
Réactivationd
'
unthreadenattentesurun
Wait()
Réactivation

dun

thread

en

attente

sur

un

Wait()
Si +sieurs threads
étitid1di
r
é
ac
ti
va
ti
on
d
u
1
er en
d
orm
i
Pulse()
pas suffisant pour certaines politiques de synchronisation
notamment lorsque compétition pour l'accès à une ressource
-2 threadstestent une condition (faux pour les 2) 
Wait()
13ème
thread
fait
Pl()
-
1

3ème

thread
fait

P
u
l
se
()
-le threadréactivé teste la condition (tjrs faux) 
Wait()

les2
threads
sontbloqués

les

2

threads
sont

bloqués


PulseAll()
réactive tous les threadsbloqués sur Wait()
C#
27
Lionel Seinturier
7.5 Autres politiques
Politique lecteurs/écrivain
soit1seulécrivainsoitplusieurslecteurs
soit

1

seul

écrivain
,
soit

plusieurs

lecteurs
•demande de lecture : bloquer si écriture en coursbooléen écrivain
•demande d'écriture : blo
q
uer si écriture ou lecture en courscom
p
teur lecteurs
q
p
réveil des bloqués en fin d'écriture et en fin de lecture
b
oolean ecrivain = false;
int lecteurs = 0;
C#
28
Lionel Seinturier
7.5 Autres politiques
Politique lecteurs/écrivain

demandedelecture:bloquersiécritureencours

demande

de

lecture

:

bloquer

si

écriture

en

cours
•réveil des bloqués en fin de lecture
void
DemandeLecture
(){
void

DemandeLecture
(
...
)

{
lock(this) {
while (ecrivain) { Monitor.Wait(this); }
lecteurs++;
} }
// On lit
void FinLecture(...) {
lock(this) {
lecteurs--;
Monitor.PulseAll();
} }
C#
29
Lionel Seinturier
7.5 Autres politiques
Politique lecteurs/écrivain

demanded
'
écriture:bloquersiécritureoulectureencours

demande

décriture

:

bloquer

si

écriture

ou

lecture

en

cours
•réveil des bloqués en fin d'écriture
void
DemandeEcriture
(){
void

DemandeEcriture
(
...
)

{
lock(this) {
while (ecrivain || lecteurs>0) { Monitor.Wait(); }
e
crivain = true;
} }
// On écrit
void FinEcriture(...) {
lock(this) {
e
crivain = false;
Monitor.PulseAll();
} }
C#
30
Lionel Seinturier
7.5 Autres politiques
Politique producteurs/consommateurs
1ou+sieursproducteurs1ou+sieursconsommateurszonetampondetaillefixe
1

ou

+sieurs

producteurs
,
1

ou

+sieurs

consommateurs
,
zone

tampon

de

taille

fixe
•demande de production : bloquer si tampon plein
•demande de consommation : blo
q
uer si tam
p
on vide
qp
réveil des bloqués en fin de production et en fin de consommation
//
int max = ...
//
taille du tampon
tampon = ...// tableau de taille max
int taille = 0;// # d'éléments en cours dans le tampon
C#
31
Lionel Seinturier
7.5 Autres politiques
Politique producteurs/consommateurs

demandedeproduction:bloquersitamponplein

demande

de

production

:

bloquer

si

tampon

plein
•réveil des bloqués en fin de production
void
DemandeProd
(){
void

DemandeProd
(
...
)

{
lock(this) {
while (taille == max) { Monitor.Wait(this); }
}
}
// En exclusion mutuelle
// on produit (maj du tampon)
//taille++
//

taille++
void FinProd(...) {
lock(this) {
Monitor.PulseAll();
} }
C#
32
Lionel Seinturier
7.5 Autres politiques
Politique producteurs/consommateurs

demandedeconsommation:bloquersitamponvide

demande

de

consommation

:

bloquer

si

tampon

vide
•réveil des bloqués en fin de consommation
void
DemandeCons
(){
void

DemandeCons
(
...
)

{
lock(this) {
while (taille == 0) { Monitor.Wait(this); }
} }
// En exclusion mutuelle
// on consomme (maj du tampon)
//taille
//

taille
--
void FinCons(...) {
lock(this) {
Monitor.PulseAll();
} }
C#
33
Lionel Seinturier
7.5 Autres politiques
Schéma général de synchronisation

bloquer(éventuellement)lorsdel
'
entrée

bloquer

(éventuellement)

lors

de

lentrée
•réveil des bloqués en fin
lock(this) {
while (!condition){
Monitor.Wait(this);
Monitor.Wait(this);
}
}
//
//
...
lock(this) {
Monitor.PulseAll();
Monitor.PulseAll();
}
C#
34
Lionel Seinturier
7.5 Autres politiques
Exemple : sémaphore
classSemaphore{
class

Semaphore

{
int NbThreadsAutorises;
public Semaphore( int init ) { NbThreadsAutorises = init; }
[MethodImpl(MethodImplOptions.Synchronized)]
public void P() {
while(nbThreadsAutorises<
=
0){
while

(

nbThreadsAutorises

<

0

)

{
Monitor.Wait(this);
}
NbThreadsAutorises --;
}
[MethodImpl(MethodImplOptions.Synchronized)]
publicvoidV(){
public

void

V()

{
NbThreadsAutorises ++;
Monitor.Pulse();
}
}
C#
35
Lionel Seinturier
}
7.6 Compléments
Poolde thread
Serveursconcurrentsavecautantde
threads
quederequêtes
Serveurs

concurrents

avec

autant

de

threads

que

de

requêtes
concurrence "débridé"
risque d'écroulement du serveur
Poolde thread : limite le nb de threads à disposition du serveur
Poolfixe : nb cst de threads
Pb : dimensionnement
Pool dynamique
-le nb de threads s'adapte à l'activité
-
ilresteencadré:[bornesup,borneinf]
il

reste

encadré

:

[

borne

sup

,

borne

inf

]
Optimisation : disposer de threads en attente (mais pas trop)
-encadrer le nb de threads en attente
C#
36
Lionel Seinturier
7.6 Compléments
I/O asynchrone
But:pouvoirliredesdonnéessurunfluxsansresterbloquerencasd
'
absence
But

:

pouvoir

lire

des

données

sur

un

flux

sans

rester

bloquer

en

cas

dabsence
Solution
thd
ilitttkldédbff
-un
th
rea
d
qu
i

lit
en permanence e
t
s
t
oc
k
e
l
es
d
onn
é
es
d
ans un
b
u
ff
er
-une méthode read qui lit dans le buffer
class AsyncInputStream {
Stream S;// flux dans lequel on lit
int[] Buffer= ...// zone tampon pour les données lues
AsyncInputStream( Stream s ) { S=s;
new Thread(new ThreadStart(Run)).Start(); }
publicvoidRun(){
public int Read() {
return...
// 1ère donnée dispo dans buffer
}
public

void

Run()

{
int b = S.read();
while( b != -1 ) {
// stocker b dans buffer
C#
37
Lionel Seinturier
}
b = S.Read(); } }
8. Réseau
8.1Notionsgénérales
8.1

Notions

générales
8.2 TCP
C#
38
Lionel Seinturier
8.1 Notions générales
Protocoles de transport réseaux
Protocolespermettantdetransférerdesdonnéesdeboutenbout
Protocoles

permettant

de

transférer

des

données

de

bout

en

bout
•s'appuient sur les protocoles rsx inf. (IP) pour routage, transfert noeud à noeud, ...
•servent de socles
p
our les
p
rotocoles a
pp
licatifs
(
RPC
,
HTTP
,
FTP
,
DNS
,
...
)
pppp(,,,,)
•API associées pour pouvoir envoyer/recevoir des données
UDPmécanisme d'envoi de messages
TCPflux bi-directionnel de communication
Multicast-IPenvoi de messa
g
e à un
g
rou
p
e de destinataire
ggp
C#
39
Lionel Seinturier
8.1 Notions générales
Caractéristiques des protocoles de transport réseaux
2primitivesdecommunications
2

primitives

de

communications
•sendenvoi d'un message dans un buffer distant
•receivelecture d'un messa
g
e à
p
artir d'un buffer local
gp
Propriétésassociées
Propriétés

associées
fiabilité: est-ce que les messages sont garantis sans erreur ?
ordre
:est
cequelesmessagesarriventdanslemêmeordre
ordre
:

est
-
ce

que

les

messages

arrivent

dans

le

même

ordre
que celui de leur émission ?
contrôle de flux: est-ce que la vitesse d'émission est contrôlée ?
i
léhddé
ilié?
connex
i
on:
l
es
é
c
h
anges
d
e
d
onn
é
es sont-
il
s organ
i
s
é
s en cx
?
C#
40
Lionel Seinturier
8.1 Notions générales
Caractéristiques des protocoles de transport réseaux
2modes
2

modes
•synchroneles primitives sont bloquantes
•asynchroneles primitives sont non bloquantes
Exemple

sendsyncetreceivesync
syncasync
send

sync

et

receive

sync
send reste bloqué jusqu'à l'envoi complet du message
receive reste bloquée jusqu'à ce qu'il y ait un message à lire
send
receive
•send async et receive sync
send retourne immédiatemment
Asynchrone+ souple
Synchroneprogramme + simple à écrire
C#
41
Lionel Seinturier
receive synchrone + multi-threading receive asynchrone
8.1 Notions générales
Adressage
socket
=abstractiondesextrémitésservantàcommuniquer
socket
=

abstraction

des

extrémités

servant

à

communiquer
chaque socket associéeà @ IP + n°port local
ports
ports
socket
k
@ IP
@ IP
soc
k
et
1 récepteur pour chaque port/machine
éventuellement +sieurs émetteurs vers le même port/machine
C#
42
Lionel Seinturier
8.1 Notions générales
Adressage
Chaquecartersx(connectédefaçonfixeetdirecte)=1pointd
'
accèsaursx
Chaque

carte

rsx

(connecté

de

façon

fixe

et

directe)

=

1

point

daccès

au

rsx
= 1 @ IP permanente
•+sieurs
@
IP
p
ar machine
@p
•@ IP = 32 bits (128 pour IPv6)
4classesd
'
adressesIP
4

classes

dadresses

IP
•A : 128 rsx, 16 M @ par réseau
•B : 16 K rsx, 64 K
@

p
ar réseau
@p
•C : 2 M rsx, 256 @ par réseau
•D : @ réservées pour la diffusion (Multicast IP)
Correspondance @ symbolique @ IP assurée par DNS
ex : www.lip6.fr132.227.60.13
C#
43
Lionel Seinturier
8.1 Notions générales
Adressage
Classe
SystemNETDns
Classe

System
.
NET
.
Dns
static IPHostEntry Resolve(string)
@ IP de la machine
<String>
hill
s
tatic string GetHostName()
nom mac
hi
ne
l
oca
l
e
IPAddress[] IPHostEntry.AddressListla liste des @ de la machine
IPEndPoint ipe = new IPEndPoint( IPHostEntry.AddressList[0], (int) #port)
i
p
e.AddressFamil
y
utilisé
p
our la connexion sur une socket
pyp
C#
44
Lionel Seinturier
8.1 Notions générales
Problématique de la construction de protocoles applicatifs
TCPUDP:soclespourlaconstructiondeprotocolesde+hautniveau
TCP
,
UDP

:

socles

pour

la

construction

de

protocoles

de

+

haut

niveau
Définition de protocole
Protocole x
Protocole x
•message + paramètres
•format des messages

enchaînementdesmessages
TCP
IP
TCP
IP
enchaînement

des

messages
•cas d'erreur : message, format,
paramètres, enchaînement
IP

IP

!! distinction entre niveaux !!
utilisation des services du protocole sous-jacent
diTCP
ex. : ouverture
d
e connex
i
on
TCP
C#
45
Lionel Seinturier
8.1 Notions générales
Connexion
Problématique
Problématique
Les communications entre un client et un serveur sont-elles précédées
d'une ouverture de cx ?
(
et suivies d'une fermeture
)
()
Mode non connecté (le + simple)
•les messages sont envoyés "librement"
Mode connecté
Avantages
-facilite la gestion d'état
illtôldlit(ié&dét)
-me
ill
eur con
t
r
ôl
e
d
es c
li
en
t
s
(
arr
i
v
é
es
&


par
t
s
)
C#
46
Lionel Seinturier
8.1 Notions générales
Connexion
niveautransportet/ouapplicatif
niveau

transport

et/ou

applicatif
Transport
(niea4)
Applicatif
(niea7)
(ni
v
ea
u
4)
(ni
v
ea
u
7)
ConnectéTCPFTP, Telnet,
SMTP, POP,
JDBC
Non connectéUDPHTTP, NFS,
DNS, TFTP
-
purementnonconnecté:NFS+UDP
Rq : HTTP

cliéatransport(TCP)
purement

non

connecté

:

NFS+UDP
-purement connecté : FTP+TCP
-mixte : HTTP+TCP

c
x
lié

a
u
transport

(TCP)
•pas à HTTP lui-même
•mécanisme session
ié&dé
C#
47
Lionel Seinturier
arr
i
v
é
es
&


parts
8.1 Notions générales
Poolde connexion
Connexionsréseaucoûteuse
Connexions

réseau

coûteuse
•en ressources occupées
•en temps mis pour ouvrir/fermer les connexions
prog 1
prog 2
prog 3
But du pool: mutualiser les cx entre 2 machines
ex. : poolde cx vers un SGBD
pool
•tous les progs n'ont pas forcément besoin
de toutes les cx en même temps
•le poolpeut restreindre ou adapter le # de cx simultanées
Si les
p
ro
g
s ont besoin de +sieurs cx
pg
politique de gestion de ressources partagées
pb "classique" : réservation, interblocage, …
C#
48
Lionel Seinturier
8.1 Notions générales
Multiplexage de communications
Mêmeobjectifquelepool
Même

objectif

que

le

pool
1 seule cx partagée entre +sieurs prog. c/s
Pbditil

晬ddé
捬楥ct‱
捬楥ct′
捬楥ct″



s

湧略爠

敳e


畸u
d

d
潮
é

les encadrer par un protocole de multiplexage
Mécanisme pouvant être couplé avec le pool
serv. 1
serv. 2
serv. 3
C#
49
Lionel Seinturier
8.1 Notions générales
Représentation des données
Problématique
Problématique
Comm. entre machines avec des formats de représentation de données 

p
as le même coda
g
e
(
bi
g
endian vs little endian
)
pg(
g
)
pas la même façon de stocker les types (entiers 32 bits vs 64 bits, ...)
2solutions
2

solutions
On prévoit tous les cas de conversions possibles
(
n2
convertisseurs
)
(
)
Onprévoitunformatpivoteton
On

prévoit

un

format

pivot

et

on
effectue 2 conversions (2n convertisseurs)
C#
50
Lionel Seinturier
Nbreux formats pivots : ASN.1, Sun XDR, sérialisation Java, CORBA CDR, ...
8.1 Notions générales
Traitement des pannes
3types
3

types
•client
•serveur
•réseau-panne de rsx local en général détectable (ex. brin Ethernet)
-panne rsx large échelle (Internet) non signalée généralement
Dans la majorité des cas
•symptôme : absence de réponse
•cause (rsx, serveur plantée, serveur très lent) inconnue
•solution
-choisir un autre serveur :
p
as tou
j
ours
p
ossible
pjp
-abandonner : pas forcément satisfaisant
-réessayer plus tard (en espérant un retour en service) mieux
C#
51
Lionel Seinturier
8.1 Notions générales
Traitement des pannes
Problématique
Problématique
Comportement de l'interaction c/s satisfaisant en présence de ré émissions
(

a

敬⁤攠淩瑨潤攠汯捡m
)
(
灰)
獡湳ⁱ略s捥污c獯楴⁴牯瀠汯畲搠柩牥g
Notion de sémantique d'invocation
•au moins 1 foisgarantie traitement demandé exécuté au moins 1 fois [1..n]
•au plus 1 fois[0..1]
•exactement 1 fois
-le
p
lus satisfaisant
p
-le plus lourd
C#
52
Lionel Seinturier
8.1 Notions générales
Détection des pannes
Mécanismecomplémentairepourdétecterdespannes
Mécanisme

complémentaire

pour

détecter

des

pannes
en cours d'exécution d'un traitement
htbt
éiditliltiitélit

h
ear
t

b
ea
t

r
i
o
di
quemen
t

l
e serveur s
i
gna
l
e son ac
ti
v
ité
au c
li
en
t
•pingingpériodiquement le client sonde le serveur qui répond
C#
53
Lionel Seinturier
8.2 TCP
Propriétés du protocole TCP
Tailledesmessages
Taille

des

messages
quelconque
envoi en général bufférisé
idtitidbffibl(dédOS)
v
id
age au
t
or
it
a
i
re
d
es
b
u
ff
ers poss
ibl
e
(dé
pen
d

OS)
Perte de messages
acquittements(masquésauprogrammeur)demessagesenvoyés
acquittements

(masqués

au

programmeur)

de

messages

envoyés
timeout de ré-émission des messages en cas de non récept. de l'acq.
(mécanisme de fenêtre)
Contrôle de flux
éviter qu'un émetteur trop rapide fasse "déborder" le buffer du récepteur
blocagedel
'
émetteursinécessaire
blocage

de

lémetteur

si

nécessaire
Ordre des messages
garantie que l'ordre de réception = ordre de réception
C#
54
Lionel Seinturier
garantie de non duplication des messages
8.2 TCP
Propriétés du protocole TCP
ConnexionsTCP
Connexions

TCP
demande d'ouverture par un client
acception explicite de la demande par le serveur

摬àéhdbi
摩瑩l

慵a
d
e


é
c
h
慮来⁥渠浯
d


-

牥r

潮湥
l
au delà distinction rôle client/serveur "artificielle"
fermeturedeconnexionàl
'
initiativeduclientouduserveur
fermeture

de

connexion

à

linitiative

du

client

ou

du

serveur
vis-à-vis notifié de la fermeture
Pasdemécanismedegestiondepanne
Pas

de

mécanisme

de

gestion

de

panne
trop de pertes de messages ou réseau trop encombré
connexion perdue
Utilisation
nombreux protocoles applicatifs : HTTP, FTP, Telnet, SMTP, POP, ...
C#
55
Lionel Seinturier
8.2 TCP
Fonctionnement

serveurcréeune
socket
etattendunedemandedeconnexion

serveur

crée

une

socket
et

attend

une

demande

de

connexion
•client envoie une demande de connexion
•serveur accepte connexion
dillit/dfl

di
a
l
ogue c
li
en
t/
serveur en mo
d
e
fl
ux
•fermeture de connexion à l'initiative du client ou du serveur
C#
56
Lionel Seinturier
8.2 TCP
Fonctionnement
serveur
TLit()
client
connexion
serv = new
T
cp
Li
s
t
ener
()
c = serv.AcceptTcpClient()
client = new TcpClient()
stream
str.ReadByte()
strWriteByte()
lect
str.ReadByte()
strWriteByte()
lect
str
.
WriteByte()
c.Close()
ec
r
str
.
WriteByte()
c.Close()
ec
r
C#
57
Lionel Seinturier
8.2 TCP
Serveur
IPHostEntryiphe
=
Dns.Resolve(
"
localhost
"
);
IPHostEntry

iphe

Dns.Resolve(
localhost
);
IPEndPoint ipep = new IPEndPoint(iphe.AddressList[0],port);
TcpListener s = new TcpListener(ipep);
//
s
.Start();
//
début écoute
TcpClient c = s.AcceptTcpClient();// attente d'un client
Streamstr
=
c.GetStream();
//fluxdecomavecleclient
Stream

str

c.GetStream();
//

flux

de

com

avec

le

client
int i;
while( (i=str.ReadByte()) != -1 ) { ... }// -1 = fin du flux
str.Close();
c.Close();
•souvent while (true) { AcceptTcpClient(); … } + thread
•Stream : ReadByte et/ou Write

tableaud
'
octetsouoctetparoctet:(byte[]
data
int
offset
int
length
)
C#
58
Lionel Seinturier

tableau

doctets

ou

octet

par

octet

:

(

byte[]

data
,
int

offset
,
int

length

)
8.2 TCP
Client
IPHostEntryiphe
=
Dns.Resolve(
"
serveurdistant
"
);
IPHostEntry

iphe

Dns.Resolve(
serveurdistant
);
IPEndPoint ipep = new IPEndPoint(iphe.AddressList[0],portdistant);
TcpClient c = new TcpClient(ipep);
//
Stream str = c.GetStream();
//
flux de com avec le serveur
str.WriteByte(12);// envoi des données
str.WriteByte(178);
str.WriteByte(178);
...
str.Close();
c.Close();
•Stream : ReadByte et/ou WriteByte
tbld'tttttt(bt[]
dt
it
fft
it
lth
)

t
a
bl
eau
d'
oc
t
e
t
s ou oc
t
e
t
par oc
t
e
t
:
(

b
y
t
e
[]

d
a
t
a,
i
n
t
o
ff
se
t
,
i
n
t

l
eng
th

)
C#
59
Lionel Seinturier
8.2 TCP
Asynchronisme

ReadetWrite
synchrone

Read

et

Write

synchrone
•asynchronisme avec BeginRead/EndRead et BeginWrite/EndWrite
BiRd(
B
eg
i
n
R
ea
d(
byte[] buffer, int offset, int length,
delegate void AsyncCallBack(IAsyncResult iar),
ARead
Begin
Read
End
object id)// objet pour identifier les requêtes rea
d
str.BeginRead( buf, 0, buf.Length, new AsyncCallBack(ARead), new Object() )
Read
void ARead( IAsyncResult iar ) {
int len = str.EndRead(iar);// len = # octets lus
//traitementoctetslus
//

traitement

octets

lus
// si d'autres octets à lire (rq: il faut savoir)
str.BeginRead( buf,0,buf.Length,new AsyncCallBack(ARead),new Object() )
}
C#
60
Lionel Seinturier
8.2 TCP
Autres protocoles de transport

classeSocket

classe

Socket
•fonctionnement identique API C socket : bind/listen/connect
•socket TCP/UDP/multicast IP, read/write sync/async
C#
61
Lionel Seinturier
9. Réflexivité
Réflexivité
Interrogerleprogrammepourqu
'
ilfournissedesinformationssurlui
même
Interroger

le

programme

pour

quil

fournisse

des

informations

sur

lui
-
même
2téidéfliité
2
ca

gor
i
es
d
e r
éfl
ex
i
v
ité
•structurelle(la structure d'un programme)oui

comportementale
(soncomportement)
non
comportementale
(son

comportement)
non
•namespaceSystem.Reflection
C#
62
Lionel Seinturier
9. Réflexivité
MemberInfo
MemberInfo
MemberInfo
EventInfo: événement
FieldInfo: attribut
MthdB
M
e
th
o
dB
ase
ConstructorInfo: constructeur
MethodInfo: méthode
PropertyInfo: propriété
Exem
p
les
p
MethodBase.GetParameters(): retourne la liste des paramètres (ParameterInfo[])
ParameterInfo.Name: nom du paramètre
PIfPT

P
arameter
I
n
f
o.
P
arameter
T
ype: type
d
u param
è
tre
MethodInfo.ReturnType: type de retour de la méthode
C#
63
Lionel Seinturier
9. Réflexivité
Chargement dynamique de code
Charger
àl
'
exécution
desclasses/types
Charger

à

lexécution

des

classes/types
•inconnues à la compilation
•dont le nom est inconnu à la com
p
ilation
p
•générées dynamiquement
Assembly: .exe ou .dll contenant du code (classe, interface) MSIL
Chargement dynamique à partir nom fichier, path, URL
Invocationdynamiquedeméthode
Invocation

dynamique

de

méthode
Assembly a = Assembly.LoadFrom("serveur.exe");// chargement
Objecto
=
aCreateInstance(
"
namespace
MaClasse
"
);
//instanciation
Object

o

a
.
CreateInstance(
namespace
.
MaClasse);
//

instanciation
MethodInfo m = o.GetType().GetMethod("Main");// introspection
m.Invoke(o,new Object[]{null});// invocation dyn.
C#
64
Lionel Seinturier
A
ssembly current = Assembly.GetExecutingAssembly();// assembly courante
9. Réflexivité
API System.Reflection.Emit et System.CodeDom
Générerdynamiquementducode
Générer

dynamiquement

du

code
•Emit: génération de MSIL
CdDéétiddàtidDOMd’C#

C
o
d
e
D
om: g
é
n
é
ra
ti
on
d
e co
d
e source
à
par
ti
r
d
u
DOM

d’
un prog.
C#
CodeMemberMethod cm = new CodeMemberMethod ();
cmName="Add";
cm
.
Name

=

"Add";
cm.ReturnType = new CodeTypeReference(typeof(int));
cm.Parameters.Add(new CodeParameterDeclarationExpression(typeName,"val"));
cm.Attributes = MemberAttributes.Public | MemberAttributes.Final;
cm.Statements.Add (
new CodeMethodReturnStatement (
new CodeMethodInvokeExpression (
newCodeFieldReferenceExpression(
new

CodeFieldReferenceExpression(
new CodeThisReferenceExpression(),"List"),
"Add", new CodeArgumentReferenceExpression ("val"))));
C#
65
Lionel Seinturier