Sunteți pe pagina 1din 11

TP 1 RESEAUX 

Informatiques:
Programmation Sockets avec VB

Exercice 1 :
1- Exécuter le programme suivant qui permet de récupérer la date d’un serveur.

Private Sub btnConnecter_Click()


'on nettoie le champ date heure
txtDateTime.Text = ""
'ON N'OUBLIE PAS LA FERMETURE PROPRE DU WINSOCK
'(cf.tuto) :o)
Winsock1.Close
Winsock1.LocalPort = 0
'on se connecte
Winsock1.Connect Trim$(txtHote.Text), 13
End Sub

Private Sub btnQuitter_Click()


Unload Me
End Sub

Private Sub Form_Load()


txtHote.Text = "w3.org"
txtDateTime.Text = ""
End Sub

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)


Dim donnees As String
'reception des données
Winsock1.GetData donnees, vbString
'affichage du résultat

1
txtDateTime = txtDateTime & Trim$(donnees)
End Sub

Private Sub Winsock1_Error(ByVal Number As Integer, Description As String, ByVal Scode


As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long,
CancelDisplay As Boolean)
MsgBox "Erreur Winsock n° " & Number & " (" & Description & ")", vbInformation
End Sub

Le code serveur : soketlisten

socketclient

Private Sub Form_Load()


socklisten.Close
socklisten.LocalPort = 13
socklisten.Listen

End Sub

Private Sub socklisten_ConnectionRequest(ByVal requestID As Long)


Dim d As String
sockclient.Accept requestID
d = Now
sockclient.SendData (d)
End Sub

2- Modifier le programme pour qu’il envoi un message de bonjour avant d’envoyer la date

2
Exercice 2 :
Soit les programmes suivants de chat (simple) formés de :
- programme coté client :

Private Sub cmdSend_Click()


sock.SendData (message.Text)
dialogue.Text = dialogue.Text + vbCrLf + ">" + message.Text
message.Text = ""
End Sub

Private Sub Form_Load()


sock.Connect IP, 128
End Sub

Private Sub sock_Connect()


MsgBox ("connection effectuée !")
End Sub

Private Sub sock_Error(ByVal Number As Integer, Description As String, ByVal Scode As Long,
ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay
As Boolean)
MsgBox ("connection impossible! Erreur : " & Number & " " & Description)
'Number donne le numéro d'erreur et Description donne donc la description de l'erreur ;)
End Sub

Private Sub sock_DataArrival(ByVal bytesTotal As Long)


sock.GetData donnee, vbString
dialogue.Text = dialogue.Text + vbCrLf + "->" + donnee
End Sub

- programme coté serveur :

3
Private Sub cmdSend_Click()
sockclient.SendData (message.Text)
dialogue.Text = dialogue.Text + vbCrLf + ">" + message.Text
message.Text = ""
End Sub

Private Sub Form_Load()


socklisten.LocalPort = 128
socklisten.Listen
End Sub

Private Sub socklisten_ConnectionRequest(ByVal requestID As Long)


MsgBox ("Connection venant de " & socklisten.RemoteHostIP)
sockclient.Accept requestID
End Sub

Private Sub sockclient_DataArrival(ByVal bytesTotal As Long)


sockclient.GetData donnee, vbString
dialogue.Text = dialogue.Text + vbCrLf + "->" + donnee
End Sub

1- Ecrire les programmes serveur et client.


2- Inspirer de ces programmes pour réaliser un serveur de …..
3- Réaliser un serveur qui répond automatiquement à des messages client à partir de
phrases préexistante (« bonjour », « oui c’est vrai », « une autre foix.. », « je n’ai pas
compris », « non, .. »,…) et ce d’une manière aléatoire.

4
ANNAXE A : Rappel sur les Réseaux

1   Fonctionnement des réseaux


Protocole: règles de communication. Plusieurs protocoles, organisés en couches.
Nom de la couche Protocole
Applications  
Transport TCP, UDP
Réseau IP
Liaisons des données Ethernet, TokenRing
Physique  
Un message qui est envoyé par une couche application par ex. est d'abord encapsulé dans un
message de la couche transport, lui-même encapsulé ...jusqu'à la couche physique. Puis il est
envoyé et le destinataire procède aux désencapsulations successives.

1.1   Couche physique


Caractéristiques :
 son débit (10Mbps pour Ethernet)
 connexion entre machines (en étoile autour d'un Hub, en bus...)
1.2   Liaison des données
Un exemple: Ethernet.

Transmition au mieux:
 écouter tout ce qui passe sur le cable
 si personne n'émet, alors emettre
 si collision (brouillage du signal) lors de l'emission, alors attendre puis réemettre..
Gestion simple des erreurs.

Chaque carte ethernet repérée par une adresse unique sur 6 octets (ex: ff:ee:02:43:cc:32)
1.3   Couche réseau
Un exemple : IP. Protocole libre, documentation gratuite et accessible à tous.

Chaque machine repérée par une adresse IP sur 4 octets (ex: 192.55.6.2).

Utilise algorithmes de routage pour trouver de proche en proche


1.4   Couche transport
Exemple: TCP, UDP

Caractéristiques de TCP
 mode connecté
 fiable
 utilisation de ports
Caractéristiques de UDP
 mode non connecté
 non fiable (mais plus rapide)
 utilisation de ports
Applications UDP: multimédia (vitesse primordiale), réseaux fiables (optique).

5
Annexe B: TCP/IP et Visual Basic
Tout d'abord, vous devez télécharger un OCX capable de gérer des connexions TCP/IP. Pour
Visual Basic, il existe un OCX gratuit, Winsock.ocx. C'est sur cet OCX que je vais
m'appuyer tout le long de ce 'tutorial'.

Une fois le composant installé, lancez Visual Basic, et ajoutez dans votre barre d'outils ledit
contrôle. Vous verrez alors aparaître cette icône dans votre boite à outils :  
Clickez alors sur cette icône et insérez un contrôle sur votre feuille. Voilà ! votre application
peut maintenant gérer des connexions TCP/IP...

I) Les propriétés du contrôle Winsock.ocx


1- Les propriétés disponibles au moment de la création
Propriété Description

Name
A l'instar de tous les contrôles OCX, MS Winsock control a besoin d'un nom
unique qui vous servira à appeler ses méthodes...
Si vous voulez charger plusieurs contrôles réagissant de la même manière, il est
Index
plus intelligent de charger un groupe de contrôles que de placer
manuellement l'intégralité des sockets.... Index est le numéro du MS Winsock
control que vous venez d'installer ...
Left Distance entre le bord gauche de la feuille et le contrôle ...
LocalPort
(Facultatif) Si le contrôle va écouter sur un port (pour faire un serveur),
LocalPort doit avoir ce port comme valeur
Protocol
Protocole utilisé pour la connexion... Si vous ne savez pas ce qu'est TCP/IP et
UDP/IP laissez la valeur par défaut
RemoteHost Adresse à laquelle est connecté le contrôle
RemotePort Port sur lequel est connecté le contrôle
Top Distance entre le haut de la feuille et le contrôle

2- Les propriétés disponibles au moment de l'exécution


LocalHostName Host address de la machine sur laquelle est lancé le programme.
LocalIP
Adresse numérique (ou adresse IP) de la machine sur laquelle est lancé le
programme
RemoteIP Adresse numérique (ou adresse IP) auquel est connecté le contrôle

II) Les méthodes du contrôle Winsock.ocx  


Méthode Description

6
Close() Coupe la liaison avec le serveur auquel est connecté le contrôle
Connect() Connecte le contrôle à un serveur TCP/IP
GetData()
Retourne une chaîne de caractères contenant les informations que la machine
connectée au contrôle a envoyé
SendData() Envoie à la machine connectée une chaîne de caractères
Accept()
S'utilise lorsqu'une socket écoute sur un port. La méthode Accept() permet
d'accepter la demande de connexion.
Listen() Permet à une socket d'écouter sur un port.

  

III) Les events du contrôle Winsock.ocx


Events Description

Close Survient lorsque la connexion avec la machine distante a été perdue


Connect Survient lorsque la connexion est effectuée
connexionRequest
Survient lorsqu'une demande de connexion est effectuée sur une socket
écoutant un port
DataArrival Survient lorsque la socket reçoit des informations
Error Survient lors d'une erreur (doh!)
SendComplete Survient lorsque la socket a fini d'envoyer des informations
SendProgress Survient lorsque la socket envoie des informations

IV) Du Code
1)  connecter a un serveur

Pour se connecter a un serveur, il faut utiliser la méthode Connect. La syntaxe est


    <Objet>.Connect <Adresse> <Port>

Exemple :
    Winsock1.Connect "www.blah.org", 80
ou
    Winsock1.RemoteHost = "www.blah.org"
    Winsock1.RemotePort = 80
    Winsock1.Connect

Ces lignes de code permettent de connecter l'objet Winsock1 au serveur www.blah.org sur le
port 80.
Si la connexion s'effectue, l'event Connect surviendra. Si vous voulez par exemple avertir
l'utilisateur que votre programme est bien connecté, vous pouvez ajouter la ligne de code
suivante dans l'event Connect

7
    sub Winsock1_Connect()
        call msgbox("Connecté")
    end sub

En revanche si la connexion ne peut pas s'effectuer, l'event Error surviendra. Vous pouvez
donc de la même manière avertir l'utilisateur en ajoutant par exemple la ligne de code
suivante dans l'event Error

     Private Sub Winsock1_Error(ByVal Number As Integer, Description As


String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As
String, ByVal HelpContext As Long, CancelDisplay As Boolean)
        call msgbox("connexion impossible " & Description)
    end sub

La déclaration de la sub est compliquée. les paramètres les plus importants sont Number et
Description. Number est le numéro de l'erreur et Description une chaîne de caractères
décrivant cette erreur...

2)  envoyer des données

L'envoi de données se fait grâce à la méthode SendData dont la syntaxe est


    <Objet>.SendData <Texte>

Exemple :
    Winsock1.SendData "Coucou"

La ligne précédente enverra au serveur auquel Winsock1 est connecté le texte "Coucou".

NOTE : Si vous vous connectez à un serveur qui n'a pas été créé par vous, il peut être
nécessaire d'envoyer la constante VbCrlf après les données pour que le serveur réagisse.
Exemple :
    Winsock1.SendData "Coucou" & Vbcrlf

3)  recevoir des données

Quand des données sont reçues, l'event DataArrival se produit. Pour récupérer ces données
il faut utiliser la méthode GetData() dont la syntaxe est
     <Objet>.GetData <String>, VbString

Exemple :
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
    Winsock1.GetData Data$, VbString
End Sub

Ces lignes placent les données reçues par Winsock1 dans le buffer Data$. La variable
bytesTotal contient le nombre d'octets reçus avant que l'event se produise.

4) créer un serveur
Dans le cas du serveur, il faut utiliser deux composants winsock. Un premier qui permet
d'écouter les connexions entrantes "socklisten", et un deuxième qui sert à la connexion même
"sockclient".

8
Au démarrage de l'application, on demande au composant d'écouter les connexions entrantes
grâce aux deux lignes :

socklisten.LocalPort = 128
socklisten.ListenLocalPort

désigne le port que l'on veut écouter, dans notre cas, c'est le port 128.

Lorsque le composant recoit une demande de connexion, la procédure ConnectionRequest est


éxécutée.

Private Sub socklisten_ConnectionRequest(ByVal requestID As Long)


MsgBox ("Connection venant de " & socklisten.RemoteHostIP)
sockclient.Accept requestID
End Sub

On affiche d'abord l'IP de l'ordinateur demandant la connexion, puis on accpete la connexion.

On va se contenter d'afficher simplement les messages arrivant par le composant "sockclient"


grâce à l'évènement DataArrival.

Private Sub sockclient_DataArrival(ByVal bytesTotal As Long)


sockclient.GetData donnee, vbString
Text1.text=donnee
End Sub

Le deuxième argument de la méthode GetData est facultative. Elle sert juste à définir quelle
type de données on reçoit.

Un serveur est un programme qui accepte les connexions entrantes, et gère des données
fournis par le client.

5) créer un serveur concurrent

Créer un serveur est plus compliqué qu'un client. En effet, le programme doit écouter les
connexions, gérer les déconnexions, et enfin gérer les informations envoyées par l'utilisateur.
Pour créer un serveur, il faut deux sockets. Une qui écoute les demandes de connexion, et une
qui les accepte. Nos deux sockets s'appelleront sckListen et sckClient.

NOTE : Utilisez toujours des noms évocateurs, car sinon vous vous perdrez dans un
labyrinthe de noms qui vous emmènera sans fautes au bugs...
Créer sckListen ne pose pas de problèmes. Créer sckClient non plus si ce n'est qu'il faut
déclarer sckClient comme un groupe de contrôles en assignant à sa propriété Index la valeur
0. Cela permettra au serveur d'accepter plus d'une seule connexion sans gaspiller temps et
mémoire. Il serait en effet 'stupide' de créer 80 contrôles sur la feuille pour que le serveur
puisse être multi-utilisateur.

Passons au code lui-même. Il faut tout d'abord créer deux variables globales appelées
LastIndex et UserOnLine. Créez un module et tapez ceci dedans :

9
    Global LastIndex as integer
    Global UserOnLine as integer

UserOnLine conservera le nombre de clients connectés sur le serveur. LastIndex conservera


en mémoire le dernier contrôle chargé.

Pour que le serveur puisse fonctionner, il faut qu'il écoute sur un port. Dans la procédure Sub
Form_Load() tapez les deux lignes de code suivantes :

    sckListen.LocalPort = 666


    sckListen.Listen

Votre fenêtre devrait ressembler donc à ça :

    Private Sub Form_Load()


        sckListen.LocalPort = 666
        sckListen.Listen
    End Sub

Voilà! Le serveur écoute les connexions. Mais tant qu'il ne les accepte pas, il ne sert à rien.
Ajoutons les lignes de code adéquates. Dans la procedure sckListen_connexionRequest()
ajoutez les lignes suivantes :

    UserOnLine = UserOnLine  + 1


    LastIndex = LastIndex +1
    Load sckClient(LastIndex)
    sckClient.Accept Requestid

Votre fenêtre devrait ressembler à ça :

    Private Sub sckListen_connexionRequest(ByVal requestID As Long)


        UserOnLine = UserOnLine  + 1
        LastIndex = LastIndex +1
        Load sckClient(LastIndex)
        sckClient.Accept Requestid
    End Sub

Victoire ! Le serveur écoute les connexions et les accepte ! Vous pouvez tout de suite vous
connecter sur votre serveur avec telnet par exemple en tapant sur une ligne de commande dos
telnet 127.0.0.1 666

Le telnet va se connecter et.... Rien... Remédions à cela : imaginons un serveur qui soit un dé.
Quand le serveur reçoit le caractère "?" il envoie un nombre compris entre 1 et 6... Modifions
un peu le code et surtout la procédure sckClient_DataArrival(). Ajoutez ces quelques
lignes :

    sckClient(Index%).GetData Data$, VbString


    if left$(Data$,1) = "?" then
        Randomize Timer
        sckClient(index%).SendData Str$(Int((Rnd * 6) +1)) & VbCrlf
    end if

10
Lancez le serveur, connectez vous avec telnet dessus, et envoyez un point d'interrogation....
Le serveur renvoie aussitôt un nombre comprit entre un et six : votre serveur marche à
merveille !

Voilà! Il ne reste plus que quelques lignes à ajouter pour terminer le travail proprement....
Dans sckClient_Close() tapez ces lignes :

    sckClient(Index%).Close
    unload sckClient(Index%)
    UserOnLine = UserOnLine - 1
    if UserOnLine = 0 then LastIndex = 0

Voila. Là c'est terminé... Vous savez maintenant créer un serveur multi-utilisateur, répondant
aux actions de l'utilisateur, envoyant des données et en recevant... Bravo !
Les programmeurs un peu expérimentés remarqueront que la manière de gérer les indices du
groupe de contrôles est peu esthétique. Mais elle est efficace, et le but de cet article n'est pas
d'apprendre à gérer les indices des connexions à l'aide d'un tableau dynamique.

11

S-ar putea să vă placă și