IUT Bordeaux I
03/10/2007
Transfert de fichiers
Connexion distance
Courrier lectronique
Groupe de discussions
Web
Et maintenant tous les domaines de linformatique:
03/10/2007
Les sockets
Mcanisme de communication inter-processus
Bref historique:
Interface applicative
03/10/2007
03/10/2007
Descripteur de fichier
un type
associ un processus
une adresse (adresse IP + n port)
03/10/2007
03/10/2007
Application2
Application 3
Stream socket
Datagram socket
Raw socket
TCP
UDP
IP
03/10/2007
Client
socket()
Serveur
Client
socket()
bind()
socket()
bind()
socket()
recvfrom()
sendto()
listen()
sendto()
recvfrom()
accept()
connect()
read/write()
write/read()
Structure de donnes
#include <sys/types.h>
#include <sys/socket.h>
//Bibliothques requises
struct sockaddr {
unsigned short sa_family; //famille de protocole pour cette adresse
char sa_data[14];
// 14 octets dadresse
}
struct sockaddr_in {
short sin_family;
u_short sin_port;
struct in_addr sin_addr;
char sin_zero[8];
}
struct in_addr {
u_long s_addr; //soit 4 octets : bien pour une adresse IP !
};
03/10/2007
un descripteur de socket
-1 si erreur
close(int socket)
10
sockaddr
adresse-
sockaddr_un si AF_UNIX
sockaddr_in si AF_INET (adresse IP)
longueur adresse : sizeof(struct sock_addr)
03/10/2007
11
03/10/2007
12
Convertit une adresse ASCII en entier long sign (en Network Order)
socket_ad.sin_addr.s_addr = inet_addr("172.16.94.100")
char * inet_ntoa(in_addr)
03/10/2007
13
03/10/2007
14
Lecture-Ecriture en mode
datagramme (UDP)
int sendto()
Permettent l'envoi de datagrammes en mode nonconnect
Contient adresse du destinataire (sendto)
int recvfrom()
rception (bloquante)
Contient adresse de lmetteur
03/10/2007
15
03/10/2007
16
Dialogue (datagramme)
S e rv e u r
C lie n t
s o c k e t()
03/10/2007
b ind ()
s o c k e t()
re c v fro m ()
s e nd to ()
s e nd to ()
re c v fro m ()
17
Protocoles application
utilisant UDP
Un protocole non normalis : BigBen
C:HEURE
S:HH
S:MM
S:SS
Un protocole normalis:
03/10/2007
18
Source Socket
Mode Datagramme
03/10/2007
19
03/10/2007
20
Communication en mode
connect
Dissymtrie lors de la connexion
Le serveur attend
Le client demande une connexion
03/10/2007
21
Connexion
connect (socket, adr-destination, longueur-adr)
Ct client
Pour tablir une connexion TCP avec le
processus serveur
Ladresse IP et le numro de port sont spcifis
Appel bloquant jusqu la fin de la prise en
compte de la connexion par le serveur
03/10/2007
22
Ct serveur
cre une file d'attente pour les demandes de connexion
Place la socket en mode connexion
lgr-file indique le nombre maximal de demandes de
connexion autorises dans la file (5, 10 ou 20)
file d'attente exploite par la primitive accept.
03/10/2007
23
03/10/2007
ct serveur
prise en compte d'une demande de connexion entrante sur
une socket de connexion.
primitive bloquante
newsock : nouveau descripteur de socket sur laquelle
s'effectuera lchange de donnes
adresse : adresse du client.
Le processus peut traiter lui-mme la nouvelle connexion,
puis revenir accept, ou bien se rpliquer (fork() en
UNIX) pour la traiter, le processus pre tant toujours
l'coute.
Interface des Sockets
24
Lecture-Ecriture TCP
03/10/2007
25
socket()
bind() : nommage
listen()
accept()
read | write
03/10/2007
Sur le client
Crer une socket (socket)
Connecter la socket au serveur (connect)
Tant que pas fini
envoyer une requte (write)
lire la rponse (read)
traiter la rponse
Fermer la socket (close)
26
03/10/2007
27
LIST
+OK 3 visible messages (4235 octets)
1 1508
2 1464
3 1263
.
RETR 3
03/10/2007
28
DELE 2
03/10/2007
29
Source Socket
Mode connect
03/10/2007
30
BigbenServeur
int main(int argc, char * argv[])
{
int fdTravail, port;
...
/* initialisation du service */
port=atoi(argv[1]);
fd=init_service(port);
/* gestion des connexions de clients */
while(1) {
/* acceptation d'une connexion */
fdTravail=accept(fd,NULL,NULL);
if (fdTravail<=0) FATAL("accept");
if (fork()==0) { /* fils : gestion du dialogue avec client */
close(fd);
travail_fils(fdTravail);
close(fdTravail);
exit(0);
}
else { /* pere : repart a l'ecoute d'une autre connexion */
close(fdTravail);
}
}
}
BigbenClient
...
int main(int argc, char * argv[])
{
int port;
char *hostname;
...
/* ouverture de la connexion */
hostname=argv[1];
port=atoi(argv[2]);
fd=connexion(hostname,port);
/* travail */
travail(fd);
close(fd);
exit(0);
}
*/
h");
m");
s");
Source Socket
Mode connect
Avec fichier de haut niveau
03/10/2007
37
Affichage :
13
:15
:25
Source Socket
Mode connect
Scnario avec longs messages
03/10/2007
42
COTE SERVEUR
-----------void travail_fils(int fd)
{
char tampon[4096];
int rep, env;
/* reception de la chaine */
rep=read(fd, tampon, 4096);
printf("recu
: %d\n",rep);
/* envoi de la chaine recue */
env=write(fd, tampon, rep);
printf("envoye : %d\n\n",env);
close(fd);
}
COTE CLIENT
----------void travail(int fd)
{
char tampon[4096];
int rep, env, i;
/* envoi de la chaine */
for (i=0 ; i<4096 ; i++)
tampon[i]='1';
env=write(fd, tampon, 4096);
printf("envoye : %d\n",env);
memset(tampon, 0, 4096);
/* reception de la chaine */
rep=read(fd, tampon, 4096);
printf("recu
: %d\n",rep);
}
recu
: 4096
recu
: 2896
recu
: 1448