Académique Documents
Professionnel Documents
Culture Documents
Protocole WebSocket
Pr. Omar MOUSSAOUI
o.moussaoui@ump.ac.ma
◼ associe une adresse socket (son adresse IP et le numéro de port choisi) au service
CLIENT
◼ crée un socket
◼ se connecte au serveur en donnant l’adresse socket distante (adresse IP du serveur
et numéro de port du service)
◼ Cette condition attribue automatiquement un numéro de port local au client
◼ lit ou écrit sur le socket
◼ ferme le socket
Les sockets
Utilisation des Sockets en mode connecté (TCP)
Architecture Client/serveur en mode TCP
Les sockets
Utilisation des Sockets en mode non connecté (UDP)
struct in_addr {
u_long s_addr;
}
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <errno.h>
int accept(
int socket; /* descripteur retourné par la primitive socket */
struct sockaddr *adr; /* initialisé à vide et mis à jour par accept avec le port et
l'adresse IP de la machine où se trouve le client qui a
fait un connect */
int l_adresse; /* longueur de la structure adresse*/
);
Les sockets en C sous Linux
Primitive de réception en mode TCP
retourne le nombre de caractères effectivement reçus ou -1 en cas d'erreur
ssize_t recv (
int descripteur, /* descripteur du socket*/
void *ptr, /* adresse de réception */
size_t nb_caracteres, /* indique le nombre d'octets à lire*/
int option /* = 0, MSG_PEEK pour consulter sans extraire,
MSG_OOB pour lire une donnée (1 car) urgente */
);
ssize_t send (
int descripteur, /* descripteur du socket*/
void *ptr, /* adresse d’envoi*/
size_t nb_caracteres, /* indique le nombre d'octets à lire*/
int option /* indique le type d'envoi =0 ou MSG_OOB */
);
Les sockets en C sous Linux
Primitive de réception en mode UDP
retourne le nombre de caractères effectivement reçus ou -1 en cas d'erreur
int recvfrom(
int descripteur, /* descripteur de la socket */
void * message, /* adresse de réception */
int longueur, /* taille zone réservée */
int option, /* 0 */
struct sockaddr *ptr_adresse, /* adresse émetteur */
int *ptr_longueur_adresse /* pointeur sur longueur zone adresse */
);
int sendto(
int descripteur, /* descripteur de la socket*/
void * message, /* adresse d’envoi*/
int longueur, /* longueur du message*/
int option, /* 0*/
struct sockaddr *ptr_adresse, /* adresse destination*/
int longueur_adresse /*longueur adresse destination*/
);
Les sockets en C sous Linux
Primitive close (TCP et UDP)
Le noyau essaie d’envoyer les données non encore émises avant de sortir de close().
int close (
int socket; /* descripteur de socket */
);
Primitives auxiliaires
Primitives permettant de convertir le format local (“little indian” ou “big indian”) en
format réseau (toujours “big indian”) ou bien de faire l’opération inverse.
#include <sys/types.h>
#include <netinet/in.h>
u-long htonl (u_long hostlong); /*host to network long*/
u-long ntohl (u_long hostlong); /*network to host long*/
u_short htons (u_short netshort); /*host to net short*/
u_short ntohs (u_short netshort); /*net to host short*/
Les sockets en C sous Linux
Primitives auxiliaires
Permet de construire l’adresse IP à partir du nom d’une machine.
#include <netdb.h>
struct hostent *gethostbyname (char *hostname);
▪ Avec HTTP, une requête du client avec l'en-tête Upgrade indique l'intention du
client de demander à ce que le serveur passe à un autre protocole.
▪ Avec le protocole WebSocket, la demande de mise à niveau effectuée au
serveur contient une clé unique que le serveur retournera altérée comme preuve
qu'il a accepté la demande de mise à niveau.
WebSocket: Handshake
Handshake (Poignée de main) : Requête HTTP GET upgrade, puis réponse HTTP
▪ Exemple de réponse à une demande d'établissement de liaison
▪ Le code de statut de réussite est toujours 101. Tout autre code de statut sera
interprété comme un refus de mettre à niveau vers le protocole WebSocket.
▪ Le serveur concatène la clé reçue avec une chaîne GUID fixe et il calcule le
hachage à partir de la chaîne obtenue. La valeur de hachage est ensuite
codée en Base64 et retournée au client via l'en-tête Sec-WebSocket-Accept.
NB: Lorsque la demande de mise à niveau du protocole HTTP vers le protocole Web Socket
a été validée par le serveur « Endpoint », il n’y a plus de communication possible en
HTTP, tous les échanges sont réalisés via le protocole WebSocket.
WebSocket: Transfert de données
▪ Data transfer: Une fois que l'initialisation de la connexion a été faite entre le client et le
serveur, ceux-ci sont connectés et appairés; les deux peuvent envoyer, recevoir des
messages et fermer la connexion.
▪ Une fois que le handshake est acceptée, la mise en place du protocole WebSocket
est donc acquise. Une connexion côté pair serveur est ouverte ainsi que côté pair
client, une gestion de callback est activée pour initier la communication.
▪ La phase de Data transfer peut alors entrer en jeu, c’est-à-dire que les deux pairs
peuvent désormais s'échanger des messages dans une communication
bidirectionnelle et full-duplex.