Tutorial winsock tcp/ip serveur client , multi clients etc , ce ki fo savoir quoi ;)

Contenu du snippet

TUTORIAL - Comment qu'on se sert du contrôle Winsock en VB ? - Niveau : neuneu à rôdé

Premièrement, après avoir ouvert votre nouveau projet, rajoutez le contrôle Winsock parmi les composants disponibles : pour comprendre comment qu'il marche, c'est déjà bien de l'avoir sous la main. (« comment on fait ? » - menu Projet puis Composant, ou plus rapidement clic-droit sur le panneau des contrôles puis composant, et allez chercher le machin « Microsoft Winsock Control » ou du genre. si vous l'avez pas c'est con.)

Pour comprendre, un peu de théorie : un ctrl Winsock peut établir un lien avec un seul autre ctrl Winsock pour faire transiter des données en passant par un port. En gros chaque port libre correspond à un tuyau prêt à y emboîter de chaque côté un Winsock, ce qui en fait donc 2 par tuyau, entre lesquels des données vont transiter. Ok ?
Pour info, ya environ 65000 tuy. heu. ports !

Ensuite faut bien comprendre la notion de Client / Serveur (ce tut' est axé TCP : UDP c'est nul.on s'en bat pour aujourd'hui) : pour connecter les 2 winsocks qu'on veut qu'ils se parlent, y'en a 1 des 2 qui doit attendre l'appel de l'autre, comme nous au téléphone avec mamie. Celui qui attend le coup de fil, c'est le SERVEUR, l'autre celui qui compose le numéro c'est le CLIENT. C'est lui qui va devoir connaître l'adresse IP et le port du serveur, en bref le numéro de téléphone. Pour les gros déb', l'IP est un numéro unique identifiant la machine sur le réseau auquel elle est connectée, et le port comme je l'ai dit tout à l'heure c'est le tuyau qu'on veut prendre pour faire passer la flotte (de bits).

Bon, pour ce tut', on va procéder relax, c'est à dire qu'on va pas se prendre la tête avec des syntaxes barbares etc, on va juste analyser un ou deux exemples très explicites (du moins je l'espère pour vous). Alors on y va comme ça :

On place 2 winsock sur la feuille : on nomme le premier « Winsock » (sisi allez faites l'effort de retirer le « 1 » du « Winsock1 » standard.) et le second on va l'appeler « Wck ».

Les petits malins auront compris qu'on va faire un truc du genre :
Winsock======tuyau======Wck

Et hop on démarre la prog' :

§ Private Sub Form_Load()
§ Winsock.LocalPort =12666 'rq : la propriété aurait pu être défini directement
§ Winsock.Listen
§ End Sub

Avec ce bout de code, le ctrl « Winsock » s'est placé sur le port 12666 (un port comme un autre ne cherchez pas à comprendre, j'aurais pu mettre 21478 il aurait été libre se serait la même embrouille.) et il s'est mis en ECOUTE. Ca veut dire qu'il attend un coup de fil d'un pote ; il est SERVEUR. Ca tombe bien car on va faire en sorte que « Wck » l'appelle :

On va pour ça rajouter un bouton « BTconnec » et on va y placer le code suivant :

§ Private Sub BTconnect_Click()
§ Wck.Connect "127.0.0.1", 12666
§ End Sub
Et en prime on va même écrire tout ça en plus :

§ Private Sub Winsock_ConnectionRequest(ByVal requestID As Long)
§ Winsock.Close
§ Winsock.Accept requestID
§ End Sub

§ Private Sub Wck_Connect()
§ MsgBox "Trouvé"
§ End Sub

Maintenant si on lance l'appi, qu'on clique sur le bouton, alors le ctrl « Wck » (qui est le client ici vous l'avez compris puisque l'autre c'est le serveur.) va tenter la connexion sur « 127.0.0.1 » (c'est l'adresse de votre machine, toujours, c'est un raccourci quoi) et 12666 (le port sur lequel le serveur attend).

Et bien sûr, il tente ET il trouve car le serveur existe ET attend effectivement sur ce port puisqu'on la paramétrer pour ! Donc « Wck » déclenche l'événement « Wck_Connect » dans lequel on a mis une petite ligne de code afin qu'à l'éxécution vous ayez bien la preuve que ça marche ! Bien sûr c'est facultatif !

De son côté, le serveur « Winsock » reçoit l'appel de « Wck » et déclenche l'événement « Winsock_ConnectionRequest(ByVal requestID As Long) » : comme nous au téléphone quand on suppose que c'est mamie qui appelle, on peut décider de décrocher ou non : ici on va décrocher. Donc on ferme l'écoute de « Winsock » pour qu'il soit prêt à répondre et on répond. Simple non ? A partir de maintenant ils sont prêt à correspondre !

Mais comment faire pour qu'il corresponde ? Easy :

On va faire un deuxième bouton, « BTenvoie », avec ce code :

§ Private Sub BTenvoie_Click()
§ Wck.SendData InputBox("Votre texte :")
§ End Sub

Et on va mettre aussi :

§ Private Sub Winsock_DataArrival(ByVal bytesTotal As Long)
§ Dim data As String
§ Winsock.GetData data
§ MsgBox data
§ End Sub

Executer le projet : connectez les 2 ctrls avec le premier bouton puis cliquez sur le second.
Comme vous le lisez dans le code, c'est tout con : « Wck » envoie par la méthode Senddata le texte que vous tapez et à l'autre bout « Winsock » recevant qq chose déclenche DataArrival, on récupère par GetData ce que « Winsock » a reçu et on l'affiche (pour vous montrer qu'il l'a bien reçu).

Evidement c'est pas parce que « Wck » est client qu'il ne peut que envoyer et l'autre recevoir, ILS ONT TOUS LES DEUX LA METHODE getdata ET senddata ET L'EVENEMENT dataarrival, DONC ILS PEUVENT TOUS LES DEUX TOUT FAIRE.

Autre truc sympa à savoir, l'événement Close qui se déclenche pour un ctrl winsock quand celui auquel il était connecté vient de lâcher volontairement ou pas !

Bien ! Maintenant voyons comment faire de la multi-connexion !

Et bien c'est tout bête ! Et si !

Pour faire un projet qui peut être connecté à plusieurs Winsock en même temps, faites-le avec 2 winsocks, l'un « Wck » avec la propriété « Index » à 0 et l'autre « Serveur ».
Rajoutez la variable public (donc accessible de partout) « Nb », et initialisez la à 0 au form_load.
Selon ce qu'on vient de voir, faites en sorte (et ça paraît logique) que ce soit « Serveur » qui soit serveur donc qui écoute mais pour son évenement ConnectionRequest mettez :

§ Private Sub Serveur_ConnectionRequest(ByVal requestID As Long)
§ Nb=Nb+1
§ Load Wck(Nb)
§ Wck(Nb).Accept requestID
§ End Sub

Vous avez compris !!! A chaque demande de connexion à votre appli, elle charge un nouveau contrôle Winsock « Wck » qui va prendre la demande et donc se connecter a l'appli appelante : au final, si 25 ctrl cherchent à vous appelez, vous pourrez vous connecter aux 25 et communiquer avec les 25 ! Ou plus ! (ou moins aussi).
Le ctrl Winsock « Serveur » lui reste TOUJOURS A L'ECOUTE PRET A TRAITER LES EVENTUELLES DEMANDES.

Et pour faire propre, il faut pas oublier :

§ Private Sub Wck_Close(Index As Integer)
§ Unload Wck(Index)
§ If Wck.count=0 then Nb=0
§ End Sub

Ce qui permet de décharger de la mémoire les ctrl winsock auxquel leur correspondant ont lâché la communication, et qui donc ne servent plus.

Comment traiter différentes réceptions ou la gestion des ordres :

Souvent vos applis vont s'envoyer des infos, mais pas tjrs les mêmes : donc comment faire pour que le prog distingue s'il vient de recevoir le Pseudo du type ou bien un message qu'il vient d'envoyer pour afficher dans le chat ? Simple encore une fois !!!

Faites correspondre chaque type de données (je ne parle pas du type VB) à un caractère puis faites par exemple :

pour l'envoi d'un pseudo :

§ .senddata « P » & VarPseudo

pour l'envoi d'un msg :

§ .senddata « M » & VarMsg

et pour la réception, on distingue comme ça :

§ Dim data as string
§ Dim Ordre as string * 1
§ .getdata data
§ Ordre = left(data,1) 'récupère dans Ordre le 1er caractère
§ data = right(data,len(data)-1) 'retire ce 1er caractère de data
§ Select case Ordre 'faites ici différents usages des données
§ Case « P »
§ Pseudo = data
§ Case « M »
§ Text1.text = data
§ End Select

Voilà pour ça.

Une fois de plus, ce tut' ne fait que S U R V O L E R la complexité du ctrl Winsock mais déjà vous aurez une base de travail, une pate à modeler quoi.

Sinon je vous renvoie à mes sources réseaux, qui sont pas mal mine de rien ;) non ?
Alors n'hésitez pas à aller jeter un oil sur mes autres sources pour voir des exemples d'applications Winsock comme le transfert de fichier par exemple (cf chat vocal qui envoie des waves, c'est à dire n'importe quel fichier binaire ou pas [faites pas gaffe au mauvaise langue qui marque n'importe quoi dans les comments. >( ] ) ou encore le chat multi-serveurs. enfin amusez-vous bien quoi !!!

Tchao @+

Source / Exemple :


Cétait Long ?
Cétait Null ?

Merci de laisser des chti commentaires, c val(orisant) !!!

Conclusion :


(j'ai fais ce truc rapide, pour contenter certains msg que j'ai reçu... j'espère que ça contentera certains, mais par pitié ne m'accablé pas sur la clarté... ;O)

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.