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

Soyez le premier à donner votre avis sur cette source.

Snippet vu 67 901 fois - Téléchargée 45 fois

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

Ajouter un commentaire Commentaires
cs_vinc Messages postés 32 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 11 octobre 2003
6 juil. 2003 à 06:40
merci FuSe! cela ma éclairer...je t'en remercie
Nargzul Messages postés 438 Date d'inscription vendredi 9 mai 2003 Statut Membre Dernière intervention 26 juillet 2007 4
7 juil. 2003 à 07:06
pendant kon es dans ce sujet, c koi la commande pour exécuter une commande stockée dans une variable....
cs_vinc Messages postés 32 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 11 octobre 2003
7 juil. 2003 à 19:36
Bonne question Nargzul.....j'aimerais moi aussi savoir la réponse!
jockos Messages postés 321 Date d'inscription dimanche 22 octobre 2000 Statut Membre Dernière intervention 14 mai 2005 2
7 juil. 2003 à 20:09
FuSe vient de donner une réponse satisfaisante à ce problème...
En programmation, ça ne se fait pas d'exécuter une commande contenu dans une variable. Ce n'est pas propre du tout de faire comme cela ! (car très dur à maintenir puisqu'on ne sait pas vraiment l'instruction qui est contenu dans la variable au niveau du code source).

Ce qu'on fait, c'est qu'on met un message dans cette variable de sorte qu'après, quand on interprète le contenu de la variable (avec un Case par exemple), alors on fait tel ou tel instruction.

Par exemple :
On a une variable v de type String.

Quand on veux faire une action en fonction du contenu de v, il suffit d'interpréter v.

Select Case v
Case "Action 1"
'L'action est exécuté ici
Case "Action 2"
.........
.....
End Select

Donc, pour résumé, on n'exécute pas l'instruction contenu une variable, mais on exécute une instruction en fonction du contenu de la variable (en l'interprétant).

Il se peut dans des cas très particuliers que vous ne puissiez pas faire autrement que d'exécuter l'instruction contenu dans la variable, mais dans ce cas très très limité, je ne sais pas comment faire... (et je pense qu'il y a toujours moyen de faire autrement).
celiphane Messages postés 466 Date d'inscription samedi 16 février 2002 Statut Membre Dernière intervention 20 avril 2007
7 juil. 2003 à 23:10
Bonjour à tous !
Problème du jour, et épineux problème, comment exécuter une instruction contenu dans une variable au format chaine.
Ma réponse de développeur professionnel débutant VB6 ;) , c'est impossible. Ou plutot non disons presque réalisable !

Ceux qui voudront s'y essayer, je ne connais QU'UN SEUL MOYEN, et c'est le suivant, suivez la procédure :

1) ouvrez un nouveau projet standard, avec une form Form1 toute bête
2) ajoutez le composant Microsoft Script Control et placez en un sur la Form1, ce sera le ScriptControl1
3) mettez aussi une TextBox Text1 pour faire le test que je vous propose
4) dans le form_load, tapez ScriptControl1.AddObject "Form1", Me, True
5) mettez un bouton avec le code suivant au clic : ScriptControl1.ExecuteStatement "text1.text=""coucou"" : msgbox ""Alors content ? ;)"""
6) lancez le projet et cliquez sur le bouton
7) observez votre textbox, lisez la msgbox
8) alors ? compris !?

C'est excellent comme astuce, ca marche très très bien mais il est vrai que ca ne marche pas avec des fonctions tres pointus de VB mais pour executez des procédure ou des fonctions ca marche aussi DONC vous pouvez TOUT FAIRE avec ca.

commentaires ?

@+ et merci pour l'intérêt que vous portez à cette source, ou disons ce tut', ca fait plaisir à son auteur ! on dirait un petit forum ! lol ;)

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.