Le contrôle WinsockLe 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.