begin process at 2008 05 12 02:34:40
1 170 118 membres
23 nouveaux aujourd'hui
13 956 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

TUTORIAL WINSOCK TCP/IP SERVEUR CLIENT , MULTI CLIENTS ETC , CE KI FO SAVOIR QUOI ;)


Information sur la source

Catégorie :Tutoriaux Niveau : Débutant Date de création : 28/09/2002 Date de mise à jour : 01/04/2003 21:45:05 Vu : 48 687

Note :
9,26 / 10 - par 102 personnes
9,26 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (251)
Ajouter un commentaire et/ou une note


Description

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

  • Cétait Long ?
  • Cétait Null ?
  • Merci de laisser des chti commentaires, c val(orisant) !!!
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)
  • signaler à un administrateur
    Commentaire de jeanyves le 28/09/2002 06:35:24

    C'est vrai que c'est complexe mais il faut commencer par la base.... bravo d'avoir pensé aux débutants.

  • signaler à un administrateur
    Commentaire de Toneivitch le 28/09/2002 09:15:38

    Oui c sympa de penser aux newbies, je trouve ca tres courageux de passer du temps a expliquer a des inconnus des trucs qui leurs rendent services
    Merci beaucoup

  • signaler à un administrateur
    Commentaire de Clem le 28/09/2002 11:37:36

    Oui, c'est une bonne idée de penser aux newbies, moi même, j'ai pris le winsock avec une source dont je ne comprenais rien, et qui est pplus était sans commentaires, bref, la galère pour les débutants.
    Par contre, j'aimerais bien savoir comment l'UDP fonctionne, je sais que je peux paraitre en retard, mais c'est le prog auquel je veux me connecter qui est en retard !!

  • signaler à un administrateur
    Commentaire de DocteurVB le 28/09/2002 13:25:36

    très bien se tutorial, très accessible, et bien construit...
    seul une petit chose reste malgré tout dans l'ombre (c'est pour ça que j'ai mis 9 et pas 10) : dans cette sub,

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

    comment un le ctrl winsock peut savoir ce qu'il va recevoir ?
    je m'explique, le ctrl winsock recoit des octets, comment déterminé si ces octets correspondent a un type string, integer,Long...?

  • signaler à un administrateur
    Commentaire de jockos le 28/09/2002 17:09:52

    Winsock traite du flux d'octets (tout comme les Socket en C ou en Java)...
    En recevant ce flux, tu le stock en mémoire vive sous la forme que tu veux (String, Integer...). Le mieux c'est d'utiliser une String ou le type Variant à la rigueur.

    Pensez bien, que ce qui circule dans le tuyau n'est pas typé, ce sont des trames... disons plutôt des paquets IP contenant des morceaux du flux envoyé...
    Le flux est une suite de "0" et de "1"... tout simplement

  • signaler à un administrateur
    Commentaire de jockos le 28/09/2002 17:10:32

    J'ai oublié de noter...
    Je mets 9/10 pour ce bon tutoriel de base sur Winsock...

  • signaler à un administrateur
    Commentaire de celiphane le 28/09/2002 18:04:50

    merci à tous
    En effet DocteurVB, Jockos a très bien répondu à ta question.
    J'ajouterai sinon qu'il est vraiment bon de récupérer les données sous une STRING car ça a l'avantage de VIDER le buffer de réception. Ensuite, on a plus qu'à traiter le bazar. Sinon, si par exemple on prend sous la forme d'un LONG, et ben ça prendra que 4 octets. Evidemment, tout dépend de ce qu'on veut faire avec Winsock...

    Clem > dsl mais l'UDP c'est pas ma tasse de thé, en fait je m'y suis même pas penché ! pt - être c très bien, pt - être pa !
    Tchao !

  • signaler à un administrateur
    Commentaire de ja001net le 28/09/2002 19:03:13

    Merci beaucoup Celiphane pour cet excellent  tutorial destiné aux debutants  !!

  • signaler à un administrateur
    Commentaire de bydavid le 25/10/2002 22:03:51

    10/10 J'avais pas trop compris le ctrl Winsock et maintenant je comprends ! Merci !

  • signaler à un administrateur
    Commentaire de feedback le 18/12/2002 07:35:07

    SAlut comment tu fais pour envoyé un message avec winsock lorsque tu as un groupe de controle en winsock et que tu veux envoyé le meme message a toute les winsock du groupe de controle
    Car moi avec winsock.senddata et un for il n'y a que le dernier control qui recoit de l'info .............. feedback

  • signaler à un administrateur
    Commentaire de celiphane le 20/12/2002 18:57:34

    ba, avec le for each c'est bien aussi, moi j'aurais fais ça sinon :

    dim i as integer
    for i=0 to wck.count-1
      wck(i).senddata "super exemple n'est-ce pas ?"
      doevents
    next i

    si par contre tes winsocks sont parsemés (genre il n'existe que wck(0) wck(1) wck(5) wck(7) et wck(13) par exemple) ba oui prend le for each.
    Ca tourne pas si tu fais :

    dim W as winsock
    for each W in Form_Qui_T_Interesse
      W.senddata "super exemple n'est-ce pas ?"
      doevents
    next W

    ???

    Répond moi, j'ai pas testé avec le each.   @+

  • signaler à un administrateur
    Commentaire de olicool le 31/12/2002 15:16:33

    je comprend beaucoup mieux le winsock merci

  • signaler à un administrateur
    Commentaire de eka808 le 03/01/2003 13:00:37

    Bravo !
    10/10 je comprends mieux winsock maintenant, merci !

  • signaler à un administrateur
    Commentaire de peponr le 05/01/2003 01:40:19

    un zip serai pas mal...

  • signaler à un administrateur
    Commentaire de eka808 le 05/01/2003 17:36:40

    même problème que feedback...
    seul le dernier connecté reçoit l'info
    Merci de répondre, je ne comprends pas ce ki se passe.
    a+ eka808

  • signaler à un administrateur
    Commentaire de celiphane le 05/01/2003 17:50:16

    peponr : un zip ? pq faire ? mettre du texte ? lol
    eka808 : merci pour tes remerciements, quant à ton probleme, j'ai répondu à feedback, cette solution ne fonctionne-t-elle pas ? n'oublie pas de mettre un doevents, winsock à besoin de pause...

  • signaler à un administrateur
    Commentaire de FuSe le 07/01/2003 22:52:58

    c'est  pas mal ton truc mais sur ce site  ou je ne sait plus trop où j'ai trouvé une source qui gère ( je trouve) plus intelligement la multi connection:
    en fait le serveur est composé de deux controles winsock : 1 qui est par exemple sur le port 600 et un autre suivant ton exemple : à chaque connection il y en a un nouveau qui se crée.l'autre ce trouve en fait sur le port 600+1+nb de connections...
    donc en fait le client (avec bien sur son petit controle winsock unique)  se connecte sur le port 600.
    alors le controle que l'on pourrai nommer "portinfo" accepte la connection, envoie un message ( par exemple "[port]" & numéro de port ).
    le client alors en recevant ce message, se déconnecte du controle "portinfo" et se connecte (à la même adresse) avec le numéro de port indiqué par  "portinfo".
    bon j'explique juste ce que j'ai compris d'une source et ce n'ai pas de moi mais j'ai trouvé que c'était trés bien.
    Mais après une relecture de ton exemple viens à moi une question, on peu avoir différents clients connectés sur le même port ?
    Enfin voilà j'ai très peu de connaissance donc je n'oserai aller à l'encontre de celui&celle qui affronta euh dark side c ça son nom ???
    En conclusion bravo pour votre tutorial, c'est bête que je l'aie pas vu avant j'aurai compris plus vite :)

  • signaler à un administrateur
    Commentaire de celiphane le 08/01/2003 10:31:18

    Merci FuSe pour ton commentaire.

    Je ne me vante pas d'être LA "connaissance incarnée" en matière de winsock, mais je trouve que l'exemple que tu m'as cité est une très mauvaise adaptation du multi-connect...
    Car comme tu fais bien de le demander, le même port peut être utlisé sans aucun problème, et c'est pourquoi donc je qualifie la méthode que tu cites "mauvaise" : complication du code, temps perdu (en prog comme en temps machine, si infime soit-il de nos jours ;)   ).
    Je ne la trouve donc pas du tout "plus intelligente" comme tu le dis, mais bien plus "encombrante".

    Mais comme je le signale plus haut, je n'impose rien à personne, libre à vous tous d'adapter ce code, si vous pensez qu'il le vaut mieux ! Mais cependant cette méthode elle celle utilisée par les winsockers...

    Quoi qu'il en soit, bonne prog' à toi, FuSe, et à vous tous ! Tchao @+

  • signaler à un administrateur
    Commentaire de MirSPCM le 09/01/2003 21:15:42

    celiphane :
    Bravo :) C'est simpa de prendre du temps pour les gens :=)

    FuSe :
    Ta solutions poses entre autres les problemes suivants :
    1) c'est plus lent et ça prends plus de bande passante.
    2) En admetant que ton serveur derriere un routeur et que tu utilise PAT pour foward les ports.
    Et bien dans ce cas si on utilise ta solution, il faut foward tous les ports nécessaire à l'execution de ton programme. Donc si ton prog gere 255 clients il faudra ouvrire 255 ports, et comme dans la plupart des cas on fait ça MANUELLEMENT c'est très chiant et très long.
    et en + ça bouffe des ports que t'aurais pu rediriger sur une autre machine par exemple (mais bon c pas vraiment un probleme vu le nombre de ports ....)
    Avec le multi-connect selon celiphane tu n'a besoin de foward qu'UN SEULE PORT et ça marche niquel meme derriere un routeur/firewall.

    Voilà, et encore bravo celiphane pour le suivit :=)

  • signaler à un administrateur
    Commentaire de celiphane le 09/01/2003 22:22:48

    et toc !

    lol, merci MirSPCM !

    non je déconne, ba ouais j'avais pas pensé à tout ça non plus ! bien joué. Par contre a muri dans ma tête un autre argument et de taille lui aussi : quand on navigue sur le net, on utilise bien toujours le port 80. Quand vous ouvrez 36 fenetres IE (ou autres), qu'est-ce que vous croyez hein ? Que c'est les ports 80 81 82 83 ... qui s'ouvrent pour charger chaque fenetre simultanement ? ba non ca reste du 80 pour le http, donc si les pros qu'on créé tout ca font comme ca, c'est que ca doit etre tres bien comme ca ! (lol, quel argument !)

    merci à tous pour toutes vos réactions sur ce tutorial, et bonne prog'

    Tchao @+

  • signaler à un administrateur
    Commentaire de code le 20/02/2003 11:39:40

    salut celiphane je suis toujour bloquer j'ai essai plusieur methode pour separe l'information meme j'ai créer une fonction qui identifier chaque caratere d'une chaine mais j'arrive pas a separer l'information du  .GetData data

  • signaler à un administrateur
    Commentaire de celiphane le 20/02/2003 14:09:54

    Code, explique EXACTEMENT ce que tu veux faire : je ne peux pas te faire un cours ou un exemple à partir de rien !
    Donne ta situation, ton besoin etc, mais précisément...
    @+

  • signaler à un administrateur
    Commentaire de albert0 le 20/02/2003 22:01:26

    j'ai le meme probleme moi: donc ce que je veu faire enfet c'est que j'envoi le pseudo .senddata "trlalala" et j'envoi un phrase .senddata"trululu" maintant pour l'envoi c'est ok mais pour la reception comment on fait pour mettre le pseudo dans le textbox 1 et la phrase dans le textbox2??  chui dsl celi mais j'ao po bien compris ca dans ton super tut

  • signaler à un administrateur
    Commentaire de celiphane le 21/02/2003 01:02:28

    ya pas de mal les gars !
    Voici la marche à suivre :

    on va suivre l'exemple simple proposé par albert0, à savoir l'envoi d'un pseudo puis l'envoie d'une phrase.

    1° on a 2 type de données à envoyer/recevoir, on va donc définir 2 codes

    2° disons qu'on décide de "P" pour le pseudo et de "M" comme message pour la phrase

    3° quand on envoie le pseudo, on va le faire sous la forme suivante :
    wck.senddata "P" & Variable_pseudo

    4° pour la phrase, on va le faire sous la forme suivante :
    wck.senddata "M" & Variable_phrase

    5° à la réception, on reçoit tout dans une variable chaine, par exemple data avec : wck.getdata data

    6° maintenant il s'agit de faire comprendre au programme qu'est-ce que contient data, à savoir ici, un pseudo, ou une phrase

    7° on va donc récupérer le code, c'est à dire le premier caractère, qu'on va placer dans une variable Code, avec ces lignes :
    dim Code as string * 1 'je déclare Code comme une chaine d'1 caract.
    code = left(data,1) 'je récupère le premier caractère à gauche de data
    data = right(data, len(data)-1) 'je retire le code de data, pour qu'il ne contienne QUE l'information transmise (phrase ou pseudo)

    8° à la suite, je teste le Code reçu pour déterminer ce que je dois faire de ce qu'il reste dans data. J'utilise ci-dessous un "Select case" car ceci montre comment faire une structure propre si vous avez plus de 2 codes :
    select case Code
      case "P" 'dans le cas d'un pseudo
        Zone_de_texte_pseudo.text = data
      case "M" 'dans le cas d'une phrase
        Zone_de_texte_phrase.text = data
    end select

    9° C'est assez clair comme ça ? ;)

    Tchao @+

  • signaler à un administrateur
    Commentaire de albert0 le 21/02/2003 13:13:08

    ouais c'est parfait, la j'ai mieu compris, mais j'ai encore quelque question :)
    quand tu dit "disons qu'on décide de "P" pour le pseudo..." sa veu dire quoi que le pseudo du mec c'est P ou bien que P c'est justement pour identifer a la reception?? voila si c'est bien ca alors sa veu dire que

    code = left(data,1) comme tu dit on va matter la premier lettre si c'est m ou p (Palbert0)

    si non le reste c'ets ok  :)

    redsl chui long a la détente :)
    a plus

  • signaler à un administrateur
    Commentaire de albert0 le 21/02/2003 17:23:25

    car voila ce j'ai essayer de faire:

    dans un bouton:
    W.SendData "P" & (Form1.nick.Text)
    W.SendData "M" & (Form1.nick.Text & "> " & Text1.Text)

    dans data arrival

    Dim data As String
    Dim Code As String * 1
    W.GetData data
    Code = Left(data, 1)
    data = Right(data, Len(data) - 1)


    Select Case Code
      Case "P"
       MsgBox data
      Case "M" 'dans le cas d'une phrase
      chat.SelStart = Len(chat.Text)

    chat.SelText = vbCrLf & data
    chat.SelStart = Len(chat.Text)
    End Select

    je met comme pseudo alberto et he test

    mais dans le text box ki apparait il y a ecrit albertMalberto> le textquej'aienvoyer


    c'est biizard je comprend pas pk sa fait ca , pourtant g suivi a la lettre ton tuto :/

  • signaler à un administrateur
    Commentaire de celiphane le 22/02/2003 09:43:10

    n'envoie JAMAIS 2 infos comme ça à la suite sur un winsock, comme dans ton exemple.
    ou si vraiment t obligé, place un DOEVENTS entre tes envoies, ici donc entre les 2 w.senddata de ton bouton. Un programme c'est ligne à ligne, si tu as deux lignes qui se suivent sans pause, il ne peut pas descendre interprêter les evenements relatifs, sources d'erreur.
    Le mieux avec winsock dans ces cas là, c'est de gérer une structure envoie/accusé de réception : tu envoies une infos à un wck, il la recoit la traite puis envoie un code pour faire comprendre à l'autre comme quoi il est pret pour la suite. L'autre la recoit puis envoie la suite et ainsi de suite... pigé ?
    C'est pas sorcier vous verrez,
    Tchao @+

  • signaler à un administrateur
    Commentaire de espritclub le 05/03/2003 17:53:20

    Tout d'abord mercxi pour ce tutorial et merci a tous ceux qui font partager leur savoir sur ce site.
    Je suis un petit nouveau et j'aimerais bien maintenant pour realiser un jeu multiclient pouvoir mettre en place en meme tps un multiserveurs ( au nbre de 2) de maniere a ne pas arreter le jeu si un serveur tombe en panne. Les clients doivent donc changer de serveur automatiquement en cas de probleme mais sans interrompre le jeu. Voila je suis ouvert a toutes propositions suceptible de m'aider. Bonne journee a tous.

  • signaler à un administrateur
    Commentaire de jockos le 15/03/2003 14:41:35

    Ce que dis celiphane est exact...
    Un dialogue client/serveur, c'est ça...
    D'ailleur, quand la connexion est établit entre le client et le serveur, on ne fait plus vraiment la distinction entre le client et le serveur. Les 2 sont des interlocuteurs...

    1- A envoi un message à B.
    2- A attend la réponse de B.... (boucle d'attente... avec DoEvents dans la boucle !)
    3- B réceptionne le message de A, le traite et envoi un acquittement à B ou un autre message.
    4- B attend la réponse de A... (boucle d'attente)
    ....
    ....
    ...
    ...

    Vous pouvez regarder les exemples d'envoi de mail anonyme qu'il y a sur ce site pour comprendre le dialogue client/serveur...

  • signaler à un administrateur
    Commentaire de dragonspyro93 le 19/03/2003 21:00:37

    Je veut faire une application avec un server et des clients
    le server sert juste a envoyer des messages et les clients juste a les
    recevoir

    voile lecode pour le vouton

    Private Sub Command1_Click()
        For i = 1 To wck.Count - 1
            wck(i).SendData (txtSend.Text)
        Next i
        txtSend.Text = ""
    End Sub


    mais cela n envoit le message qu au dernier client connecté pourquoi ?

    voila lecode complet du server qui je crois est conforme au tutorial

    Const PORT = 1001
    Dim nb As Integer

    'bouton
    Private Sub Command1_Click()
        For i = 1 To wck.Count - 1
            wck(i).SendData (txtSend.Text)
        Next i
        txtSend.Text = ""
    End Sub

    Private Sub Form_Load()
        nb = 0
        serveur.LocalPort = PORT
        serveur.Listen
    End Sub

    'demande de connection
    Private Sub serveur_ConnectionRequest(ByVal requestID As Long)
         nb = nb + 1
         Load wck(nb)
        wck(nb).Accept requestID
       ' afficher (requestID)
    End Sub
    Private Sub Wck_Close(Index As Integer)
         Unload wck(Index)
         If wck.Count = 0 Then nb = 0
    End Sub

    Private Sub afficher(txt As String)
      MsgBox (txt)
    End Sub






  • signaler à un administrateur
    Commentaire de albert0 le 20/03/2003 16:49:29

    c'est pas wck.count qui faut faire mais nb-1 j'explique :)


    For a = 1 To Nb - 1 'boucle qui envoi le message a tout les user
       chat.SelStart = Len(chat.Text)
    chat.SelText = vbCrLf & "*** Server Message: " & Text1.Text
    chat.SelStart = Len(chat.Text)
    W(a).SendData "B" & "*** " & Text1.Text
       Next a

    vala Nb le nb qui fait + 1 a chaque foi que quelqun se connect

    albert0

  • signaler à un administrateur
    Commentaire de dragonspyro93 le 20/03/2003 21:45:01

    Bon alors voila quelque chose de mystique (c est pasune facon de parler). je crois avoir resolut mon probleme (merci albert0) apparemment ca marche si on met nb et non nb - 1 .
    Mais voila si je fais ca :

    'bouton qui envoit le texte a tous les clients
    Private Sub Command1_Click()
        For a = 1 To nb
            wck(a).SendData (txtSend.Text)
            MsgBox (a)
        Next a
        txtSend.Text = ""
    End Sub

    ca marche !!!! mais si je commente "MsgBox (a)" ca ne marche plus (seul lepremier connecte recoit le message). Quelqu un as t il une solution a ce mysterieux mystere ????
    Serais ce un bug de VB 6.0 ou de mes neurones ?????

    Merci de votre aide

  • signaler à un administrateur
    Commentaire de FuSe le 20/03/2003 22:20:37

    Salut,
    Bon euh d'après ce que j'ai déjà pu observer, il dfaut mettre la commande Doevents juste après ton senddata, ne me demande  pas pourquoi, la msdn en anglais est un peu trop spirituelle à mon gout, mais bon normalement ça marche, à chaque fois que j'ai fait des appli avec des sends à plusieurs clients ya pas eu de problème.
    Essaye et tu verra ...

  • signaler à un administrateur
    Commentaire de jockos le 20/03/2003 22:35:03

    Exact, en mettant DoEvents, ça marche...
    ça permet de vider le buffer et de laisser respirer le Système...

  • signaler à un administrateur
    Commentaire de dragonspyro93 le 21/03/2003 08:46:32

    Merci beaucoup
    Une derniere question. Si j ai 10 000 clients cela ne va t il pas ramer ?
    Est ce la bonne solution ?

  • signaler à un administrateur
    Commentaire de celiphane le 21/03/2003 09:14:06

    j'ai déjà expliqué dans les commentaires plus haut (le dernier de celiphane au-dessus) pourquoi un doevents est nécessaire, et qu'il faut au mieux faire un système avec "accusé de réception".

    qd à savoir la vitesse avec 10000 clients, je n'ai jamais eu l'occasion de tester !!!
    Vous me tiendez au courant !  c'est intéressant ! ;)

  • signaler à un administrateur
    Commentaire de themrok666 le 20/04/2003 18:26:53

    Tres bon tuto, merci pr les noobs comme moi ;-)
    Il y a un petit passage ou tu va assez vite, un peu trop meme, Dr VB l'a dailleurs écrit aussi, mais en tout cas je me suis tres bien debrouillé rien qu'avec ton tuto, il est donc a porté de TOUS.

  • signaler à un administrateur
    Commentaire de celiphane le 12/05/2003 00:22:31

    merci encore !

  • signaler à un administrateur
    Commentaire de temoin le 30/05/2003 18:25:14

    super mec tu explique mieux que mon prof

  • signaler à un administrateur
    Commentaire de sethpaien le 04/06/2003 21:25:54

    Ahh je vais pouvoir enfin faire une application serveur-client.
    Thanks2U

  • signaler à un administrateur
    Commentaire de NBesty le 05/06/2003 21:49:30

    Contrairement a ce que vous dites, UDP n'est pas nul... Au contraire il est bien plus rapide que TCP puisqu'on a viré tous les controles d'erreur...

    UDP sert dans le cas de satellites, de trucs comme ca... Dans le cas ou une réponse un peu erronnée est moins grave qu'une réponse lente...

    Voila pour le principe d'UDP...
    Pour finir, tout bon informaticien a appris les deux lors de sa formation... UDP est bien plus utilisé qu'on ne le croit dans le mondre professionnel

  • signaler à un administrateur
    Commentaire de celiphane le 05/06/2003 23:06:53

    Du calme du calme, pas la peine de pollué ce site avec ton triple comment'.

    Merci pour cette briante information. Pour les autres, je maintiens, UDP c'est nul.

    @+

    Lol, mais non je plaisante, je veux juste faire dresser les cheveux de Nbesty ;)

    bon nbesty, oui tu aimes UDP. Nan je n'ai pas reç de formation UDP, ni TCP d'ailleurs, car j'apprend seul et je retranscrit mes impressions.
    J'ai dit UDP=nul en précisant dans mon premier commentaire plus haut que "je ne m'y suis jamais intéressé et que peut être c'est bien peut être c'est nul".
    Aujourd'hui, je m'en fous, car UDP ne répond pas DU tout à mes attentes : ca ne marche qu'en locale, c'est pas sécurisé et ca ne répond pas du tout au couche de communication réseau : c'est un protocole bateau en phase d'extinction.
    C'est ma part du gateau telle que je la vois... et jamais je n'irai apprendre a quelqu'un qu'il faut penser comme moi !

    ma devise,
    UDP, c'est peut etre pour vous, moi je m'en fous !

    lol ;)

    @+ et merci de tes informations pour ceux que ca interesse !

  • signaler à un administrateur
    Commentaire de Igorbis le 14/06/2003 18:41:38

    J'ai un petit probleme et j'espere que vous aller y répondre, meme si la question à l'air terriblement con!
    Quand j'essaye de mettre un winsock j'ai un message qui me dit que j'ai pas la licence adéquate pour l'utiliser, comment ça se fait ça?
    Je vous avais dis que la question était con mais pouvez vous y répondre SVP.

  • signaler à un administrateur
    Commentaire de celiphane le 15/06/2003 20:45:46

    C'est loin d'être idiot comme pb !
    Voici une bonne piste il me semble, parmi tant d'autres ! Au pire pense a lire les comment's !
    @+

  • signaler à un administrateur
    Commentaire de Igorbis le 21/06/2003 09:26:19

    J'ai regardé tous les comment's mais apperement personne n'a eu le mm pb que moi! A moins que je n'ai sauté un passage, pour la peine, je relis :)

  • signaler à un administrateur
    Commentaire de celiphane le 21/06/2003 17:35:03

    dsl, j'ai raté mon copier coller ! j'avais mis l'adresse d'une source qui permettait l'enregistrement des controles dans la base de registre, et dans les commentaires de cette source ils donnaient d'autres solutions !
    j'étais tombé dessus par hasard, donc je ne peux plus te donner cette adresse ! bonne recherche cela dit ! @+

  • signaler à un administrateur
    Commentaire de Nargzul le 27/06/2003 14:26:49

    splendide! men faut encore!!!!

    non, mais si il pouvait y avoir un peu plus...

    mais superbe, je connaissais pas le winsock ya une heure et mnt mon application chat tourne!!! thanks 9/10 pour la grosseur du contenu 10/10 pour la qualité, on mettra 10 koi...

  • signaler à un administrateur
    Commentaire de celiphane le 27/06/2003 17:59:32

    encore une fois, merci

  • signaler à un administrateur
    Commentaire de Ickik le 30/06/2003 16:27:13

    genial. pour tous ceux qui comme moi l'avait (le winsck) decouvert par un prog bourrin, la on redecouvre mais avec des explications (c pas tous jours) et on se contente pas de recopier betement.

  • signaler à un administrateur
    Commentaire de babboss le 03/07/2003 05:05:07

    salut,
    merci pour ce tuto.
    moi j ai apris un truc c le DoEvents
    avant je bidouiller pour ke sa marche et bin maintenant je v metre DoEvents :D

    euh sinon tu pourai parler de PeekData par ce ke j ai po compris koi sa servai
    et puis tu explike super bien je trouve :)

  • signaler à un administrateur
    Commentaire de celiphane le 03/07/2003 10:58:38

    slt, merci
    babboss> peekdata ? c'est pas dans le tutorial ça, a moins que tu ne parles de getdata, la méthode winsock, et là oui ca rentre dans le cadre du tutorial, mais je ne vais m'étendre d'avantage, car il me semble que c'est deja bien ravacher ! ;)
    @+

  • signaler à un administrateur
    Commentaire de jockos le 03/07/2003 11:25:37

    La méthode GetData d'un controle Winsock sert à transférer les données contenu dans le buffer (tampon) d'arrivé dans une variable de ton programme (variable sur laquel tu pourras alors travailler).

    Pour résumé, ça sert simplement à récupérer les données reçu par ton control Winsock (provenant de la couche TCP).

    Pour infos, UDP est aussi utilisé sur internet, même si on parle de réseau TCP/IP sur le Net.
    Pour les softs de visio-conférence, on utilise UDP au niveau de la couche Transport (du modèle OSI) et on utilise un protocol de gestion d'ordonnancement des données et de correction sur une couche Superieur (RTP et RTCP). Cela dans le but de gagner en vitesse d'échange (nécessaire pour des échanges real-time)...

  • signaler à un administrateur
    Commentaire de ria94 le 03/07/2003 12:31:58

    Juste un petit message pour dire que c'est trop excellent ce que t'as fait, simple et explicite j'imaginais pas mieux.

  • signaler à un administrateur
    Commentaire de ria94 le 03/07/2003 12:35:17

    Au fait je mets 12/10 et j'aurai peut etre bien pas mal de question a te poser dans le futur etant donné que je debute avec winsock.

  • signaler à un administrateur
    Commentaire de vinc le 05/07/2003 19:57:45

    Comment on fait pour envoier une command....et bien je veut dire: si je fait wck.senddata picture2.visible = true.......comment je fait pour que lautre winsock recoive et traite la demende??

  • signaler à un administrateur
    Commentaire de FuSe le 05/07/2003 20:19:32

    Hum on me corrigera si je me trompe mais tu peut pas envoyer ce genre de commande ( le code il se modifie pas en temps réel ), il faut que tu envoie une chaine ( ex : "[visible]" ) et ensuite sur le programme recepteur dans l'evenement data arrival ( un truc du genre m'en rapelle plus ) tu fait getdata et tu analyse la chaine , et en fonction du code reçu ( ex "[visible]" ) tu execute ton code ( picture2.visible=true). En gros enfin moi c'est ma technique, tu a une section des chaines  ( les 5 premiers caratères par exemple )  qui contient un code d'operation et ensuite tu peut ajouter à la chaine des paramètres... Je fait donc avec un select case ...
    Voila en esperant t'avoir éclairé un peu ...

  • signaler à un administrateur
    Commentaire de vinc le 06/07/2003 06:40:58

    merci FuSe! cela ma éclairer...je t'en remercie

  • signaler à un administrateur
    Commentaire de Nargzul le 07/07/2003 07:06:15

    pendant kon es dans ce sujet, c koi la commande pour exécuter une commande stockée dans une variable....

  • signaler à un administrateur
    Commentaire de vinc le 07/07/2003 19:36:32

    Bonne question Nargzul.....j'aimerais moi aussi savoir la réponse!

  • signaler à un administrateur
    Commentaire de jockos le 07/07/2003 20:09:53

    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).

  • signaler à un administrateur
    Commentaire de celiphane le 07/07/2003 23:10:58

    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 ;)

  • signaler à un administrateur
    Commentaire de celiphane le 07/07/2003 23:35:43

    j'ai ajoutez une source pour en faire profiter toute la communauté avec un zip d'exemple, RDV ici :
    http://www.vbfrance.com/article.aspx?Val=9630

  • signaler à un administrateur
    Commentaire de jockos le 07/07/2003 23:53:25

    bien vu... ;)

  • signaler à un administrateur
    Commentaire de vinc le 08/07/2003 03:01:17

    Wow!! quel génie tu es celiphane!!

  • signaler à un administrateur
    Commentaire de celiphane le 08/07/2003 09:44:06

    heu???
    c'est de l'ironie que je sens là ? ;o
    @+

  • signaler à un administrateur
    Commentaire de Nargzul le 08/07/2003 13:23:23

    g un problème, ya surement au moins qqun ki peut m'aider, je ne recois pas ce ke je m'envoie:

    voila ce ke g:

    sur command3
    messtosend = "P  " + client.LocalIP
    client.SendData (messtosend)

    sur client.dataarrival de l'autre form
    client.GetData Data
    commande = Left(Data, 3)

    après j'ai un select pour les différente opérations possible, mais il ne fait rien, en après g été regarder ce qu'il y dans commande, juste apès qu'on lui aie entré une valeur, et cette valeur c "???" pourquoi? j'ai regardé le message juste avant que je l'envoie, c une chaine de caractère tout ce qu'il y a de plus normal...

    help me please

  • signaler à un administrateur
    Commentaire de jockos le 08/07/2003 13:49:42

    Il faut interpréter ce que tu reçois...
    Quand tu envoi une chaine, en réalité, c'est un flux binaire (de 0 et de 1) qui est envoyé...
    Et donc, à la réception, il fau tinterpréter le flux re&#