Options
» Il faut spécifier son type d’adressage
> Les deux types d’adressage les plus répandus :
* AF_UNZIX : famille d’adresse UNIX (locale : pas de réseau)
* AF_INET : famille dadresse Internet (format %x.20.10.20),
» Il faut spécifier un numéro de port sur la machine
* Ce numéro doit étre compris entre 49152 et 65535
» II faut spécifier son type
= les deux types les plus répandus sont
> SOCK_STREAM : spécifiques au mode connecté (TCP)
> SOCK_DGRAN : spécifiques au mode non-connecté (UDP)
Domaine d’un socket
» Domaine internet : AF_INET
struct sockaddr_in {
short sin fami, [* AEINET aT
shot sin_port Js ruméro de port *]
struct sh_adar, jr adresse interet*/
char sin_zer0(8); 7° champ de 8 zeres) */
%
> Domaine UNIX : AF_UNIX
Les sockets sont locales au systime et fournissent un mécanisme 41PC
CinterProcessus Communication)
struct sockaddr_un
short sun_famly; JRAEUNK +f
char suncpath [108] /* référence UNIX */Options
> De la méme fagon qu’on attribue un numéro de
téléphone a une personne pour recevoir des
appels, il faut spécifier au socket une adresse
a laquelle il doit recevoir les messages qui lui sont
destinés (bina)
» Les sockets de type socx_STREAM ont la
possibilité de mettre les requétes de
Communication dans une file d’attente (1isten)
Attente les demandes
> Une fois créé, le socket va attendre les
demandes de communication (accept)
» Apres la prise en compte de cette demande,
le socket peut se remettre a attendre les
demandes de communication
> Utilisation de Thread ou de fork ()
[omConnexion entre 2 sockets
» Une fois créé le socket qui recoit des demandes de
communication, peut étre appelé par un autre
socket
» Il faut connecter un socket a un autre socket
qui est en attente (connect)
» Une fois la connexion établie, la conversation
peut commencer (read, wri te...)
» Ala fin de la communication (comme on raccroche
le téléphone) il faut fermer le socket qui a servi
& la communication (close)
Les primitives
dinitialisation et de mise en relation
Initialisation
> Initialisation obligatoire avant utilisation
des sockets
[WSADATA WSAData;
WSAStart up (MAKEWORD (2,0), &WSAData)
/[faire wSACleanup (); alafin de
utilisation des socketsCréation du socket
KET sock; //Initiallser une varlable de type socket
"KADDR_IW sing /finformations techniques du socket
[si serveur :
ein. sin_addr.s_addr = htond (INADDR_ANY) ;
//si client
Nein. sin_addr.s_addr = inet_addr (*10.7.9.1") ; /fadresse serveur
sin. sin family = AF_INeT; //famille du socket
sin.sin port = htons (4148) ; //port sur lequel se connecter ou écouter
A ports ré |
sock = socket (AFINET, SOCKSTREAM, IPPROTO_TCP) ; //eréation du |
socket TCP/IP
Her paramétre ; famille du socket
1/2iéme paramétre : type de socket
1/3" parameétre : protocole IP
Relier le socket a l’adresse et au port
bind(sock, (SOCKADDR *) &sin, sizeof (sin));
» Attache le socket directement au port et
a l'adresse définis dans sin
»Trois parametres
* sock : le socket initialisé
« &sin: adresse de structure SOCKADDR_IN
" sizeof (sin) : la taille de l’adresseEcouter le port (serveur)
| int val = listen(sock, 0);
[ine vat = Listen sock, 07 |
» écouter le port sur le socket :
* ler argument, sock : socket sur lequel le listen () écoutera
= 2nd argument, le BACKLOG : nombre maximum de connections qui
seront écoutéés en meme temps
* retour 0, ou SocKET_ERROR en cas de probléme
> généralement utilisé aprés les appels socket et bind et
Juste avant accept
> Ne siutilise quien mode connecté
> Largument backlog spécifie le nombre de connections
établir dans une file d’attente par le systéme lorsque le
serveur exécute l'appel accept
Accepter une connexion (serveur)
SOCKADDR_IN csins
int val;
val = accept (sock, (SOCKADDR *)&csin, sizeof (csin))
» permet d'accepter une connection
= ler argument: le socket (qui est en écoute...)
= 2éme argument : socKADDR du client connecté
= 3eme argument : la taille de I’adresse du client
retourne un identificateur du socket de réponse, ou
INVALID_SOCKET en cas d’erreurDemander une connexion (client)
int - ; |
= connect (sock, (SOCKADDR *)éssin, sizeof (sain)
» permet d'établir une connexion avec un serveur
* Ler argument : le socket
= 2eme argument : adresse de I'héte a contacter
= 3éme argument : taille de l'adresse de I'héte
= retourne 0 si la connexion a eu lieu, sinon -1
» Pour établir une connexion, le client ne nécessite
Pas de faire un bind()
Les primitives
d’échanges d'information
Emission d'information
» Une fois que le programme d’application dispose
d’un socket, il peut l’utiliser afin de transférer des
données
» 5 primitives utilisables :
send
* sendto
* sendmsg
* write
writevMode connecté
> send, write et writev ne permettent pas d'indiquer d’adresse de
destination
(int socktd, char *buff, int nbytes ) z
v (nt sock£d, iovee *vect_£/S, int 1grvect_£/S ) 7
d (int sockfd, char *buff, int nbytes, int
> socked : descripteur de socket
> bu£e : polnteur sur un tampon ol sont stockées les données &
Avoyer
> nbytes : nombre doctets ou de caractéres que Ion désire envoyer
> vect_&/s : pointeur vers un tableau de pointeurs sur des blocs qul
constituent ie message & envayer
flags : drapeau de contréle de la transmission
’
v
Mode non-connecté
1 sendto € sendnag imposent dindiquerfadresse de destination
ine aendto (int aocktG, char “buff, Ant nbytes, int flags, 1
struct sockaddr “te, ine addelen) 7
5a premiers arguments wemes que pour send
> 2 derners arguments : adresse de destination ets tlleRéception d'information
»S primitives de réception d‘information
symetriques aux appels d’envoi :
® read
* readv
* recv
* recvfrom
= recvmsg
9
Mode connecté
int read ( int sockfd, char *buft, int nbytes )
int recv (int sockfd, char “buff, int nbytes, int flags ) ;
> sockfd : descripteur du socket sur lequel les données seront lues
» buf£ : pointeur sur un buffer ol seront stockées les données lues
> nbytes : nombre maximal d’octets ou de caractéres qui seront lus
» flags : drapeau de contréle de la transmission
int readv ( int sockfd, iovec *vect_£/S, int igr_vect_8/S ) ;
> reagy permet de mettre les données iues dans des cases mémole
non contigués
» Ces cases mémoires sont pointées par un tableau de pointeurs qui lui
méme est pointe par vece./S
>» iIgr_vect_£/S est la longueur de ce tableau
»Mode non-connecté
» il faut préciser les adresses des correspondants
desquels on attend des données
int recvirom (int sockfd, char *buff, int nbytes, 7
int flags, struct sockaddr *from, int addrlen) +
>» Symétrique de sendto
int recvmsg (int sockfd, struct struct_mesg, int flags);
> Symétrique de sendmsg
> utilise la méme structure st ruct_mesg
sme: eurtor tee
2
Les ports réservés Unix
» echo 7 (top)
>» echo 7 (udp)
> systat 11 (ep users)
> daytime 13 (tep)
> daytime 13 (udp)
> netstat 15 (top)
> fip-data 20 (tep)
> 21 (tep)
> telnet 23 (tep)
> smtp 25 (tep mall)
> time 37 (tep timserver)
» time 37 (udp timserver)
>» name 42 (udp nameserver)
> whois 43 (tep nicname)
>» domain 53 (udp)
» domain 53 (tep)
»
cP
hostnames 101 (tcp hostname)
es: muATTOY eeeSERVEUR EN HODE coNNECTE
‘SERVEUR EN MODE DECONNECTE
SOCKETO
(CLIENT EN MODE DECONNECTE
SOCKETO
RECVFROMO
logue ea mend des doundes dn client
‘SENDTOOExemple :
serveur « Bienvenu sur mon serveur | »
Fichiers d’en-téte et bibliotheques
> Windows :
#include
#include "winsock2.h"
Unix :
#include
#include
#include
ewartor
Serveur
sinclude
include
‘void main()
char buter(255):
SOCKET sock, csock;
SOCKADDR_IN sin, csin;
Sock = socket(AF_INET, SOCK_STREAM, 0);
Sin sin_addrs_addr = INADDR_ANY;
INET,
ssinsin_farily “INET,
sinst_port tons 4444);
inal sack, (SOCKADDR *J&sin, sizeortsin)):
fsten(sock, 0);
while(1)
¢ int sinsize = stzeof{csin);
vuvvvevervvevereyy
fesock = accept(sock, (SOCKADDR *)8csin, Ssinsize)) !=
sata soci
2}
stees
averyClient
sinctuae
Finclade
Finctuge ewinsoa2 n>
oe
. ‘SOCKET sock:
. 'SOCKADOR IW sin;
. ‘char ourer[255);
f Sock = Socket{AP INET, SOCK STREAM, 0;
> Sinsin adds addr = inet addr("127.0.0.0":
> sinsin family AEINET:
¢ ssn.sin_port = Aeans(a444);
cannect(sock, (SOCKADOR *)8sin, sizeof(sn)
‘getcn):
lasesacket(sock);
Wsacteanupd);
Différents types de serveurs
+ Tant quil n'y a pas de connexions le serveur se bloque sur
cette appel
» Lorsqu’une demande
se termine
» Le serveur peut gérer les demi
» Itérativement
de connexion arrive, 'appel accept
andes de 2 maniéres :
= Simultanément
amerror te 28