SOCKETS
Samia BOULKRINAT
( Basé sur le cours de Assia HACHICHI )
Module
CAR
1/16
SOCKETS
Plan
I – Programmation réseau
Introduction et rappels sur les sockets
Sockets TCP
Pool de connexion
Module
CAR
2/16
I- Introduction et rappels sur les sockets
Socket : connecteur réseau
• Communication inter processus à distance
• Envoi et réception de messages via un réseau
• Socket = interface de programmation (API) avec les services du
système d’exploitation pour exploiter les services de communication
du système (local ou réseau)
• Une socket est un demi-point de connexion d’une application
Module
CAR
3/16
I- Introduction et rappels sur les sockets
Couche 7 Application Logiciels NFS
Couche 6 Présentation Représentation indépendante des données XDR
Couche 5 Session Etablit et maintien des sessions RPC
Couche 4 Transport Liaison entre applications de bout en bout, TCP, UDP
fragmentation, éventuellement vérification Multicast
Couche 3 Réseau Adressage et routage entre machines IP
Couche 2 Liaison Encodage pour l’envoi, détection d’erreurs,
synchronisation Ethernet
Couche 1 Physique Le support de transmission lui-même
Module
CAR
4/16
I- Introduction et rappels sur les sockets
Liaison par flux : Socket/ServerSocket (TCP)
• Connecté : protocole de prise de connexion (lent)
• =>communication uniquement point à point
• Sans perte : un message arrive au moins un fois
• Sans duplication : un message arrive au plus une fois
• Avec fragmentation : les messages sont coupés
• Ordre respecté
• Communication de type téléphone
Liaison par datagram : DatagramSocket/DatagramPacket (UDP)
• Non connecté : pas de protocole de connexion (plus rapide)
• Avec perte : l’émetteur n’est pas assuré de la délivrance
• Avec duplication : un message peut arriver plus d’une fois
• Sans fragmentation : les messages envoyés ne sont jamais
Module coupés
CAR • =>soit un message arrive entièrement, soit il n’arrive pas
• Ordre non respecté
• Communication de type courrier
5/16
I- Introduction et rappels sur les sockets
Fiabilité Ordre Connexion
Est-ce que les Est-ce que les messages Les échanges de
messages sont arrivent dans le même ordre données sont-ils
garantis sans erreur ? que celui de leur émission ? organisés en cx ?
TCP Oui Oui Oui
UDP Non Non Non
Module
CAR
6/16
I- Introduction et rappels sur les sockets
Une socket est identifiée par :
• Une adresse IP : une des adresses de la machine (ou toutes)
• Un port : attribué automatiquement ou choisi par le programme
• Adresse de Socket = Adresse IP + port
• Une socket communique avec une autre socket via à son
adresse
• Flux : une socket se connecte à une autre socket via son adresse
de socket
Module
CAR
• Datagram : une socket envoie/reçoit des données à/d’une autre
socket identifiée par son adresse de socket
7/16
TCP - Fonctionnement
• Serveur crée une socket et attend une demande de
connexion
• Client envoie une demande de connexion
• Serveur accepte connexion
Module
CAR • Dialogue client/serveur en mode flux
• Fermeture de connexion à l'initiative du client ou du serveur
8/16
TCP - Fonctionnement
Module
CAR
9/16
Sockets UDP - Exemple
Soit à réaliser une calculatrice Windows Standard avec une
architecture Client / Serveur.
La communication entre le Client et le Serveur se fait par socket
UDP.
Module
CAR
10/16
Projet UdpServeur – Classe serveur
using System;
using [Link];
using [Link];
namespace UdpServeur
{
class serveur
{
static void Main(string[] args)
{
int P = 8080;//port de connexion
IPEndPoint ip = null;
//Demarage su serveur
[Link]("Demarage du serveur...");
UdpClient serveur = new UdpClient(P);
bool loop = true;
while (loop)
{
//Attente de connexion
[Link]("Attente de connexion(s)...");
byte[] tmp = [Link](ref ip);
//Conversion des bytes en string (chaine de caractere)
string data = new [Link]().GetString(tmp);
//Dechifrage de la commande -->ip:port:command
Module string[] cmd = [Link](new char[] { ':' });
CAR
//adresse ip
string host = cmd[0];
//port de connexion
int port = [Link](cmd[1]);
11/16
Projet UdpServeur - Classe serveur (Suite)
//recuperation de nb1 du signe et de nb2
int nb1 = [Link](cmd[2]);
string signe = cmd[3];
int nb2 = [Link](cmd[4]);
int resultat = 0;
[Link]("Operation --> " + nb1 + " " + signe + " " + nb2);
//execution de la commande
switch (signe)
{
case "+": resultat = nb1 + nb2; break;
case "-": resultat = nb1 - nb2; break;
case "*": resultat = nb1 * nb2; break;
case "/": resultat = nb1 / nb2; break;
case "<>": resultat = 0; loop = false; break;
default: resultat = 0; break;
}//fin du switch
string reponse = nb1 + " " + signe + " " + nb2 + " = " + resultat;
//conversion du resultat en bytes
byte[] rep = [Link]([Link]());
[Link](rep, [Link], host, port);
}//fin du while
Module //arret du serveur
CAR [Link]("Arret du serveur...");
[Link]("Arret du serveur... *Entree* pour terminer.");
[Link]();
}
}
}
12/16
Projet Client – Classe UDPClient
using System;
using [Link];
using [Link];
namespace Client
{
class UDPClient
{
static void Main(string[] args)
{
[Link]("Initialisation du client...");
client proc = new client(8081, "[Link]", 8080);
string x, y, signe, command, resultat = "";
while (true)
{
[Link](" ");
[Link]("COMMANDE -> Pour quitter x = 0\n");
//entrer x
[Link]("x = "); x = [Link]();
//terminer si x = 0
if ([Link](x) == 0) break;
//entrer le signe
[Link]("signe : "); signe = [Link]();
//entrer y
[Link]("y = "); y = [Link]();
Module command = x + ":" + signe + ":" + y;
[Link](command, ref resultat);
CAR [Link]("RESULTAT -> " + resultat);
}
}
}
}
13/16
Projet Client – Classe client
using System;
using [Link];
using [Link];
namespace Client {
class client {
private int clientPort = -1;//port du client
private int serveurPort = -1;//port du serveur
private string serveurHost = null;//adresse du serveur
UdpClient Client = null;//le client
//constructeur
public client(int clientPort, string serveurHost, int serveurPort) {
[Link] = clientPort;
[Link] = serveurHost;
[Link] = serveurPort;
[Link] = new UdpClient(clientPort); }
public void Close() { [Link](); }
public bool Execute(string command, ref string resultat)
{ bool ok = true;
//commande a envoyer
string req = "[Link]:" + [Link] + ":" + command;
//conversion de la commande en byte
byte[] rq = [Link]([Link]());
//envoi de la commande
[Link](rq, [Link], [Link], [Link]);
//variable de reception du resultat
Module IPEndPoint ip = null;
CAR //reception
byte[] r = [Link](ref ip);
//conversion
resultat = [Link](r);
ok = ;
return ok;
} } } 14/16
TCP - Suite
Asynchronisme :
• Read et Write synchrone
• Asynchronisme avec BeginRead/EndRead et BeginWrite/EndWrite
Autres protocoles de transport :
• Classe Socket
• Fonctionnement identique API C socket : bind/listen/connect
• Socket TCP/UDP/multicast IP, read/write sync/async
Module
CAR
15/16
Pool de connexion
Connexions réseau coûteuse
• En ressources occupées
• En temps mis pour ouvrir/fermer les connexions
But du pool : mutualiser les connexions entre deux machines.
Ex. : pool de connexion vers un SGBD
• Tous les programmes n'ont pas forcément besoin
de toutes les connexions en même temps
• Le pool peut restreindre ou adapter le # de connexions
simultanées
Module Si les programmes ont besoin de plusieurs connexions
CAR
=> Politique de gestion de ressources partagées
=> Problème "classique" : réservation, interblocage, …
16/16