Le contrôle Winsock
Le contrôle Winsock fourni par Visual Basic 5 permet de gérer
relativement simplement un flot de données à l'aide des protocoles TCP ou
UDP. Ce contrôle est destiné à développer des applications Client /
Serveur.
I - Mise en oeuvre d'une application Client /
Serveur
Etablissement d'une connexion Client/Serveur
:
- Le serveur est à l'écoute - Le client demande
l'ouverture de la connexion - Le serveur accepte (ou non) la
connexion - Si la connexion est acceptée, elle est alors
ouverte - Les deux applications peuvent alors
communiquer
Le protocole mis en œuvre par ce contrôle est
soit UDP soit TCP. Les exemples donnés et les explications
concernent principalement TCP, cependant les différences dans
l'utilisation de ces deux protocoles sont
minimes. |
II - Les propriétés pour configurer le
contrôle Winsock
A] Application Serveur
Pour configurer le contrôle Winsock de l'application serveur, la
propriété suivante est utilisée : - LocalPort
: définit le port de communication à utiliser, ce nombre est choisi
arbitrairement, en évitant les numéros de ports déjà utilisés (80,
21…)
La configuration de l'application serveur est terminée. Il faut
cependant s'assurer que la machine qui va servir à exécuter cette
application ait une adresse IP.
B] Application Client
Deux propriétés sont à définir pour configurer l'application
client : - RemoteHost : cette propriété doit
contenir l'adresse IP de l'ordinateur sur lequel l'application
serveur est exécutée - RemotePort : le port de
communication qui va être utilisé doit être défini ici, il doit être
identique à celui utilisé par le serveur.
C] Propriétés communes
Une propriété doit être configurée identiquement pour les deux
applications : - Protocol :
Permet de choisir le protocole (TCP ou UDP). Il faut en effet que
les deux contrôles winsock communiquant ensemble "parlent" le même
protocole, c'est à dire le même langage !
D] Remarques importantes
- Visual Basic nous dit que le port de communication peut être
choisi automatiquement par le système en donnant comme valeur 0 pour
les propriétés LocalPort et RemotePort. L'utilisation de cette
possibilité reste cependant risquée et le fonctionnement aléatoire.
Il est recommandé de donner un numéro de port bien défini. Il en
existe suffisamment pour ne pas interférer avec le bon
fonctionnement du reste du système
- Toutes les valeurs de ces propriétés peuvent être données lors
de l'exécution du programme en les affectant simplement comme
n'importe quelle variable, soit en utilisant la méthode
BIND. |
III - Les contrôles utilisés dans le
fonctionnement
Le principal contrôle utilisé pour gérer le
fonctionnement de Winsock est le contrôle STATE. Il permet de
connaître à chaque instant l'état de la connexion (en attente,
ouverte, fermée, en cours de fermeture, en cours
d'ouverture…)
Exemple :
Soit un contrôle Winsock appelé WSCK. On récupèrera l'état de la
connexion grâce à la ligne de code suivante : Etat =
WSCK.state
Une constante d'état sera alors affectée à la variable état.
La propriété State peut prendre les valeurs suivantes :
Constante |
Valeur |
Description |
sckClosed |
0 |
Fermé (valeur par défaut) |
sckOpen |
1 |
Ouvert |
sckListening |
2 |
À l'écoute |
sckConnectionPending |
3 |
Connexion en attente |
sckResolvingHost |
4 |
Hôte en cours de résolution |
sckHostResolved |
5 |
Hôte résolu |
sckConnecting |
6 |
En cours de connexion |
sckConnected |
7 |
Connecté |
sckClosing |
8 |
Connexion en cours de fermeture par
l'homologue |
sckError |
9 |
Erreur | |
IV - Les méthodes les plus
utiles
Les méthodes les plus utiles pour établir, gérer et
utiliser une connexion sont :
- LISTEN : méthode utilisée
dans une application
serveur.
Le serveur devient alors à l'écoute d'une demande de connexion qui
pourra venir ultérieurement.
- ACCEPT : par cette méthode, le serveur indique au client que sa
demande de connexion est acceptée.
- CLOSE : méthode permettant au client ou au serveur de fermer la
connexion.
- GETDATA : utilisée pour récupérer les données qui ont été
reçues. Cette méthode peut être utilisée par le client ou par le
serveur. Une méthode similaire est PeekData, le buffer de réception
n'est alors pas vidé.
- SENDDATA : Cette méthode est utilisée pour envoyer des données,
du client vers le serveur ou du serveur vers le
client.
|
V - Les événements les plus
utiles
Pour gérer une connexion, on doit utiliser des
événements. Parmi ceux proposés, les suivants sont très utiles :
- ConnectionRequest : cet événement est déclenché sur le serveur
lors d'une demande de connexion émise par le client. C'est dans le
code associé à cet événement que l'on traitera l'acceptation ou le
refus de la connexion.
- DataArrival : l'arrivée de données déclenche cet événement. Il
faudra donc associer à celui-ci la méthode GetData ou PeekData.
- Error : Evénement déclenché par une erreur dans la
connexion.
Toutes les fonctionnalités du contrôle Winsock n'ont bien sur pas
été évoquées. Les informations données suffisent tout de même pour
démarrer rapidement et sûrement l'exploration et l'exploitation de
cet outil. |
VI - Exemple de mise en
oeuvre
Application SERVEUR :
Contrôle appelé
WSCK_serveur
WSCK_serveur.localport =
1234
WSCK_serveur.protocol = 0
Application CLIENT
: Contrôle
appelé WSCK_client
WSCK_client.remotehost = 10.10.1.2 (adresse IP du
serveur)
WSCK_client.remoteport =
1234
WSCK_client.protocol = 0
Etablissement de la connexion
Le serveur
doit être en mode écoute : à
WSCK_serveur.listen On peut vérifier que WSCK_serveur =
2
Le client demande l'établissement d'une connexion
: à WSCK_client.connect Un événement
ConnectionRequest est déclenché sur le serveur, on le traite à
l'aide du code suivant :
Private Sub
WSCK_serveur_ConnectionRequest (requestID As
Long) ' Test de la présence d'une connexion
déjà ouverte ' si oui, on la
ferme If WSCK_serveur.State <> sckClosed
Then WSCK_serveur.Close ' Acceptation de la
connexion WSCK_serveur.Accept requestID End
Sub
La communication est alors établie, des données peuvent être
échangées. Pour envoyer des données
Client à Serveur
: ma_donnee = "Bonjour"
WSCK_client.SendData
(ma_donnee)
Serveur à Client
: ma_donnee = "Au
revoir" WSCK_serveur.SendData
(ma_donnee)
Pour récupérer les données
:
Le Serveur récupère des données envoyées par le
client. L'événement DataArrival est déclenché
Private Sub
WSCK_serveur_DataArrival (ByVal bytesTotal As
Long)
Dim strData As
String ' Appel de la méthode
GetData ' Une chaîne de caractères (vbString)
va être placée dans la variable strData
WSCK_serveur.GetData strData, vbString
End Sub
Le
client recevra des données selon la même méthode.
PRECAUTIONS :
Cet exemple permet de
mettre en place une architecture client/serveur de base. Il est
destiné à montrer une connexion entre deux postes. Une
application de type client/serveur doit pouvoir, entre autre,
définir et gérer un certain nombre de connexions simultanées, doit
gérer une file d'attente de demandes de connexions…Toutes ces
spécificités doivent être gérées au niveau du serveur mais n'entrent
pas en ligne de compte pour ce qui est de la mise en place d'une
application "pour apprendre".
|
Merci à Alexis Rolland pour avoir écrit ce guide
!
|