Club Francophone des développeurs Visual Basic


  Vb-French  Vb-English  Autres langages
               Rajoutez votre site

 

Le contrôle Winsock

Lundi 12 juillet 2004

Gilmir Langlade informatique

Tutoriel 35    Sommaire
                                                            LE CONTROLE WINSOCK
 

Le contrôle Winsock, invisible à l'utilisateur, permet aux développeurs sous Microsoft Access, Visual Basic, Visual C++ ou Visual FoxPro, d'accéder facilement aux services de réseau TCP (Transfer Control Protocol) et UDP (User Datagram Protocol). Il n'est pas nécessaire de comprendre tous les détails d'une connexion TCP, ni de faire appel aux API Winsock de bas niveau pour écrire des applications client ou serveur. Il suffit de définir les propriétés et d'invoquer les méthodes du contrôle pour assurer la connexion vers une machine distante et pouvoir échanger des données dans l'une ou l'autre direction.

Éléments fondamentaux du protocole TCP

Le protocole de contrôle de transfert (TCP, Transfer Control Protocol) vous permet d'établir et de maintenir une connexion vers un ordinateur distant, qui permet aux deux ordinateurs d'échanger des données.

Pour créer une application client, vous devez connaître le nom de l'ordinateur serveur ou son adresse IP (propriété RemoteHost), ainsi que le port (propriété RemotePort) sur lequel il "sera à l'écoute", puis invoquer la méthode Connect.

Pour créer une application serveur, définissez le port (propriété LocalPort) de communication, et invoquez la méthode Listen. L'événement ConnectionRequest sera déclenché lorsque l'ordinateur client demandera une connexion. L'appel de la méthode Accept au sein de l'événement ConnectionRequest permet d'établir la connexion.

Une fois la connexion réalisée, chacun des ordinateurs peut envoyer et recevoir des données. La méthode SendData permet d'envoyer des données. À la réception des données, l'événement DataArrival se produit. L'appel de la méthode GetData dans l'événement DataArrival permet de récupérer les données.

Éléments fondamentaux du protocole UDP

Le protocole utilisateur Datagram (UDP, User Datagram Protocol) est un protocole sans connexion. Contrairement aux opérations TCP, les ordinateurs n'établissent pas de connexion. Une application UDP peut donc être client ou serveur.

Pour transmettre des données, définissez d'abord la propriété LocalPort de l'ordinateur client. L'ordinateur serveur doit alors affecter l'adresse Internet de l'ordinateur client à la propriété RemoteHost, et affecter à RemotePort le même port que celui attribué à la propriété LocalPort de l'ordinateur client, puis invoquer la méthode SendData pour commencer l'envoi de messages. L'ordinateur client utilise alors la méthode GetData dans l'événement DataArrival pour récupérer les messages envoyés.

Les propriétés
Les méthodes
Les événements
Un exemple d'applications client/serveur
 

1. Les propriétés du contrôle Winsock

Pour utiliser Winsock correctement, il est très important de bien paramétrer les propriétés de ce dernier, faute de quoi, votre application ne marchera. Notez que certaines de ses propriétés ne sont accessibles que lors de l'écriture du code. Toutes les propriétés du contrôle ne sont pas expliqués. Seuls, les plus importantes le sont et les voici:

BytesReceived
Indique en octets, les données présentes dans la mémoire tampon de réception. Cette propriété n'est disponible que lors de l'exécution de l'application et n'est pas modifiable. La valeur retournée est un nombre entier
LocalHostName
Retourne le nom du serveur local. Cette propriété n'est disponible que lors de l'exécution de l'application et n'est pas modifiable. La valeur retournée est une chaîne de caractères.
LocalIP
Retourne l'adresse IP du serveur local. Cette propriété n'est disponible que lors de l'exécution de l'application et n'est pas modifiable. La valeur retournée est une chaîne de caractères.
LocalPort
Retourne le numéro du port local. Cette propriété est disponible et modifiable aussi bien lors de la conception que lors de l'exécution de l'application. La valeur retournée est un nombre entier.
Protocol
Retourne le protocole utilisé. Vous avez le choix entre le mode TCP ou UDP.
  • Le mode TCP vous permet d'établir et maintenir une connexion à un serveur donné.
    Pour l'application Client, il vous faut le nom du serveur auquel vous vous connectez ou bien son adresse IP ainsi que le port sur lequel vous êtes connecté. Utilisez ensuite la méthode Connect pour vous connecter.
    Pour l'application serveur, il vous faut connaître le port sur lequel l'application Client est connecté. Faites ensuite appel à la méthode Listen pour chercher à savoir si l'application Client cherche à se connecter au serveur. Si c'est le cas, l'événement ConnectionRequest est activé et pour que la connexion entre l'application Client et celle du serveur soit maintenue, faites appel à la méthode Accept.
    Enfin, après que la connexion soit maintenue, faites appel aux méthodes SendData et Getdata pour envoyer et recevoir des données.
  • Le mode UDP(User Datagram Protocol) est un protocole qui n'établit pas de connexion. Ainsi, la relation de client/serveur disparaît. L'application peut donc être aussi bien cliente que serveur. La distinction n'est plus faite avec ce mode.
RemoteHost
Retourne le nom du serveur distant. Cette propriété est disponible et modifiable aussi bien lors de la conception que lors de l'exécution de l'application.
RemotePort
Retourne le numéro du port distant. Cette propriété est disponible et modifiable aussi bien lors de la conception que lors de l'exécution de l'application. La valeur retournée est un nombre entier.
State
Retourne l'état de la connexion. Pour finir, voici les différents états possibles de la propriété "State":

ETAT CONSTANTE VALEUR
Fermé(par défaut) sckClosed 0
Ouvert sckOpen 1
A l'écoute sckListening 2
Connexion suspendu sckConnectionPending 3
Recherche du serveur distant sckResolvingHost 4
Serveur distant trouvé sckHostResolved 5
Connexion en cours sckConnecting 6
Connecté sckConnected 7
Fin de connexion avec l'application client sckOpen 8
Erreur sckError 9
 

2. Les méthodes du contrôle Winsock


Passons maintenant aux méthodes les plus importantes du contrôle Winsock.

Accept
Cette méthode sert à montrer que le serveur a accepté la connexion de l'application client. Mais avant, il faut que la propriété "State" du contrôle soit paramétrée à "sckListening". Enfin, cette méthode n'est utilisée que durant l'événement "ConnectionRequest".
Close
Cette méthode met fin à la connexion TCP entre les applications client et serveur.
GetData
Cette méthode permet de récupérer les données stockées dans la mémoire tampon.
Listen
Cette méthode permet au serveur d'être à l'écoute des requêtes TCP provenant de l'application client.
SendData
Cette méthode permet d'envoyer les données soit à l'application client, soit au serveur.
Connect
Cette méthode permet de se connecter à l'ordinateur distant. Elle doit être suivie des arguments RemoteHost et Remoteport en les séparant par une virgule.


3. Les événements du contrôle Winsock


Pour finir, faut que je vous montre l'utilisation des événements. Ces événements sont très utiles pour le contrôle Winsock.
Close
Cet événement se déclenche quand l'ordinateur distant clôt la connexion.
Connect
Cet événement se déclenche quand l'ordinateur distant a réussi à établir la connexion.
ConnectionRequest
Cet événement se déclenche quand le serveur reçoit une requête provenant de l'application client.
DataArrival
Cet événement se déclenche quand l'application reçoit des données.
SendComplete
Cet événement se déclenche quand l'envoi des données est terminé.
SendProgress
Cet événement se déclenche quand les données sont en cours d'envoi.
Error
Cet événement se déclenche quand une erreur apparaît.

4. Un exemple d'applications client/serveur


Il ne suffit pas de connaître les propriétés et méthodes du contrôle Winsock pour pouvoir l'utiliser correctement. Voici comment l'utiliser à l'aide d'un exemple.

Le code suivant est celui d'un exemple d'application client simplifié.

Option Explicit
Private Sub Connexion_Click()
If Winsock.State <> sckConnected Then
Winsock.RemoteHost = "127.0.0.1"
Winsock.RemotePort = 1007
Winsock.Connect
Else
MsgBox "Vous êtes déjà connecté"
End If
End Sub

Private Sub Quitter_Click()
Winsock.Close
End
End Sub

Private Sub Recherche_Click()
If Text1.Text <> "" Then
If Winsock.State = sckConnected Then
Winsock.SendData Text1.Text
Else
MsgBox "Non connecté au serveur"
End If
Else
MsgBox "Veuillez tapez le nom!"
End If
End Sub

Private Sub Winsock_DataArrival(ByVal bytesTotal As Long)
Dim strData
Winsock.GetData strData, vbString
Text2.Text = strData
End Sub

Explication du code de l'application client :

La procédure "Connexion_Click( )" sert à se connecter au serveur où les données que l'on cherche à savoir, sont stockées.
  • L'instruction de test "If...Then...Else...End If" sert à savoir si l'application client est déjà connecté ou pas au serveur.
  • Dans le cas où il n'est pas connecté au serveur, on le connecte au serveur. Mais avant, il faut lui fournir des informations sur le serveur, à savoir son adresse IP("RemoteHost") et le port("RemotePort") où sera établi la connexion. Il ne vous reste plus qu'à vous connecter à l'aide de la méthode Connect.
  • Dans le cas où il est déjà connecté au serveur, on affiche tout simplement un message indiquant que vous êtes déjà connecté.
La procédure "Quitter_Click( )" sert à mettre fin à la connexion avec le serveur.
  • Pour cela, nous faisons appel à la méthode Close.
  • Enfin, utilisez l'instruction End pour quitter l'application.
  • Il ne faut surtout pas oubier de mettre fin à chaque fois à une connexion à un serveur car cela peut provoquer des erreurs.
La procédure "Recherche_Click( )" sert à faire une requête auprès du serveur afin de trouver les données que l'on cherche.
  • La première instruction de test sert à savoir si le champ de texte(Text1) est vide.
    • Si ce n'est pas le cas, on fait appel à une autre instruction de test pour savoir si vous êtes déjà connecté ou pas. Si vous l'êtes, alors, on fait appel à la méthode SendData Pour envoyer au serveur ce qui est contenu dans le champ "Text1" et récupérer des infos sur le mot que vous avez entré dans ce champ. Si c'est le cas, alors un message vous indiquant que vous n'êtes pas encore connecté au serveur, est affiché.
    • Si c'est le cas, un message vous indiquant que le champ "Text1" est vide, est affiché à votre écran.
La procédure "Winsock_DataArrival(ByVal bytesTotal As Long)" sert à recevoir les données du serveur.
  • Pour cela, on fait appel à la méthode GetData suivi de l'argument dans lequel les données seront stockées et enfin suivi du type de cet argument.
  • Enfin, on affecte au champs "Text2" les données que l'on a reçu du serveur.

Le code suivant est celui d'un exemple d'application serveur. Les données que l'on cherche, sont stockées dans une base de données que l'on accède à l'aide du contrôle "Data". Il y aussi une chose à rajouter dans la propriété du contrôle "Winsock". Dans sa propriété "Index", mettez "0". Cela correspond au nombre de personnes connectées au serveur mais aussi au nième contrôle Winsock(groupe contrôle). En effet, à chaque fois que vous l'incrémentez, un "nouveau" contrôle Winsock est chargé à l'aide de la méthode "Load".

Option Explicit
Private Sub Form_Load()
Label6.Caption = Winsock(0).LocalHostName
Label4.Caption = Winsock(0).LocalIP
Winsock(0).LocalPort = 1007
List1.AddItem ("A l'écoute du port:" & Winsock(0).LocalPort)
Winsock(0).Listen
End Sub

Private Sub Winsock_ConnectionRequest(index As Integer, ByVal requestID As Long)
Dim Message As String Message = "ID de la connexion " & requestID & " de " & Winsock(index).RemoteHostIP
List1.AddItem (Message)
index = index + 1
Load Winsock(index)
Winsock(index).Accept requestID
Label5.Caption = index
End Sub

Private Sub Winsock_DataArrival(index As Integer, ByVal bytesTotal As Long)
Dim InData, OutData
Dim requete As String
Winsock(index).GetData InData, vbString
requete = "select from * where Nom='" & strData & "'"
Data.RecordSource = requete
strOutData = Data.Recordset.Fields("Passe")
Winsock(index).SendData OutData
End Sub

Private Sub Winsock_Close(index As Integer)
List1.AddItem ("Déconnexion de: " & Winsock(index).RemoteHostIP)
index = index - 1
Label5.Caption = index
Winsock(index).Close
EEnd Sub

Explication du code de l'application serveur:

La procédure "Form_Load()" va permettre au chargement de l'application, de placer dans deux contrôles "Label", le nom du serveur ainsi que son adresse IP. Ensuite, on indique au serveur sur quel port("LocalPort"), il doit se mettre en écoute. Ensuite, il est indispensable de placer le serveur à l'écoute de requêtes de connexion. Pour cela, on fait appel à la méthode Listen.

La procédure "Winsock_ConnectionRequest(index As Integer, ByVal requestID As Long)" sert à traiter les requêtes de connexions. L'instruction "index = index + 1" sert à indiquer qu'une nouvelle requête de connexion est faite au serveur. On charge un "nouveau" contrôle Winsock qui gère cette requête. Pour accepter cette requête, on fait appel à la méthode Accept suivi de l'argument "requestID".

La procédure "Winsock_DataArrival(index As Integer, ByVal bytesTotal As Long)" sert à recevoir les données provenant de l'application client et vice-versa. Pour recevoir les données, on fait appel à la méthode GetData. Pour envoyer des données, on fait appel à la méthode SendData

Enfin, la procédure "Winsock_Close(index As Integer)" sert à mettre fin à une connexion. A chaque fois, qu'une personne se déconnecte, la propriété "Index" est décrémenté de 1. Pour fermer la connexion, utilisez la méthode Close.

Prochain Tutoriel :
   

VisualBasic6.org est hébergé par Gilmir.com