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 : 54 244

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

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (252)
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)
 

Commentaires et avis

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çu en le plaçant dans une String.

Quel est le type de ta variable Data et de ta variable commande ?

signaler à un administrateur
Commentaire de Nargzul le 08/07/2003 13:54:32

et comment tu fais pour interpreter

mes variables sont définie en tant que string....

signaler à un administrateur
Commentaire de vinc le 08/07/2003 18:46:51

celiphane! ce n'étais pas de l'ironie....il faut vraiment etre intelligent pour trouver plein de solution comme ca!
cordialement...ton ami vinc

signaler à un administrateur
Commentaire de celiphane le 08/07/2003 19:04:44

Nargzul> étrange en effet, je ne peux que te recommander de suivre le tutorial de ligne en ligne, car le problème vient surement d'une bête (comme toujours) erreur de saisie, d'un oubli ou autre... par exemple, vérifie bien ton select case sur quoi il porte etc... aussi, utilise plutot le & que le + pour concaténer une chaine, le + c'était pour la compatibilité avec Qbasic !

vinc> alors merci, c'est tout content que je reçois cette gratitude et cette qualification. Au fait on se connait déjà ? (j'ai la mémoire TRES courte)

signaler à un administrateur
Commentaire de vinc le 09/07/2003 06:40:11

Non , on ne ce connait pas...mais j'ademire beaucoup ceux ki ont un grand talent en ordinateru et surtout en programmation!

et a ce que j'ai pu voir tu as un énorme talent en programmation..félicitation...en espérent que je devienne un jour comme toi!

signaler à un administrateur
Commentaire de Nargzul le 09/07/2003 06:55:09

vous voulez savoir ce ke g fait pour ke ca marche???





suspens...
g redemérré le pc... ahhh. les mystère de l'informatique...

signaler à un administrateur
Commentaire de vinc le 09/07/2003 07:24:43

hooooooo........alors le génie de céliphane n'en prend une claque!!!

petit joke haha!!

signaler à un administrateur
Commentaire de vinc le 09/07/2003 07:31:44

en passant!....sa pas rapport avec le winsock...mais ....sur la page daccueil de vbfrance....cest koi sa : vos points: 14 point sur vbfrance au total??? et comment on fait pour avoir cest point la? et a koi sa sert?

signaler à un administrateur
Commentaire de Nargzul le 09/07/2003 07:36:46

cda sert à rien, c en fonction du nombre de source ke tu as, et des message ke tu as mis sur le forum...

signaler à un administrateur
Commentaire de vinc le 09/07/2003 07:39:11

ok merci!

signaler à un administrateur
Commentaire de celiphane le 11/07/2003 15:52:58

ha ok, moi aussi ca m'éclaire pas mal comme explications sur les points attribués :
en gros si t'es un gros floodeurs t'es considéré comme le meilleur auteur de vbfrance, mais si par contre t'es parmi les sources favorites de la communauté, t rien. Sympa le classement ;)

signaler à un administrateur
Commentaire de Nargzul le 11/07/2003 15:55:27

ben en fait, je crois, mais je suis pas sur... et pis je sais pas si on peut dire considéré, pq ya personne d'autre que toi ki vois ca...

de toute facon, c pas trop au points ke tu juge le programmeur, c plutot avec ses codes... je crois ke ya tout le monde ki est d'accord

signaler à un administrateur
Commentaire de celiphane le 11/07/2003 17:11:35

ho non mais t'inquiete pas je ne m'en formalise pas ! c'était de l'humour c'est tout !
lol
@+

signaler à un administrateur
Commentaire de dtom le 18/07/2003 01:41:47

celiphane, to tutoriel est très bien et je n'est rien à lui reprocher(meme si je n'est ai pas eu besoin personnellement), meme pas le service après vente ;-). mail j'ai entendu dire que le control winsock n'était PAS compatible avec windows xp.
je cherche donc désepérément une aide complette sur les api winsock.

signaler à un administrateur
Commentaire de jockos le 18/07/2003 08:31:46

Le control Winsock est tout à fait compatible avec XP.
D'ailleur, si tu regardes dans le repertoire System32 de XP, tu trouveras le controle OCX Winsock.
Par contre, si tu fais du Client/Serveur sur la même machine (pour tester ton appli de Chat sur 1 seule machine par exemple), il se peut que ça ne marche pas... j'ai déjà vu ce cas de figure chez des clients...

Après, est-ce que cela vient de XP, peut-être, mais en tous cas, ça marche...
Je te conseil d'utiliser l'ocx plutôt que les API, car ça ne sert à rien de perdre du temps à réinventer la roue !
Le controle Winsock utilise lui même les API Winsock...
A moins que tu veuilles faire quelque chose de très spécifique...
Dans tous les cas, si tu as besoin de performance dans ton appli, il faudra abandonner le VB et passer aux Sockets du C++... mais c'est une autre affaire...

Bon courage...

signaler à un administrateur
Commentaire de vinc le 23/07/2003 01:48:27

Il y a tu un moyen de mettre un idex sur une form??? car je voudrais deux fois ma form1

signaler à un administrateur
Commentaire de vinc le 23/07/2003 07:07:47

Autre chose que je comprend pas!! dans form_resize() tu a decris for each object in me

si jecrit sa dans une autre form sa marke que la variable object nest pas déclaré....mais toi dans ta form tu ne la déclare nul part....comment ca, ca marke ca???

signaler à un administrateur
Commentaire de celiphane le 23/07/2003 09:26:32

Salut,

I]
non, pas d'indiçage pour les form, mais par contre, tu peux les gérer comme objets dans une collection !
créé une collection : public CollForm as new collection (dans un module)
créé aussi cette sub :
public sub AjouteForm
dim F as new [tafeuille]
CollForm.add F
set F=nothing
end sub

Après tu accèdes aux feuilles simplement avec CollForm(1), Collform(2) etc...


II]
le form_resize de mon tutorial je ne le vois pas ! pose tes comments sur les bonnes sources. Je vois de quoi tu parles :
2 solutions possibles :
1) tu déclare la variable object comme Object (appelle la simplement O pour faire + propre [dim o as object]
2) retires ton Option Explicit qui SUREMENT dans ton code ;)


@+
Celiphane

signaler à un administrateur
Commentaire de jacques34 le 23/07/2003 12:56:31

Désolé, je dois être le plus nul de tous !
pour moi :
La partie mono-connexion de ton tutorial fonctionne !
Mais pas la partie multi-connexion ?
Pourrais-tu m'envoyer le code complet de ta Form ( et les Objets)
Par avance , merci.

signaler à un administrateur
Commentaire de celiphane le 23/07/2003 14:22:28

jacques34,
on n'est pas nul quand on ne comprend pas tout du premier coup, on l'est quand on arrive à rien de rien, et qu'on fait consciemment n'importe quoi pour y parvenir.
Tiens, voici 2 de mes sources, certes complexes et très axées, mais qui devraient répondre à ton besoin :

http://www.vbfrance.com/article.aspx?Val=3474
http://www.vbfrance.com/article.aspx?Val=6704

sans forcément les exécuter et les comprendre de A à Z, tu retrouveras en winsock des éléments de ce tutorial et je pense que tu tilteras tout seul. Pour bien faire, suis le tuto en regardant les sources.

@+
Celiphane

signaler à un administrateur
Commentaire de jockos le 23/07/2003 14:57:12

T'es un vrai pédagogue Céliphane... Tu n'es pas être prof par hasard ?
(ce n'est pas ironique)...
C'est vrai qu'en info, il faut aller à l'essentiel, car c'est extrèmement vaste. On ne peut pas tout comprendre... Il faut comprendre dans la globalité le concept puis descendre dans les couches plus techniques si besoin est...
Retenez bien que dans la programmation, l'important, c'est le concept, l'idée de base... Après, le code, c'est de la pure recette de cuisine ;)...

signaler à un administrateur
Commentaire de celiphane le 23/07/2003 16:51:53

jockos, les autres, vous êtes nombreux à me le demander : non je ne suis pas prof, et ça se sent dans mes phrases lol ;)

si par contre l'un d'entre vous aurait une proposition de professeur informatique à me proposer et bien rémunérée 8-), alors n'hésitez pas lol

plus sérieusement, je développe actuellement pour une société prestatrice de service informatique. Voilà c'est dit.

et pendant que j'y suis, je te remercie, toi jockos, pour ta participation sur les commentaires de ce tutorial, toujours précieuse. Toi, tu as l'air d'être un bon, et un bon connaisseur aussi. Merci aux autres aussi.

@+
Celiphane

signaler à un administrateur
Commentaire de JCpp le 27/07/2003 14:43:34

J'ai réalisé un programme de chat avec Winsock qui fonctionne bien. Par compte, on doit donner son IP au «client » pour ce connecter qui n'est pas terrible.

Comme la personne ne connais pas le IP du « serveur », il devra scanner 000.000.000.000:4000 à 999.999.999.999:4000, jusqu'à qu'il soit accepté ?

C'est très long Grr!! ????

Je ne vois pas de solution car mon IP change et je ne suis pas forcément connecté.
Ci la personne que je ne connais pas, lance mon programme « serveur » car il n'a pas trouvé de « serveur ».
Comment je peux me connecter sur son « serveur » ci je ne le connais pas ?

signaler à un administrateur
Commentaire de celiphane le 27/07/2003 18:27:33

lol !
JCpp> je vois que tu commences à utiliser Winsock, et je vois surtout que tu commences seulement à t'initier au réseau.

D'une part, une adresse ip est constitué de 4 octets, ainsi elle est borné par 0.0.0.0 et 255.255.255.255, moins les réservé (comme la localhost 127.0.0.1 par exemple).

D'autre part, si ton IP change, c'est normal : c'est sécurisant, et c'est techniquement plus simple pour ton FAI. Tu imagines devoir scanner toutes les IP, tu es un pirate ? ;)

Ce que tu exprimes est impossible, c'est comme une grand-mère qui demande à un vendeur si son futur PC fera le café expresso !

Ce qu'il te faut, c'est acheter une place pour placer un serveur sur la toile, fixe, et résolu par DNS. Personnellement je n'en ai pas les moyens !

Enfin, j'avoue que j'ai bcp de mal à exprimer ce que je ressens face à ce genre de commentaire (c'est pas du tout méchamment hein !), mais j'espère que des esprits plus éclairé que moi sauront mieux t'éclairer sur la lune que tu recherches !

@+
Celiphane

signaler à un administrateur
Commentaire de FuSe le 27/07/2003 18:34:58

Salut Jcpp,
Ce que tu veux est assez difficile a faire comme le dit Celiphane et comme tu l'a remarqué c'est tout à fait impossible de scanner toutes les ips qui peuvent exister (question de temps et bon c'est un peu fastidieux comme opération ).
Pourtant ta question m'amène  à penser qu'il doit pourtant bien y avoir un moyen :  je pense par exemple aux jeux réseau lorsque on est uniquement sur un LAN => il n'y a pas de serveur pour centraliser et pourtant on a un listing des serveurs ouverts...

Mais bon là je sais pas du tout comment ça marche...

A+

signaler à un administrateur
Commentaire de jockos le 27/07/2003 19:12:39

La résolution de nom (DNS) sert entre autre à cela.
L'idée, c'est de posséder un nom de domaine Internet Fixe correspondant à ton adresse IP dynamique.

Va voir sur ce site : http://www.dyndns.org/account/create.html
Tu pourras créer ton nom de domaine gratuitement.

Après, il faut quand tu te connectes à Internet que tu lances un petit soft qui te permettra de faire la liaison entre ton adresse IP fournit par ton FAI et ton nom de domaine fixe t'appartenant.

Ainsi, ton serveur aura un nom de domaine que tout client devra connaitre pour se connecter au chat.

Bon courage

signaler à un administrateur
Commentaire de JCpp le 27/07/2003 20:12:08

Merci, d'avoir répondu jockos, FuSe et bien sur celiphane.

Je voudrai réaliser un chat comme Messeger, IRC, ICQ, etc.. pour ma Jenny (programme iA)

http://perso.wanadoo.fr/iar/IAb_Images.htm

Comme cela, Jenny pourrai apprendre en même temps que l'on chat et elle donnerai son opinion, etc.

Je pensai a un truc, ci je connaissais un IP avec son port « serveur » d'un  chat existant qui fonctionne tout le temps, le problème sera résolu.

signaler à un administrateur
Commentaire de celiphane le 27/07/2003 21:13:00

FuSe> en ce qui concerne les jeux en réseau qui "auto-trouvent" les serveurs ouverts, EN LAN LOCAL BIEN SUR (d'ailleurs, Local Aera Network pou LAN hein), j'ai mon idée.
en fait si je devais faire un truc comme ça, je me baserai sur ce principe là : une LAN, c'est des pc branchés sur un même réseau, appartenant au même réseau, c'est à dire tous avec l'ip A.B.C.X où A B et C sont tous les mêmes ! Seul X varie.
Ceci limite le scan à 255 valeurs, moins les réservés (0 j'en suis sûr et 255 je crois aussi ?) : c'est ce petit temps de latence pendant la recherche, fort court mais existant. Fortement probable non ?
D'ailleurs, j'ai déjà essayé, deux réseaux différents, genre A.B.X.Y relié par un pont, le pc de l'un trouve ceux de son réseau mais pas les autres, dans un jeux en autosearch, alors que dans windows on peut lister tous les postes des 2 réseaux. Probant !

jockos,FuSe> merci ;)

JCpp> bon courage !

@+
Celiphane

signaler à un administrateur
Commentaire de walk le 29/07/2003 09:47:12

Merci pour ce tuto, moi newbie total j'aime bien, et je comprend mieux mon boulot.
Pour le lan, il te manques des trucs.
tout d'abord, je voulais souligner la différence entre TCP et UDP, tous les deux protocoles de la couche 4, il faut savoir qu'UDP fonctionne sans aquitement alors que TCP attends l'aquitement pour envoyer la suite de ses paquets... Voilà pour ca.
Ensuite pour les @ IP des réseaux, elles sont classées en trois catégories, c'est ici qu'il te manque des trucs celiphane
Classe A: 1.0.0.0.0 à 126.255.255.255
classe B: 128.0.0.0 à 191.255.255.255
classe C: 192.0.0.0 à 223.255.255.255
Classe D: 224.0.0.0 à 239.255.255.255
Sachant qu'il existe des plages résevées:
127.0.0.0 loopback
classe D réservé au multicast, et les adresses en X.255.255.255, X.X.255.255 et X.X.X.255 sont des adresses de broadcast.
Le reste des adresses, la classe e est expérimentale. Enfin, il ne faut pas oublier que dans chacune des classes existe des plages d'adresses privées non routées sur Internet comme la plage 10.0.0.0.
Voilà, donc il te manque des adresses pour ton calcul.

signaler à un administrateur
Commentaire de jockos le 29/07/2003 10:13:32

Il faut aussi préciser pour être complet que UDP ne fait pas le réordonnancement des paquets reçus !
C'est à dire que quand les paquets arrivent dans le désordre, il faut les remettre dans le bonne ordre afin de lire le message envoyé tel qu'il était.
Il faut donc quand on utilise UDP utilisé un p'tit protocol pour faire cela. (protocol de niveau applicatif ou juste au dessus de la couche transport du modèle OSI).

Bref, ne vous galérez pas à utiliser UDP sauf pour des applis très spécifiques comme la vidéo conférence ou la téléphonie IP (dans ce cas, on utilise le protocol RTP qui se situe juste au dessus de la couche Transport, donc juste au dessus d'UDP).

signaler à un administrateur
Commentaire de celiphane le 29/07/2003 12:31:10

Parfait parfait, voici de nouvelles infos toutes fraiches pour les futurs Newbies qui viendront s'inspirer de ce tutorial !
Merci à tous
PS: cela dit j'avais un peu entrevu tout ça dans des cours d'archimat ça fait un bout de temps mais j'avais pas eu l'idée que cela puisse intéresser qq'1. Toujours est-il que je n'aurai pas été aussi précis et clair, donc bravo :) !

@+
Celiphane

signaler à un administrateur
Commentaire de GetheBeber le 01/08/2003 10:34:14

Bon bé écoute, grâce  à toi, le winsock m'est enfin apparu clairement au grand jour :]
Fini l'obscurentisme....!!!
Merci bien

signaler à un administrateur
Commentaire de yannickt le 31/08/2003 08:02:26

Félicitation et merci pour votre tutoriel, très complet et très vivant!

signaler à un administrateur
Commentaire de moustachu le 16/09/2003 13:25:57

Sympa j'ai bien apprécié ton Tut'. J'espère juste que la Mamie n'a pas fondu cet été.
Je m'en vais voir tes codes sources.
+

signaler à un administrateur
Commentaire de cedricdierckx le 25/09/2003 18:13:16

Salut,
il est bien le prog, mais j'ai un problème:
J'ai essayé avec un copain, mais ça ne fonctionne pas...
On n'arrive pas à ce connecter avec Winsock.  J'ai déjà essayé une dizaine de programmes, rien ne va...
On a tout les deux Windows XP et on est tous les deux derrière un router...
J'espère que l'un de voux pourra m'aider...

signaler à un administrateur
Commentaire de celiphane le 09/10/2003 18:34:18

cedricdierckx>ba pour ce qui est question d'aider disons que la requête est pas très précise ! et puis, ta du mal voir car c pas un prog cette source ! lol ;)

moustachu> merci, mais la mamie va bien !

@+
Celiphane

signaler à un administrateur
Commentaire de gregmena le 23/10/2003 18:17:08

Bon tutorial pour les débutants, bonne continuation

signaler à un administrateur
Commentaire de misterzinzin le 28/10/2003 23:59:06

y a un truc qui a du m'echapper...

quand je met:
Private Sub Form_Load()
Winsock1.LocalPort =69 'pq 69 me direz vous mais bon on s'en fout
Winsock1.Listen
End Sub

j'ai le joli message d'erreur 40026
Etat de connexion ou de protocole errone pour la transaction ou la requete requise

et comme tjs je vien de me rendre compte de l'erreur...
mais je poste quand meme le message pour celui a qui ca arriverais:
quand on utilise la fonction winsock1.listen, il faut que ce dernier ne soit pas en protocol udp (ben vi faut du tcp sinon ca marche po!)
enfin c tout con mais falais que ca m'arrive...

signaler à un administrateur
Commentaire de Scooby1 le 15/11/2003 03:26:38

Salut à tous,

Voici un exemple de multi-serveur mais avec trois Winsock :
http://www.vbfrance.com/code.aspx?ID=17948

@+

signaler à un administrateur
Commentaire de Scooby1 le 15/11/2003 03:46:38

Re :

Il va falloir m'expliquer comment vous vous y prennez pour monter, avec deux Winsock, un multi-réseaux de type :

Serveur : émission/réception
Client1 : émission/réception
Client2 : émission/réception
Client3 : émission/réception
Client4 : émission/réception
etc...

Merci d'avance.

signaler à un administrateur
Commentaire de celiphane le 15/11/2003 04:41:42

Premièrement, merci pour l'intérêt porté à mon tutorial, et merci pour la source Zip, tout ca fait preuve de très bonne volonté pour la communauté !

Le seul petit point qui m'embête vois-tu, c'est que non, désolé (c'est bien tenté ;) !), mon petit tuto n'a pas d'erreur ! Un multiconnect ne nécessite que 2 winsocks sur le serveur, et un winsock par client ! relis bien le tuto et refais-le point à point, je t'assure que la solution énoncée est LA solution ;)
Désolé si ma syntaxe et mon parler ne sont pas clair ! J'ai voulu faire simple et rapide, peut-être un peu trop ! ;)

Et pour ne pas faire de doublons, je ne vais pas poser à mon tour un exemple correct de multiconnect, je me contenterai de te faire confiance en ce qui concerne le remaniement de ta source pour qu'elle "colle" au tuto (avec 2 wck pour le srv), et je préciserai juste également aux autres que j'ai parmi mes autres sources une source "chat", avec un multiconnect !

Voilà, voilà !

Sur ce, merci encore à tous pour vos commentaires et votre participation à rendre l'utilisation de ce winsock plus clair, que diable ! Merci Scooby1 pour ton adaptation !

[[
astuce pour le remaniement : honnetement, a quoi sert ton bouton connection sur la form du serveur, ainsi que le winsock wck(0) de cette meme feuille ? vire les, vire le code correspondant, et voila un multiconnect propre et correct : 1srv avec 2 wck et 3 clt, !
ha oui aussi, faut changer la procédure
  Private Sub Wck_Close(Index As Integer)
    Unload Wck(Index)
    If Wck.Count = 0 Then nb = 0
  End Sub
en mettant le Serv à la place de Wck, et le tour est joué !
Bravo encore !
]]

@+
Celiphane

signaler à un administrateur
Commentaire de celiphane le 15/11/2003 04:57:43

tu m'as demandés une explication sur le fonctionnement,
l'explication la voila la voici :

j'ai 4 progs : srv, clt1, clt2, clt3

srv possède :
- un winsock indexé, nommé MonWck
- un winsock serveur, nommé MonSrv

clt1, 2, 3 et 4 possède :
- un winsock, nommé MonWckClt

je lance srv, au démarrage il passer le winsock MonSrv en écoute de connexion.


je lance clt1, au démarrage il se tente de connecter son MonWckClt à MonSrv

MonSrv reçoit la demande de connexion, il génère un nouveau MonWck tout frais

Le nouveau MonWck prend la demande de connexion de MonWckClt de clt1

A ce point, nous avons un "tuyau" établit entre srv et clt1, par le biais de MonWckClt de clt1 ainsi que le nouveau MonWck de srv, "tuyau" dans lequel le débit peut passer.

je lance clt2, au démarrage il se tente de connecter son MonWckClt à MonSrv

MonSrv reçoit la demande de connexion, il génère un nouveau MonWck tout frais

Le nouveau MonWck prend la demande de connexion de MonWckClt de clt2

A ce point, nous avons un second "tuyau" établit entre srv et clt2, par le biais de MonWckClt de clt2 ainsi que le nouveau MonWck de srv, en plus du premier "tuyau".

L'opération va se répéter avec clt3

Maintenant, nous avons la configuration suivante :
srv est relié à clt1 par un "tuyau"
srv est relié à clt2 par un "tuyau"
srv est relié à clt3 par un "tuyau"

Le débit dans un "tuyau" passe dans les 2 sens (émission ET réception).

srv veut communiquer avec clt1 ? il utilise la liaison établit à cet effet
clt2 veut communiquer avec srv ? il utilise la liaison établit à cet effet
clt3 veut communiquer avec clt1 ? il envoie les données à srv avec un code pour que ces données soient réacheminer vers clt1. C'est juste de l'algo...

Voici schématiquement un multiconnect fonctionnel, avec 2 winsocks côté serveur et un winsock par client.

Je pense avoir été plus clair ainsi ;)

@+
Celiphane

signaler à un administrateur
Commentaire de Bestoftheweb le 17/11/2003 23:02:45

bien joué ;)

signaler à un administrateur
Commentaire de Scooby1 le 21/11/2003 22:45:10

Ouais en faite ma source est juste car j'utilise ton systeme sauf qu'il y a trois Winsock sur mon serveur car j'y ai mis un des clients avec. donc ton code foctionne c'est juste que je me suis un peu emmèler les pinceaux, toutes mes excuses.

Donc ma sources est juste et peut donc servir d'exemple pour ton tutorial.

@+

signaler à un administrateur
Commentaire de FlashYop le 30/11/2003 18:23:37

Euh merci mais j'ai un pb avec ton code, au niveau du multi server, j'ai changé winsock en server, mais ce que j'ai pas compris c'est qu'il manque des fonctions car le serveur prend la connection cré un Wck(nb), fait Wck(nb).Accept requestID
maisil faut un Private Sub Wck_DataArrival(ByVal bytesTotal As Long) ?
pour le getdata mais ce nom de fonction marche pa car c Wck(nb) et non Wck et quand je met Wck(nb)_DataArrival(ByVal bytesTotal As Long) marche pa non plus ...

Merci

signaler à un administrateur
Commentaire de FlashYop le 30/11/2003 18:37:51

C bon jai reussi il fallait mettre :

Private Sub Wck_DataArrival(Index As Integer, ByVal bytesTotal As Long)
Dim data As String
Wck(Index).GetData data
MsgBox data
End Sub

c le index as integer que je savais pas... et aussi le Wck(Index)

Merci qd meme :)

signaler à un administrateur
Commentaire de celiphane le 30/11/2003 22:39:21

suffit que je précise pas UNE ligne de code (Private Sub Wck_DataArrival(Index As Integer, ByVal bytesTotal As Long)
) et ça y est mon code marche pas... cherchez un peu par vous même les gars les filles !   ;)

@+
Celiphane

signaler à un administrateur
Commentaire de FlashYop le 01/12/2003 02:48:28

J'ai pas di qu'il ne marchait pas...

signaler à un administrateur
Commentaire de celiphane le 01/12/2003 09:42:00

je précise quand même que c'était de l'humour ;)

(tout le monde trouve des difficultés dans l'apprentissage de quoi que ce soit, et c'est bien normal !!!)

@+
Celiphane

signaler à un administrateur
Commentaire de Scooby1 le 01/12/2003 11:11:09

J'espère que ma source à déjà bien servie. @+

signaler à un administrateur
Commentaire de madbob le 19/12/2003 11:32:47

En plus d'être divertissant c'est instructif.
J'aime bien votre approche à tous.
:-)

signaler à un administrateur
Commentaire de mythic_kruger le 26/01/2004 02:28:29

Excellent tuto, c'est incontestablement LA référence pour ceux qui veulent apprendre à utiliser Winsock avec le protocole TCP.

Pour répondre à une question posée plus haut,
comment surmonter le problème des IP dynamiques, voici plusieurs propositions:

1. Lancer le serveur, depuis chez soi par exemple, puis communiquer l' IP aux clients. Le problème est que le serveur doit tourner en permance, et au premier reboot l' ancienne IP est obsolète. Méthode exclue, car trop précaire et volatile.

2. Obtenir une IP fixe. Et utiliser cette IP par le client.
Le problème est que si l' ordinateur du serveur est éteint, ou si le programme de chat est fermé, la connection des clients échoue.

3. Utiliser un serveur qui tourne 24/7 pour stocker l' IP du serveur (qui change invariablement).
Perso j' ai créé le programme de chat qui est à la fois client ou serveur.
Lorsqu' on lance le programme, un contrôle Inet ouvre un fichier txt situé sur un serveur LINUX. S' il est vide, le Inet appelle un script Perl sur le serveur, qui écrit l' IP dans le fichier texte. puis le programme passe en mode Serveur, avec méthode listen pour le winsock d' écoute.
Toute connection suivante trouvera cette IP dans le fichier sur le serveur LINUX via le contrôle inet, et se connectera directement à cette IP, en mode Client!
Si le serveur crashe (windows crashe parfois nan?), le prochain client à vouloir se connecter va trouver l' IP, mais invalide, la connection va échouer. Dans ce cas, le prog place sa propre IP et devient le serveur.
Un chat vraiment dynamique!

Cette méthode est forcée d' utiliser un Server Side Include comme CGI pour écrire dans le fichier texte. La majorité des serveurs webs tourne sous Linux, on peut donc manipuler ce fichier à distance avec des scripts Perl ou PHP.
C'est d' ailleurs ainsi que fonctionne -pour ceux qui connaissent Half-life- WON ou, plus récemment, Steam: un serveur relai stocke en permanence les adresses des serveurs de jeu qui tournent, et notamment les WONID ou SteamID des joueurs connectés.

Bonne prog :D

signaler à un administrateur
Commentaire de celiphane le 26/01/2004 09:39:56

Merci pour ton commentaire.

Ta dernière solution est vraiment pas conne ! Je la méditerai pour mes prochains développement !

@+
Celiphane

signaler à un administrateur
Commentaire de bal12452 le 02/02/2004 21:40:43

salut celiphane,
excusez pour la question con mais je suis un newbie et y'a un truc que je comprends pas : à la premiere connection au serveur, ça marche, j'envoie un message, le serveur le reçoit puis je ferme le client et je le relance, impossible de se reconnecter au serveur ! Sauf si j'eteind et que je rallume le serveur...
Ta grande connaissance pourra surement m'éclairer !
merci d'avance!

signaler à un administrateur
Commentaire de FuSe le 02/02/2004 21:52:22

salut,
dit est ceque tu as pensé a réinitialiser le winsock ??
dans un timer, ou sur l'evenement ondisconnect (un truc dans le genre )
il faut que tu fasse winsock.close puis winsock.listen...
ainsi ton controle winsock est a nouveau près pour recevoir une connection

signaler à un administrateur
Commentaire de bal12452 le 02/02/2004 23:48:23

merci FuSe, t'avais raison.
c'est a l'evenement .close : j'avais mis winsock.close mais pas winsock.listen donc rien risquait de se connecter!

signaler à un administrateur
Commentaire de celiphane le 03/02/2004 09:31:06

Bien bien.
Ce qui est bien avec ce tutorial, c'est que je n'ai même plus à me donner la peine de répondre aux question qui me sont posées ;)

Merci FuSe pour cette brillante déduction !

bal12452, voilà, n'hésite pas à me redemander de l'aide :o) lol

@+
Celiphane

signaler à un administrateur
Commentaire de Paganel le 06/02/2004 19:59:45

Merci beaucoup à ce brillant tutorial qui m'a permis de beaucoup mieux  comprendre.
En fait je cherche à faire un jeu (je sais pas encore lequel mais simple genre dames/échecs etc..) online et donc ce tutorial ma beaucoup servi :)

Encore bravo et Merci :D

signaler à un administrateur
Commentaire de Paganel le 06/02/2004 23:39:14

mais en fait g un tit problème :)
Je ve faire un tit chat à 2 personnes .. bon alors je l'ai fait et en fait g fait un pour l'instant un prog pour le server et un prog pour le client . Si je lance les 2 sur mon pc avec le prog server,  je cree un server puis je rejoin avec le prog client en mettant comme ip 127.0.0.1 (comme tu la mis) . Et là tout marche parfaitement.
Par contre j'ai envoyé le prog client à un copain, j'ai cree un server sur le prog server et je lui ai donné mon IP (par ex : 94.210.152.146) , il a essayé de se connecter mais ca ne marche pas.
Merci d'avance de votre aide. :)

PS : (les wsk sont bien en TCP)

signaler à un administrateur
Commentaire de Paganel le 07/02/2004 14:30:32

c encore moa :D
en fait g réussi à régler la moitié du prob.
G mixer les 2 prog en 1 et en fait kan c un pote ki héberge ca marche mais pas quand c moi.
G le Wi-fi et en fait y a un prob avec mon ip .
Quand je vais sur des sites qui donnent l'ip g un nombre normal par ex : 65.45.125.256 mais ca ne marche pas quand je le donne à mon pote pour rejoindre. Mais si j'utilise un des programmes de ce site pour donner l'ip externe ca me fait 10.0.0.1.. (qui ne marche po non plus d'ailleurs).
Comment puis je régler mon prob ?
merci d'avance :)

signaler à un administrateur
Commentaire de celiphane le 07/02/2004 16:10:18

Salut,

sans trop m'avancer je dirais que tu as bien codé ton ou tes progs. De toute facon si tu suis le tuto ya normalement AUCUN problème. Je me réconforte dans cette idée (que tu as bien codé) en soulignant le fait que ça marche dans certains cas, ton problème étant que ca ne marche pas dans TOUS les cas. A ce moment là, je m'aventurerais à penser que c'est un souci de connexion pure, matos protocle & compagnie... firewall routeur et choucroute dans le cablage (dernière proposition moins sûre je pense). Je peux t'aider dans le winsock, le petit fichier OCX, et le petit méli mélo qu'il requiert d'écrire dans la chtite feuille de visual basic, mais pas dans compote hardwarienne protocoléenne. Je céde ainsi la parole aux autres habitués de cette page... messieurs, merci !

@+
Celiphane

signaler à un administrateur
Commentaire de JoVB le 08/02/2004 09:42:31

QQN disait avoir des problèmes de licences avec Winsock... voici ce qu'il faut faire (excusez moi si on y a dja répondu, j'avoue, j'ai pas tout lu)
Dans REGEDIT :
à l'emplacement HKEY_CLASSES_ROOT\Licenses\" Clé "2c49f800-c2dd-11cf-9ad6-0080c7e7b78d" (qui correspond à la liscence WINSOCK) entrez "mlrljgrlhltlngjlthrligklpkrhllglqlrk"

(ou simplement créer un fichier texte comme suit :)
REGEDIT
HKEY_CLASSES_ROOT\Licenses\2c49f800-c2dd-11cf-9ad6-0080c7e7b78d = mlrljgrlhltlngjlthrligklpkrhllglqlrk


Voila et encore vraiment bravo a celiphane !!

//JoVB

signaler à un administrateur
Commentaire de Disicom le 09/02/2004 15:31:29

Salut, mon ptit celiphane,

En grand expert du winsock, peux tu m'aider, après avoir fait le tour de Vbfrance depuis quelques mois, je recherche en vain, une solution a mon ptit problème...

- Voici, je voudrais me connecter en winsock d'un ordinateur en réseau en passant par le net sur un autre ordinateur en réseau..?
(on sous entend que l'on connait les ip de tout....) (imagine par exemple MSN qui peut se connecter de n'importe ou)

J'ai quelques d'idées sur les moyens, mais rien de concret et ce qu'il me faudrait, peux-tu m'aider ?

Mes idées sont d'utilisées les adresses MAC grâce au WMI... mais bon rien de solide dessus..

Merci...
++

Disicom

signaler à un administrateur
Commentaire de radcur le 26/02/2004 03:06:07

Message pour Paganel:

es-tu derrière un routeur ou un coupe-feu (firewall) ?  Si oui, c'est normal que ton ami ne puisse te rejoindre puisque c'est ton routeur/firewall qui bloque l'entrée.  Par contre, si c'est toi qui communique avec lui (et qu'il n'a pas de routeur/firewall) c'est certain que ca va fonctionner.  Pour contourner le problème (si tu as un routeur/firewall) tu dois placer ton PC en DMZ (DeMilitarized Zone) dans la configuration de ton routeur.  Pour ce qui est de ton adresse 10.0.0.1 ca focntionne seulement si tu es sur un LAN (réseau local).  Une adresse 10.x.x.x ne foncitonnera jamais sur Internet puisque c'est l'essence même d'une adresse 10.x.x.x!  Les adresses 10.x.x.x, 192.168.x.x et une autre que je me rappelle plus sont pour les réseaux d'entreprise ou à la maison.

En espèrant que ca puisse t'aider.
RadCur

signaler à un administrateur
Commentaire de radcur le 27/02/2004 02:25:23

Bonjour,  

je vis actuellement un problème intermittent .  J'ai un serveur multi-client (selon la méthode de Celliphane) et un client.  Il arrive que les 2 PC se connecte un à l'autre mais rien ne se passe. En réalité, quand le client se connecte au serveur, une "conversation" devrait s'entamer entre eux pour échanger des informations et se déconnecté par la suite.  Parfois, environ 1 fois sur 3, la connexion se fait mais la conversation ne s'entâme pas.  J'utilise DoEvents après ma connexion pour donner le temps de réagir mais ca ne foncitonne pas.  J'ai essayé un
for i = 1 to 20000
next i

pour ralentir mais ca fontionne pas.
J'ai essayer un timer de 5 secondes (5000 ms) mais malheureusement mon problème persiste.

J'utilise le Service Pack 5 pour mettre toutes les chances de mon côté.

signaler à un administrateur
Commentaire de mythic_kruger le 27/02/2004 03:07:46

essaie de débuguer to appli au niveau du wsk_ConnectionRequest et connection_connect. Tu peux lancer deux instances de la même appli sur la même bécanne en te connectant à 127.0.0.1.

signaler à un administrateur
Commentaire de radcur le 28/02/2004 14:35:15

mythic_kruger : merci mais c'est déjà fait et sur la meme machine ca fonctionne super bien et je ne vis pas ce problème. C'est dès que je les fait foncitonner sur 2 machines que mon problème apparait de facon intermittente.

Je suis entrain de me monter une autre machine alors je vais tester sur une autre et si ca persiste ca ne sera pas la machine alors mais mon appli quand elle doit s'excuter a "distance"

signaler à un administrateur
Commentaire de mythic_kruger le 28/02/2004 18:24:55

Bien. Ton appli est ok, mais pas de connection. Il s' agirait probablement de la configuration des ports routeur/firewall, en assumant que les deux bécannes partagent le même protocole réseau ;)

signaler à un administrateur
Commentaire de jockos le 29/02/2004 11:22:11

Si tes 2 applis marchent sur la même bécane (grâce à l'interface de bouclage du protocol IP, c'est à dire localhost --> 127.0.0.1), c'est que le problème vient d'en dessous du niveau IP (Couche Liaison de données certainement) ou alors au niveau d'IP, donc un problème effectivement d'adressage IP.

signaler à un administrateur
Commentaire de radcur le 29/02/2004 16:17:03

Merci à Mythic_kruger et Jockos .. j'ai trouvé!   Jockos....  quand j'ai vu ton msg j'ai cliqué...  puisque je suis sur un LAN avec DHCP (pour mon environnement de devellopement) j'utilisais le nom de machine au lieu de son adresse IP puisque ca peut changé sans avertissement.   En utilisant l'adresse IP j'ai 100%  de succès à toutes les fois.  Sûrement que Windows  sur mon poste client était trop lent pour envoyer un "broadcast" pour trouver le poste serveur et ravoir son IP dans un délai raisonnable.  Puisque mon application serveur une fois terminée roulera sur un serveur Win2000 avec une adresse IP fixe mon problème ne se reproduira plus.

encore une fois... un gros merci!

signaler à un administrateur
Commentaire de celiphane le 29/02/2004 19:12:41

Ce qui est bien sur cette source, c'est qu'il y a des gens compétents qui la suivent...

En ce qui me concerne, veuillez m'excuser pour mes absences réitérées, mais mes heures de participations "actives" sont écoulées je crois. Mon emploi du temps est aujourd'hui chargé de famille et de travail, ainsi ma participation communautaire devient peu à peu "spectatrice"...

Bonne chance à tous !


@+
Celiphane

signaler à un administrateur
Commentaire de kelly le 02/03/2004 04:32:01

ouah tout d'abord bravo pour ce tuto qui souleve les commentaires et fait jaser les questions depuis ... 2 ans ?!?

La mienne est la suivante :
Je déteste envoyer des string (au sens informatique tu terme :/ ) par les socket, j'utilise en fait toujours mes winsock avec des vbArray+vbByte. Et voilà mon problème : comme je fais pour envoyer des valeur de type single ? Je peux bien sûr tricher en écrivant une fonction tordue qui à un single associe 4 bytes mais en plus du temps incroyable nécessaire à la conversion, je me démerder pour perdre de la précision.

Ya moyen de faire ca proprement et si oui comment ? Merci d'avance !

signaler à un administrateur
Commentaire de BrianceauMat le 02/03/2004 12:26:06

Bravo pour le tutorial mais est-ce que quelqu'un sait comment on peut faire sous VB.NET ?

Merci d'avance

signaler à un administrateur
Commentaire de radcur le 04/03/2004 02:49:14

Salut Kelly,

  As-tu essayer avec la fonction cbyte(donnees Single).  Pour faire l'inverse tu utilises cSng(données bytes).

Dis-moi si ca fonctionne!

RadCur

signaler à un administrateur
Commentaire de kelly le 04/03/2004 03:44:38

mmh avant d'essayer jme suis dit : "si ca marche le truc à radcur, jme bouffe les couilles"

mais bon, ne pouvant plus tenir, j'essaye, et là ! argggg!

              enfer et damnation !

ca marche pas :):):):)

moralité (c'est pas contre toi radcur :) :

* MES COUILLES SONT SAUVES ET LES BREBIS SERONT BIEN GARDEES *

sérieusement, même VB ne parvient pas à coincer les 32 bits d'un single dans les 8 d'un byte :)

Cela dit, j'ai trafiqué un truc bizarre comme prévenu dans ma question : si ca intéresse qqun voici le code de ma fonction d'encodage (1 single -> 5 bytes) et de décodage (5 bytes -> 1 single) :

Public Sub float2bytes(f As Single, ByRef bdata() As Byte, i As Long)
  'mantisse sur 4 octets puis opposé de l'exposant sur 1 octet
  'i est le rang du premier octet dans le tableau de byte bdata, où
  'sera stocké le single encodé
  Dim ff As Single: ff = Abs(f)
  Dim j As Long: j = 0
  While ff <> Int(ff)
    ff = ff * 10!
    j = j + 1
  Wend
  Dim l As Long: l = CLng(ff)
  bdata(i) = (l \ &H1000000) And &HFF&
  bdata(i + 1) = (l \ &H10000) And &HFF&
  bdata(i + 2) = (l \ &H100&) And &HFF&
  bdata(i + 3) = l And &HFF&
  If f >= 0! Then
    bdata(i + 4) = j
  Else
    bdata(i + 4) = j + 128
  End If
End Sub

Public Function bytes2float(ByRef bdata() As Byte, i As Long) As Single
  If bdata(i + 4) < 128 Then
    bytes2float = (bdata(i) * &H1000000 + bdata(i + 1) * &H10000 + bdata(i + 2) * &H100& + bdata(i + 3)) / CSng(10 ^ bdata(i + 4))
  Else
    bytes2float = -(bdata(i) * &H1000000 + bdata(i + 1) * &H10000 + bdata(i + 2) * &H100& + bdata(i + 3)) / CSng(10 ^ (bdata(i + 4) - 128))
  End If
End Function

signaler à un administrateur
Commentaire de the_best le 09/03/2004 16:11:21

J'ai une grave porblème : mon programme (avec winsock) ne marche qu'en résau local !!! comment l'utiliser avec Internet  HELP ME !!!!!

signaler à un administrateur
Commentaire de jockos le 09/03/2004 16:40:53

Expliques un peu mieux ton problème...

Mais pour commencer, ce que je peux te conseiller de faire, c'est d'essayer un simple PING sur l'adresse IP de la machine que tu veux atteindre via Internet avec ton Winsock, tu seras déjà pas mal fixé sur la nature du problème... ;)

signaler à un administrateur
Commentaire de celiphane le 09/03/2004 16:41:13

Alors tu peux résoudre ton problème...

- en commençant par ne pas faire de multi-post, malgré la lenteur de réaction du site... ça risque pas de l'améliorer sur ce point.

- ensuite, en relisant quelque peu les commentaires de ceux qui sont passés avant toi, notament ceux qui soulignent que quand ça marche en local, c'est que ça marche tout court > il faut revoir ton matériel connexions pont firewall routeur etc... mais là déjà t'as plus besoin de relire t'as les réponses.

@+
Celiphane

signaler à un administrateur
Commentaire de thierrydelepine le 30/03/2004 00:02:17

bonjour celiphane,
tout d'abord bon tutorial, ta peine mérite un 10+
une petite info sur ton comment du 05/06/2003 23:06:53
Il est vra que l'UDP a beaucoup moins d'interet, le TCP c'est l'avenir.
L'UDP a un quand meme un gros avantage sur des reseaux locaux:
c'est de supporter le broadcast et le multicast.
cela permet de faire dialoguer des machines qui ne sont pas sur les mêmes plages d'adresses IP (mais non séparées par des routeurs, a moins que les routeurs autorisent ce type de flux) ou de faire des decouvertes sur le reseau (le client trouve tout seul son serveur, pratique aussi pour des bascules de serveurs).
voila, c'etait pour info.

signaler à un administrateur
Commentaire de the_best le 30/03/2004 08:44:21

Mon problème : le serveur n'écoute pas vers internet (mais ca marche en réseau local). J'ai peut-être trouvé la solution ; la commande bind (sur le winsock). Si qqn pourait le tester(par internet) car mon ordi de test s'est auto-bouzillé

signaler à un administrateur
Commentaire de mourad183 le 06/04/2004 16:49:55

salut, chapeau celipharde, safé presque une anée que je cherche à comprendre winsock, j'ai presque lit tous les cours de la planete lolll, je te remercis bcp pour ce fabuleux travail, il m'a bcp aidé, mais.... j'ai un tit prb, je vx que tu me montre (je pose la question a tlm) comment gerer les erreurs je vx dire si un client (ou serveur) n'ecoute pas je vx evité le debug.....

sinon je te donne 10/10 ;) bravoooo

signaler à un administrateur
Commentaire de pouda le 14/04/2004 19:35:57

franchement ca dechire ton tut heureusement i ya des trypes comme toi ki prenne le temps de former des newbies comme moi ki decouvre le monde du develloppement...

meric je te met un 10/10

signaler à un administrateur
Commentaire de GlanduSchmoldu le 08/05/2004 20:00:40

Salut les aminches, bravo pour ce tutorial vachement cool (je ne m'étend pas sur les louanges pas mal de monde s'en est déjà chargé). Deux problèmes se posent à moi :

1- Au secours je comprend plus. L'erreur 10048 "Adresse en utilisation" veut ma peau. Je comprend pas pour le meme programme des fois elle vient des fois pas. C'est terrible. Et ce même en circuit fermé (je veux dire en 127.0.0.1).

2- Quand ça marchait, on ne pouvais pas se connecter à moi car Zone Alarme empechait tout les vils piratins de hacker ma belle machine. Radcur à dis de se mettre en DMZ, mais je trouve ça nul part.

Voilà comme j'ai l'impression qu'il y a ici quelques sommités en la matière, je ne doute pas de la qualité des futures réponses et en remercie chaleureusement les auteurs dès à présent.

Pour information je travaille sous Windows 2000.

Et puis quand même si aller : FELICITATIONS ! VIVE LE TUTORIAL ! OUAIS ! [projections de grains de riz]

signaler à un administrateur
Commentaire de GlanduSchmoldu le 09/05/2004 14:11:17

C'est encore moi. En fait j'ai trouvé pour l'erreur 10048, il fallait fermer le Winsock à la fermeture de l'application et avoir un localPort à 0. J'aurais dû mieux chercher avant de demander.

Mais je bute toujours sur mon FireWall.

Et si par hasard qqun avait des infos sur la communication avec un FTP ...

Voilà merci

signaler à un administrateur
Commentaire de romano2005 le 31/05/2004 12:50:02

je t'ai mit 10 pour ton tut
par contre
moi j'ai un blème dans les multiconnexions
quand je mets la propriété index à 0 dans mon projet client
j'ai plein de message d'erreur

signaler à un administrateur
Commentaire de the_best le 01/06/2004 13:08:42

1) Tu ne peut pas créer un winsock avec l'index 0 si il n'existe pas
2) Tu ne peut pas changer l'index d'un objet en cours de programation

signaler à un administrateur
Commentaire de scoder le 07/06/2004 11:36:45

Comme tant d'autres l'ont fait avant moi SUPER TUT'!
chapeau bas l'artiste!

10/10

signaler à un administrateur
Commentaire de scoder le 07/06/2004 13:46:26

j'ai testé la mutliconnexion et ça marche impec, sauf un petit problème....
je m'explique :
j'ai besoin d'utiliser une boucle for...each... pour envoyer des données à tous les clients à partir du serveur. Les index de mes winsock ne se suivent pas forcément (certains clt peuvent se déconnecter) d'où l'intérêt de for...each
le problème est que ce code me génère une erreur "type incompatible" :
dim w as winsock
for each w in F_serveur 'F_serveur étant le nom de mon form
     w.senddata(data)
     doevents
next

si je ne passe pas par la variable w mais directement pas for each winsock il me dit variable requise....
quelqu'un aurait la solution?



signaler à un administrateur
Commentaire de jockos le 07/06/2004 14:02:33

Moi, je crée une liste (tableau dynamique avec "Redim Preserve") contenant les clients connectés.
Dès qu'un client se connecte, je l'ajoute à ma liste des clients.
Quand il se déconnecte, je l'enlève de la liste et je remet à ajour la liste.

L'idéal serait de faire une liste chainée, mais en VB, c'est loin d'être aussi facile qu'en C/C++. Donc, tu peux utiliser un tableau dynamique...

signaler à un administrateur
Commentaire de GlanduSchmoldu le 07/06/2004 14:05:06

Salut Scoder, ton problème doit venir de ce que tu boucle (avec for each) sur ton form, du coup certains objets ne sont pas des winsocks, d'où erreur.
Il suffit que tu boucle sur un groupe de contrôle de winsocks, et non sur un form (en remplaçant F_serveur par ton groupe).

signaler à un administrateur
Commentaire de Disicom le 07/06/2004 14:20:04

Salut,

Moi j'utilise une collection pour gérer les contacts connectés ou non, mais ca m'intéresse ton code avec for...each ..j'aimerai bien avoir la suite sur la résolution de ce problème !!

signaler à un administrateur
Commentaire de celiphane le 07/06/2004 14:38:05

Salut à tous.

J'interviens rarement, mais sur ce point je souhaite donner confirmation à GlanduSchmoldu.

Par exemple, prenez une form, mettez-y un bouton, puis copier coller le plusieurs fois en spécifiant que, oui, c'est un groupe de contrôle.

Puis posez ce code dans la form :

Private Sub Form_Click()
Dim O As CommandButton
  For Each O In Command1
    O.Caption = "test"
  Next O
End Sub


Exécutez, et cliquez sur la form comme l'indique l'évenement cité...

@+
Celiphane

signaler à un administrateur
Commentaire de GlanduSchmoldu le 07/06/2004 14:49:45

Merci du soutient Celiphane.

signaler à un administrateur
Commentaire de scoder le 07/06/2004 15:27:53

c'est bon j'ai résolu mon problème
dans msdn je vois que la variable utilisée avec for...each doit être de type variant. j'ai donc fait
Dim w As Integer
w = winsock.Count - 1
For i = 0 To w
    If winsock(i).State = sckConnected Then
        winsock(i).SendData ("test")
        DoEvents
    End If
Next

comme ça plus besoin de for...each
c'est pas trop optimisé mais pour l'instant ça fera l'affaire jusqu'à ce que je (ou qqn d'autre) fasse mieux)

signaler à un administrateur
Commentaire de celiphane le 07/06/2004 15:45:03

ba c'est assez triste de voir la solution que tu as choisi, alors qu'on t'as donner le mieux juste au dessus...

enfin bon...


@+
Celiphane

signaler à un administrateur
Commentaire de scoder le 07/06/2004 17:39:00

oui ta solution est bonne celiphane mais j'ai un problème avec elle,
voilà mon code
Dim w As winsock
For Each w In winsock
    w.SendData ("test")
    DoEvents
Next
il me met "etat de protocole ou de connexion erroné pour la transaction ou la requête requise"
est ce que cela vient du fait que j'ai un autre contrôle winsock sur mon form qui ne gère que les requêtes de connexion (cf ton tut' ;) )?
parce que la connexion est bonne puisque ma solution fonctionnait....

signaler à un administrateur
Commentaire de FuSe le 07/06/2004 22:33:24

bon vu que c'est vivant ici, je bloque un peu.
moi j'essaie de faire uniquement de l'objet. Donc j'ai une classe client et j'aimerai avoir une propriété as winsock mais bon ça marche pas avec un groupe de controles
dans un bouton sur la form
Load W(1)
Dim C As ClClient
Set C = New ClClient
W(0).Listen
Call C.init("127.0.0.1", "26", W(1))

classe :
Dim ip As String
Dim port As Integer
Dim winsk As Winsock

Public Sub init(i As String, p As Integer, ByVal wins As Winsock)
ip = i
port = p
Set winsk = wins
winsk.Protocol = sckTCPProtocol
winsk.RemoteHost = ip
winsk.RemotePort = port
winsk.Connect
End Sub

donc il autorise pas mon winsock du client à se connecter au winsock de la form ( erreur : adresse already in use) :S
C'est pas le but de l'appli de se connecter à elle même , mais si ça marche pas en local ça risque de pas être mieux en réseau ;)

Donc voila, est ce que certains sauraient comment intégrer un winsock à un objet ?

signaler à un administrateur
Commentaire de GlanduSchmoldu le 08/06/2004 14:02:01

FuSe, si c'est l'erreur 10048 qui arrive, c'est pasque tu a dû mal fermer un winsock, du coup le socket correspondant est toujours ouvert et on ne peux plus s'en servir (d'où erreur "adresse en utilisation"). Regarde un peu plus haut j'ai eu le même problème.

Scoder je comprend pas bien ce que tu dis mais "etat de protocole ou de connexion erroné pour la transaction ou la requête requise", c'est pasque au moins un de tes winsocks dans ton groupe de contrôle ne s'est pas connecté. Un winsock doit être dans l'état 7 (W.State = 7) pour pouvoir envoyer des données (W.SendData).

signaler à un administrateur
Commentaire de celiphane le 08/06/2004 14:37:06

vous connaissez le débogage ?


@+
Celiphane

signaler à un administrateur
Commentaire de scoder le 08/06/2004 14:38:04

c'est là que ça coince. j'ai un winsock indépendant qui gère les requêtes de connexion et qui charge un winsock(n) de mon groupe de contrôle. en toute logique tous les winsock(n) de mon groupe de contrôle sont connectés puisqu'en utilisant la méthode que je cite un peu plus haut je parviens à transférer des données. je me demande alors si le winsock "indépendant" n'interfère pas avec le groupe de contrôle et serait la cause de l'erreur....
reste la possibilité de tester chaque winsock(n) du groupe de contrôle pour voir s'il est connecté mais ça revient à faire ce que j'ai fait plus haut...

signaler à un administrateur
Commentaire de GlanduSchmoldu le 08/06/2004 14:46:52

A ben oui forcemment si t'essais de faire envoyer des données à un winsock qui écoute ça pourra pas aller. Ben ouias rajoute une ligne pour vérifier mais il me semble que ça serait plus propre de faire un autre winsock unique pour écouter.
Ceci dis Celiphane a raison, t'aurais pus trouver ça tout seul il me semble ...

signaler à un administrateur
Commentaire de scoder le 08/06/2004 15:24:03

justement j'ai suivi le tut' de Celiphane et j'ai un winsock unique pour écouter. utilisant la multiconnexion, ce winsock unique charge un winsock appartenant à mon groupe de contrôle. Il n'en fait pas partie et ne tente pas d'envoyer des données alors qu'il est en écoute. j'ai juste voulu utiliser la boucle for...each (comme citée en haut des commentaires) et visiblement ça ne marche pas sans teste.
ceci dit ça je l'ai trouvé tout seul il me semble non? le débogage ne m'a pas été d'une grande utilité dans le cas présent et si tu regardes l'heure du post de Celiphane et l'heure du mien tu constateras que j'ai posté avant même d'avoir pu voir sa réponse.

signaler à un administrateur
Commentaire de GlanduSchmoldu le 08/06/2004 15:44:53

Oula du calme t'énerve pas. J'avais pas compris ce que tu disais. Ben écoute alors je sais pas. Cherche le winsock déconecté et cherche pourquoi il l'est, c'est tout ce que je peux te dire (ce qui est assez peu malheureusement).

signaler à un administrateur
Commentaire de scoder le 08/06/2004 15:50:20

désolé si j'ai laissé paraître de l'énervement c'est pas du tout le cas ;)
je vois pas trop d'où vient l'erreur mais je vais continuer à chercher et je posterai si je trouve.
Merci quand même à Celiphane et toi

signaler à un administrateur
Commentaire de pouda le 08/06/2004 15:55:33

erf marche tres bien

signaler à un administrateur
Commentaire de GlanduSchmoldu le 08/06/2004 16:00:50

Bonne chance

signaler à un administrateur
Commentaire de misterzinzin le 08/06/2004 18:39:54

et bien je vois que ce tuto avance bien:-) ou pourra bientot ouvrir un site sur winsock :-)

signaler à un administrateur
Commentaire de Disicom le 08/06/2004 20:31:04

QUi c qui peut donner des explications sur la Fonction Blind...et la façon de l'utiliser, son utilité...

Merci

signaler à un administrateur
Commentaire de FuSe le 08/06/2004 20:44:50

Bind est un peu le listen du TCP pour l'UDP, tu affecte le controle winsock à un port.

signaler à un administrateur
Commentaire de celiphane le 08/06/2004 22:34:36

[en lien avec le message de misterzinzin]

je suis ravi d'avoir ouvert la marche ;)

@+
Celiphane

signaler à un administrateur
Commentaire de FuSe le 17/06/2004 16:41:27

Salut,
J'ai un problème avec la gestion des erreurs. Il y a quelque chose de spécial à faire pour intercepter les erreurs ?
Pour l'instant j'aimerai détecter si le port est déjà utilisé au lancement de l'application, j'ai testé en UDP et en TCP et dans les deux cas, il ne traite pas l'erreur. Mon code :

ec est le winsock pour cet exemple en mode TCP.

Private Sub Command1_Click()
   ec.LocalPort = port.Text
   ec.Close
   ec.Listen
End Sub
---------
Private Sub ec_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 Description, vbOKOnly, "Winsock Error: " & Number
CancelDisplay = True

End Sub

Mon objectif est de détécter les erreurs et d'envoyer un message adapté. mais là il m'envoie le message VB.

Une solution ?

signaler à un administrateur
Commentaire de celiphane le 17/06/2004 18:00:45

C'est dans ta procédure où tu passe ton wck en listen qu'il faut mettre la gestion d'erreur.

En VB, la gestion d'erreur se traite par "on error resume next" ou "on error goto ETIQUETTE" où ETIQUETTE prend le nom de l'étiquette de raccordement ou bien le numéro d'une ligne défini, tu peux aussi faire du "on local error..." etc etc renseigne toi !

Ce que tu faisais, c'était utiliser l'evenement error du wck : ca n'a rien a voir, celui-ci ne se declenchera que si le wck le declenche, dans une error qu'il maitrise, comme la coupure de la connexion ou autre etc...

@+
Celiphane

signaler à un administrateur
Commentaire de hea2000 le 29/06/2004 01:51:53

Tengo que aprender Frances..... ups

signaler à un administrateur
Commentaire de celiphane le 29/06/2004 02:12:05

surement ;)

@+
Celiphane

signaler à un administrateur
Commentaire de nycoss le 30/06/2004 05:57:46

Super ton tuto man!!  en un jour j'ai deja créer un trojan et un Chat graçe a lui mé parcontre  jvoulé juste savoir si CT possible de transferer des fichier avec winsock. bon allé @+ mon frére T le melleur ;)                  

10/10

signaler à un administrateur
Commentaire de celiphane le 30/06/2004 10:01:41

bien entendu que tu peux transférer des fichiers,

tu ouvres ton fichier d'un côté, ouvre un nouveau fichier de l'autre, puis tu transfert les octets par tampon de 4 à 8 ko sauf pour la derniere trame.

@+
Celiphane

signaler à un administrateur
Commentaire de GlanduSchmoldu le 30/06/2004 20:36:08

Plus de 8 ko, ça couille ? La dernière trame plus petite c'est pour signaler la fin ?

signaler à un administrateur
Commentaire de celiphane le 30/06/2004 23:54:22

en fait, ca ne couille pas à plus de 8ko, c'est juste que winsock (et donc les apis winsock en général, pas le controle ocx seulement, car il ne fait qu'utiliser les apis) EST limité à des paquets de 8192 octets.

Si un transfert en comporte plus, il sera automatiquement subdivisé et recu en plusieurs fois. Alors plutot que de laisser le protocole découper lui-même et peut-être "merder", découper VOUS même, ainsi vous contrôler le transfert.

La dernière trame est FORCEMENT plus court GlanduSchmoldu !!! Réfléchit !

Voici un exemple :

transfert d'un fichier de 5000 octets par trame de 2ko

1) envoi de 2048 octets - reste 2952 à transférer
1b) accusé de réception du prgm receveur donc declenche la suite
2) envoi de 2048 octets - reste 904 à transférer
2b) accusé de réception du prgm receveur donc declenche la suite
3) envoi les 904 octets restants >> la trame est plus petite !!!

le seul cas où la dernière trame est de taille égale aux précédentes, c'est lorsque le nombre d'octets à transférer est divisble par la taille des paquets utilisés.

@+
Celiphane

signaler à un administrateur
Commentaire de GlanduSchmoldu le 01/07/2004 13:33:35

Aaaaa ouias ok. Merci bien.

signaler à un administrateur
Commentaire de jockos le 01/07/2004 13:48:08

Je pense qu'il est indispensable de bien comprendre l'architecture en couche de la pile de protocole Internet (et éventuellement OSI) quand on veut se lancer dans de la programmation réseau.

Pile protocolaire INTERNET :

--------------
Application       ex : SMTP, FTP, HTTP, POP3, Protocole propriétaire, ...
--------------
  Transport       ex : TCP ou UDP
--------------
   Réseau         ex : IP (v4 et bientôt v6)
--------------
    Liason         ex : HDLC, Ethernet (802.X)
--------------
   Physique       ex : ... (envoi le flux de bit sur le support)
--------------

Je ne vais pas décrire le fonctionnement de chaque couche et les relations (services) entre les différentes couches, mais sachez que les couches dialogues entre elles via des primitives (ensemble de routines que l'on peut appellé API par abus de langage).

Winsock est un ensemble de primitives (API) permettant à la couche Application de dialoguer avec la couche Transport et réciproquement.

Quand vous écrivez votre programme réseau en VB (Client ou Serveur SMTP, FTP ou alors un protocole maison comme pour un Chat par exemple), vous êtes au niveau de la couche Application et vous utilisez les services de la couche Transport via les primitives Winsock pour envoyer et recevoir les données...

Je pense que c'est bien de descendre un peu plus dans les détails parfois sans aller forcément trop loin...

Bonne prog à tous...

Jock

signaler à un administrateur
Commentaire de retaks666 le 08/07/2004 21:51:47

je voulais savoir s'il est possible de réaliser un programme multiconnection avec un seul winsock(ou plutot groupe de winsock) si on initialise son index a 0, je reprends l'exemple de ta source...
§ Private Sub Serveur_ConnectionRequest(ByVal requestID As Long)
§ Nb=Nb+1
§ Load serveur(Nb)
§ serveur(Nb).Accept requestID
§ End Sub

j'essaie en fait de créer un chat(encore un) qui gère donc les connections, et j'ai fait un seul winsock, mais je ça a pas l'air de marcher tellement bien, alors est-ce moi qui code mal, ou il faut deux winsock obligatoirement?

signaler à un administrateur
Commentaire de jockos le 08/07/2004 22:50:28

Il te faut forcément 2 winsocks pour ton programme serveur :
    - 1 winsock principal (et unique)
    - 1 winsock indéxé (une liste de contrôles Winsocks)

J'ai une comparaison qui me vient en tête, essentiel à bien comprendre pour assimiler le fonctionnement d'un programme serveur (HTTP, SMTP, POP3, FTP, Chat, ...).

Imaginez, une réceptionniste dans une banque par exemple.

Les clients arrivent sur la receptionniste qui appelle alors un agent de la banque pour dicuter avec le client...

La recepetionniste est le contrôle Winsock principal du serveur (la banque) qui reçoit la visite des clients via le port TCP ou UDP n°50000.

Les agents sont appellés par la receptionniste pour traiter avec le client. Et la recpetionniste se remet aussitôt en attente de nouveaux clients (afin de pouvoir les rediriger vers des agents).

Les agents sont les contrôles Winsock "secondaires" du serveur qui vont dialoguer avec le client (en respectant le protocol associé au service rendu par l'agent envers le client).

Les agents dialoguent sur n'importe quel port avec le client.

IMPORTANT :
Le client se connecte sur le port (n° socket) définit par le protocole du serveur. Mais le serveur ouvre aussitôt un port (dynamique, c'est à dire dont le n° est superieur à 1024) pour dialoguer avec le client.

Voilà pour le fonctionnement global dans la plupart des cas pour un programme serveur.

++

Jock


signaler à un administrateur
Commentaire de retaks666 le 09/07/2004 09:49:24

encore une dernière question, comment dois-je paramètrer les remoteport de ces deux controles? je mets le même pour serveur et wsk ?des différents? pas du tout ? ...

signaler à un administrateur
Commentaire de the_best le 09/07/2004 09:53:49

1) Tu peut faire tout dans le même groupe de winsock, mais il faut commencer le compte des clients à 1 et tu dit au winsock 0 d'écouter.

2) Pour remoteport, il faut que la valeur du client (le winsock) soit la même que la valeur localport des winsock serveur. Comme la valeur change chaque  fois, il faut que le client récupère cette valeur, modifie sont remorteport et se reconete sont son winsock serveur.

signaler à un administrateur
Commentaire de the_best le 09/07/2004 09:55:54

Tien ! une faute : faut lire 'sur son' et pas 'sont son' à l'avant dernière ligne. Désolé.

signaler à un administrateur
Commentaire de retaks666 le 09/07/2004 18:57:48

Lol, ces histoires d'orthogtraphes te montent à la tête, il me semble que j'avais essayer de commencer a 1 le conte des clients, et pour ce qui est du remoteport et du localport, ils se définissent lors du lancement du programme, selon qu'on vueille se connecter, ou être serveur... donc le problème proviens certainement d'ailleur... enfin je vais tout de même jeter un coup d'oeuil :)

signaler à un administrateur
Commentaire de MadM@tt le 04/08/2004 22:21:01

Put.... mais c'est super simple et méga puissant le Winsock !!
Merci de me l'avoir fait découvrir... vraiment merci

@ ++

MadMatt

PS : Tu a super bien expliqué, continue

signaler à un administrateur
Commentaire de Fullnet Software le 05/08/2004 02:48:55

Bonjour, cest méga vraiment cool ton tutorial

mon programme chie ici:

Private Sub Command2_Click()
For a = 1 To NB
Wck(a).SendData "P" & Text2.Text
DoEvents
Wck(a).SendData "M" & RichTextBox1.Text
DoEvents
StatusBar1.SimpleText = "Message:" & RichTextBox1.Text & "  -:- message envoyé par:[" & Text2.Text & "]"
End Sub

signaler à un administrateur
Commentaire de Galaan le 07/09/2004 09:27:53

Merci pour se tut qui m'a bien rendu service.

J'ai toutefois un petit probleme. Comment faire pour recuperer des informations par le port 80 en utilisant winsock ?
Voici un peu plus de detail :
URL du site : www.monsite.com
Page a lire : www.monsite.com\mapage.php?par=par1

Merci de votre aide.

Galaan

signaler à un administrateur
Commentaire de JoVB le 07/09/2004 22:08:27

Alors c tout simple :

voici un exemple (repris de je c plus ou) :
Il te faut une form, avec un controle winsock (lol) et un controle text (attention si tu veux que tes données aients un aspect pas trop moche (c a dire pas tout sur une ligne) il faut mettre la propriété MultiLine = True


Private Sub Form_Load()
    Winsock1.RemoteHost = "www.vbfrance.com"
    Winsock1.RemotePort = 80
    Winsock1.Connect
End Sub


Private Sub Winsock1_Connect()
    Dim CommandeHTTP As String
    Dim URLPageWeb As String

    URLPageWeb = "http://www.vbfrance.com/"
    CommandeHTTP = "GET " & URLPageWeb & " HTTP/1.0" & vbCrLf & "Accept: */*" & vbCrLf & "Accept: text/html" & vbCrLf & vbCrLf
    Winsock1.SendData CommandeHTTP
End Sub



Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
   Dim HTTPDonnees As String
    Winsock1.GetData HTTPDonnees, vbString
    Text1.Text = Text1.Text + HTTPDonnees
End Sub


et voila... tu as tout le contenu html de la page dans ton Text1

Bonne prog ++

//JoVB

signaler à un administrateur
Commentaire de RV57000 le 15/09/2004 20:15:19

Bien voir même trés bien les explications .
J'ai trouvé ce que je cherchais sans me faire de noeud au bulbe, avec des explications simples.
Seul petit truc (il faut que j'aprofondisse) la méthode avec plusieurs connections.
Merci et encore Merci ....

signaler à un administrateur
Commentaire de jihedezzi le 19/09/2004 02:28:05

merci infiniment il ma beaucoup aider

signaler à un administrateur
Commentaire de Galaan le 21/09/2004 08:12:08

Merci beaucoup de ton aide !
J'ai toutefois deux petites questions subsidiaire.
1/ Que faire quand la page recu est tres longue ?
Car :
§ Dim data As String
§ Winsock.GetData data
§ MsgBox data
ne me renvoi qu'une partie des infos de la page.
2/ Quelqu'un aurait-il un exemple d'entete pour la methode "post" et plusieurs parametres.

Merci d'avance.

Galaan

signaler à un administrateur
Commentaire de MadM@tt le 23/09/2004 18:35:35

Affiche le code html de ta page dans une textbox plutot qu'une msgbox... Ou mieux une richtextbox, comme ça tu n'es plus limité du tout en nombre de caractères.

signaler à un administrateur
Commentaire de Galaan le 23/09/2004 22:10:32

en fait moi je n'affiche pas le texte html je le traite. Mais string que je recoi est tronque.

Galaan

signaler à un administrateur
Commentaire de MadM@tt le 24/09/2004 21:21:14

Tu ne reçois pas tout le code de la page ?? ou peut-être c'est que la méthode que tu utilise pour le voir (via une msgbox) ne permet pas de le voir en entier.
Essaye déjà de remplacer ta texbox par une msgbox... Si je me trompe désolé, dans ce cas je ne vois pas comment t'aider (laisse un message dans le forum).
@ +

signaler à un administrateur
Commentaire de jockos le 24/09/2004 23:52:53

Le fichier HTML envoyé lors de la réponse HTTP du serveur vers le client sont souvent découpés en plusieurs réponses succéssives.

Le serveur HTTP, au lieu d'envoyer 1 seule et unique réponse au client avec la page HTML en entière va découper le fichier HTML et faire plusieurs envois dans des réponses HTTP.

Regarde dans le ptocol HTTP.

Sinon, il te faut une boucle d'attente de la dernière réponse HTTP et tu concatènes simplement le contenu des réponses pour reconstruire la page HTML envoyé.

A+

signaler à un administrateur
Commentaire de celiphane le 25/09/2004 12:21:53

Galaan> je vois que tu te sens un peu seul dans ton pb, alors j'ai pris le parti de t'aider, et crois moi, c'est de plus en plus rare ! ;)

Voici un code à coller tel quel dans un module, qui devrait convenir à ton besoin :


'--------------DEBUT DU CODE A COLLER DANS UN MODULE-----------

Private Declare Function InternetOpen Lib "wininet.dll" Alias "InternetOpenA" (ByVal sAgent As String, ByVal lAccessType As Long, ByVal sProxyName As String, ByVal sProxyBypass As String, ByVal lFlags As Long) As Long
Private Declare Function InternetOpenUrl Lib "wininet.dll" Alias "InternetOpenUrlA" (ByVal hOpen As Long, ByVal sUrl As String, ByVal sHeaders As String, ByVal lLength As Long, ByVal lFlags As Long, ByVal lContext As Long) As Long
Private Declare Function InternetReadFile Lib "wininet.dll" (ByVal hFile As Long, ByVal sBuffer As String, ByVal lNumBytesToRead As Long, lNumberOfBytesRead As Long) As Integer
Private Declare Function InternetCloseHandle Lib "wininet.dll" (ByVal hInet As Long) As Integer

Public Function ReponseWeb(ByVal URL As String) As String
On Error Resume Next
Dim hOpen As Long
Dim hOpenUrl As Long
Dim bDoLoop As Boolean
Dim bRet As Boolean
Dim sReadBuffer As String * 2048
Dim lNumberOfBytesRead As Long
Dim sBuffer As String
  hOpen = InternetOpen("VB OpenUrl", 0, vbNullString, vbNullString, 0)
  hOpenUrl = InternetOpenUrl(hOpen, URL, vbNullString, 0, &H80000000, 0)
  bDoLoop = True
  While bDoLoop
    sReadBuffer = vbNullString
    bRet = InternetReadFile(hOpenUrl, sReadBuffer, Len(sReadBuffer), lNumberOfBytesRead)
    sBuffer = sBuffer & Left(sReadBuffer, lNumberOfBytesRead)
    If Not CBool(lNumberOfBytesRead) Then bDoLoop = False
  Wend
  If hOpenUrl <> 0 Then InternetCloseHandle (hOpenUrl)
  If hOpen <> 0 Then InternetCloseHandle (hOpen)
  ReponseWeb = sBuffer
End Function

'-----------FIN DU CODE------------




Avec cette fonction, tu vas pouvoir recevoir le html de n'importe quoi, avec la syntaxe :

msgbox ReponseWeb("www.google.fr")
ou bien
HTML = ReponseWeb("www.vbfrance.com")

@+
Celiphane

signaler à un administrateur
Commentaire de Galaan le 26/09/2004 12:55:19

un grand merci a toi celiphane j'essaie ca des que possible. J'ai encore une petite demande. Pour passer une entete post je dois surement utiliser la variable sHeaders mais comment ? Aurais-tu un exemple sous la main ?

Merci encore.

Galaan

signaler à un administrateur
Commentaire de pepekiss le 16/10/2004 21:58:03

merci bcp pour ton tuto, car étan newbiie é voulan réalisé un jeu online, sa méde bcp.
Merci Encore


                                               Pepito

signaler à un administrateur
Commentaire de Einhart le 25/10/2004 03:36:32

Merçi beaucoups je suis débutant dans la programmation réseau et ca m'a beaucoups aidé !
Encore merçi !

signaler à un administrateur
Commentaire de zeboss le 03/11/2004 09:31:00

bonjour ton tuto super !!
mais j'ai une kestion: comment on fait pour envoyer un fichier (du client) au serveur?
merci (9/10)

signaler à un administrateur
Commentaire de DocteurVB le 05/11/2004 17:12:01

lut,

il me semble qu'il faut utiliser WskClt.SendData et WskSrv.GetData ou qqch comme ça...

en fait il me semble que pour l'envoie de données dans un sens ou dans l'autre il n'y a pas de distinction entre client et serveur il faut juste utiliser les methodes du bon ctrl. on fait une distinction Clt/Srv uniquement pour la connexion (enfin je crois...;)).

voila en tout cas je suis toujours aussi épater par la qualité de ce tuto...


DocteurVB


signaler à un administrateur
Commentaire de celiphane le 05/11/2004 18:09:05

qu'est-ce que je me prends comme fleurs moi ici ;)

merci :)

@+
Celiphane

ps: zeboss> va voir mes autres sources et attarde toi sur celle du chat vocal... ne l'essaye pas, elle est pas top, mais en son sein elle possède un code de transfère de fichier par "accusé de réception", c'est à dire la méthode universelle... Tu pourras surement faire mieux, mais en tout cas surement pas différemment ;)
ça transfère n'importe quoi, n'importe quel octet de 0 à 255, et fais pas gaffe aux gars énervé dans les commentaires de cette source chat vocal c'est un gros nul jaloux persuadé dans son tord d'avoir raison :) ! oui oui ça arrive... et comme l'a dit docteurVB que je salus, le client et le serveur peuvent faire la même chose, seule la connexion les distingue... relis le tuto ;)

signaler à un administrateur
Commentaire de DocteurVB le 05/11/2004 19:20:43

Celiphane,

toutes ces fleurs sont la juste récompense d'un magnifique travail qui a servi à 17617 depuis 4ans...Mais C ténorme !!!  lol ;)


je me demandais si tu connaissais des truc ou si tu savais ou je pourrais trouver un bon tuto sur la classe winsock en .NET...?


DocteurVB

signaler à un administrateur
Commentaire de celiphane le 05/11/2004 21:31:50

non, désolé ;(


@+
Celiphane

signaler à un administrateur
Commentaire de Famidoo le 08/12/2004 17:09:40

moi j'ai 1 pb pour envoyer 1 mess du serveur vers ts les clients, il envoie tjrs au dernier client qui s'est  connecté

signaler à un administrateur
Commentaire de rhabib le 18/01/2005 20:45:04

10/10 merci pour l'aide

signaler à un administrateur
Commentaire de buzydoudou le 30/01/2005 18:45:06

Un dimanche soir (aujourd'hui !!), j'avais envie d'apprendre à utiliser le Winsock (je n'y connaissais absolument rien si ce n'est qu'on pouvait échanger des données entre 2 ordis). Je tombe d'abord sur un site qui explique comment envoyer des mails via le Winsock : je ne comprends rien !! Puis j'arrive sur un code source, plus précisemment un tutorial sur VBfrance.com (mon seul et unique site d'apprentissage de la programmation) qui explique justement les Winsock. Comme je tombe très souvent sur des sources jamais très claires et difficiles à comprendre, lors du chargement de la page, je reste perplexe (comme d'hab.). Une fois la page chargée, je commence à lire : "Niveau neuneu à rôdé". Parfait !! (mdr). Puis je commence à lire ce tuto, et je remarque d'abord la clareté et la "compréhensibilité" de la source puis l'humour qui fait sourire !! J'ouvre Visual Basic, je fais ce que le gentil monsieur qui a du passer énormément de temps sur son tuto me demande de faire. Ca marche !! (tellement rare !!). Cool. Le gentil monsieur m'a fait comprendre ce que 50 autres sources m'auraient fait à peu près comprendre en 5 mois. Je suis content de connaître les bases, je mets d'ailleurs un 10/10 à la source du monsieur ( parce que j'arrive pas à mettre un 50/10 : Nix ne veut pas ;-( ). Puis je dis merci au monsieur pour sa patience et sa "gentillesse", il y a maximum une personne sur 1000 qui est comme lui. Bravo et encore merci pour le partage de tes connaissances !!

signaler à un administrateur
Commentaire de celiphane le 31/01/2005 01:07:45

Le "gentil monsieur" est heureux de faire des heureux.
;)

@+
Celiphane

signaler à un administrateur
Commentaire de guismo1er le 31/01/2005 15:44:09

salut, déjà bravo pour ce petit tu to mais à un certain moment tu dis : 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.

je fais comment pour déclarer ma variable?

en fait je suis nouveau , je m'y connais plus en PHP. ALors si vous pourriez m'aider :)

je voudrais en fait faire comme un chat en gros, (je sais pas trop netsend? je sais pas, je verrai mais comment on fait pour declarer cette variable?)

merci à vous tous

Amicalement
-guismo1er-

signaler à un administrateur
Commentaire de Disicom le 31/01/2005 17:19:40

Guismo1er, je te conseil déjà de connaître les bases du langage,  pour déclarer ta variable ta : Public nom : type
Private, Global, Friend, Dim, ... enfin après tout dépend où tu veux t'en servir.

(Public Wck:winsock (mais avant il faut déjà rajouté ton composant WinSock)).

Netsend laisse tomber.

Tcho++

signaler à un administrateur
Commentaire de JoVB le 31/01/2005 18:58:57

il te faut déclarer ta variable dans un module en écrivant
"public Nb" (suivit de "as" puis du type par exemple "integer" si il s'agit d'un nombre entier")
ce qui te donnerai "public Nb as integer" ceci dans un module.
Ou alors si tu n'as qu'une form tu écris cette meme ligne mais précédée de "Option explicit" et le tout dans la partie "déclaration" de l'onglet "général" !
mais comme dit Disicom il serait mieux de connaitre les bases avant de te lancer dans un prog du genre ! sinon tu serra vite embeté !

//JoVB

signaler à un administrateur
Commentaire de PCPT le 03/04/2005 22:13:06 administrateur CS

salut,
tuto sympa, en effet.
dit (ou dites, tous les lecteurs ;)), pour rester dans le sujet, si quelqu'un pouvait m'éclairer pour identifier exactement le poste qui joue le "serveur", j'ai un peu énormément de mal.

http://www.vbfrance.com/forum.v2.aspx?ID=424543

je rame vraiment.
merci d'avance

PCPT

signaler à un administrateur
Commentaire de celiphane le 11/04/2005 13:16:37

Salut à tous,

à ceux que ça intéresserait (parce qu'on est dans le sujet ici), je viens de poster ceci :

http://www.vbfrance.com/code.aspx?ID=30665

C'est une class pour transférer des fichiers, selon les techniques et méthodes que j'appuie ici.

A bon entendeur,
;)
@+
Celiphane

signaler à un administrateur
Commentaire de SuperPit37 le 22/04/2005 11:55:32

Bon tout d'abor merci pour ce joli tuto!

G éssayer de tester en fesant 2 appliz une serveur et une client, le seveur je l'envoi a un ami pour qu'il test sur ma machine ( et je remplace 127.0.0.1 par mon IP)  voila les codes

LE SERVEUR:

Private Sub BTconnect_Click() Wck.Connect "82.XXX.XXX.12", 12666
End Sub
--------------------------------------------------------------------------------
Private Sub BTenvoie_Click() Wck.SendData "Votre texte"
End Sub
--------------------------------------------------------------------------------
Private Sub Wck_Connect() MsgBox "Connecter"
End Sub
--------------------------------------------------------------------------------

LE CLIENT

Private Sub Winsock_ConnectionRequest(ByVal requestID As Long) Winsock.Close Winsock.Accept requestID
End Sub
--------------------------------------------------------------------------------
Private Sub Form_Load()
Winsock.LocalPort = 12666 'rq : la propriété aurait pu être défini directement Winsock.Listen
End Sub
--------------------------------------------------------------------------------
Private Sub Winsock_DataArrival(ByVal bytesTotal As Long) Dim data As String Winsock.GetData data MsgBox data
End Sub

Le pb c ke kan mon ami ve m'envoyer un message il a le messager derreur suivant:Erreur d'éxécution '40006'
Etat de connexion ou de protocole erroné pour la transaction ou la requête requise

Je suis vraiment novice en la matiere ne m'en voulez pas si ma question est stupide



signaler à un administrateur
Commentaire de PCPT le 22/04/2005 14:09:32 administrateur CS

le serveur "écoute".
le client joint le serveur.
le serveur reçoit l'appel puis le confirme.
la connection est établie et tous deux ont des procédures similaires.

ton serveur se connecte. il ne doit pas se connecter, mais écouter, et le client se connecte au serveur.
donc ton serveur écoute sur un port défini, le client appelle le serveur sur son IP et son port défini.
resquestId accept..... et la connection est OK. tu as inversé les rôles.

le client n'as pas de REQUEST ID. le serveur n'as pas de CONNECT (enfin, pas dans ton utilisation)

++
PCPT

signaler à un administrateur
Commentaire de SuperPit37 le 22/04/2005 14:48:38

j'avai inversé les titres de plus g  tout refai o zéro et sa marche impec!
dommage ke je puisse pa éffacer mon message si un admin passe ds le coin k'il n'ésite pas il n'aporte aucun intéret.
En tout ca MERCI Celiphane 10/10......

signaler à un administrateur
Commentaire de SuperPit37 le 22/04/2005 15:22:33

C'est celui du dessu qu'il faut éffacer il n'a aucun sens dsl g tout refait et ca marche impec en plu ds le message g inversé serveur et client ca porte a confusion
Admin si tu pass par la?

signaler à un administrateur
Commentaire de buzydoudou le 25/04/2005 12:32:12

Remarque: inutile de tester le programme avec un ami, il suffit par exemple de:
1) Connexion sur un port et une IP donné (127.0.0.1 pour le tester toi même).
2) En cas d'erreur, c'est à dire si le serveur n'est pas sur écoute, on passe alors en mode écoute (on devient serveur) et on attend une connexion.
3) La connexion est établie par le client.

Une fois que tu as tappé l'algorithme correspondant aux 3 étapes au-dessus, tu n'as plus qu'a créér 2 exe. Par exemple un qui se nomme Winsock.exe, l'autre Winsock1.exe. Tu ouvres le premier, il va se mettre automatiquement en mode écoute, tu ouvres le deuxième, il va se connecter !

Je ne suis pas un pro du Winsock, il y sûrment plus judicieux mais bon... ...c'est une méthode comme les autres !

signaler à un administrateur
Commentaire de loulax le 16/05/2005 17:29:29

je te remercie énormément pour ce tuto il me sera trés trés utile. Merçi pour tous les newbies.
Pour ce qui sont intérréssé j ai mon site avec des sources pour les algorithmes génétiques ainsi que pour la fonction MinMax pour un Morpion. (www.algorithme.freegaia.net)
Encore merci

signaler à un administrateur
Commentaire de thibboss le 08/08/2005 18:18:01

Ouais trop bonne source ! Je suis un newbies et je crois que ca va pas mal m'aider !! le voila ton 10 ! :p

signaler à un administrateur
Commentaire de nsslive le 31/08/2005 14:56:30

Carrément bien expliqué,  j'ai tout capté, merci!
avec ca, mon projet de telecommande pc par wifi via pda va pouvoir réellement débuter !
10/10 sans hesitation

signaler à un administrateur
Commentaire de kazer04 le 06/09/2005 18:06:00


salut a tous je suis  debutant en vb
je  developpe une aplication multi-connection tout marche comme je veux ....seulement voila quand le premier connecter se deconnecte  j'obtient ( erreur "340" l'element du groupe de controle '1'  n'existe plus) et la je sais pas quoi fair
si quelqun peu m'aider ca me ferais plaisir
merci d'avance

signaler à un administrateur
Commentaire de Algade le 01/10/2005 19:38:02

Hello Celiphane et tous les passionnés de ce sujet - merci à vous tous
(j'ai découvert Winsock gràce à ce tuto et je débute avec une petite appli)

Par contre

J'ai l'éternel problème du client qui se connecte au serveur (ça marche), reçoit ensuite des données du serveur (ça marche). Puis le client se déconnecte et lorsqu'il se reconnecte ==> message "adresse en utlisation"
1) J'ai bien mis des Clent.LocalPort=0 et des  Client.Close partout
2) J'ai bien mis des DoEvents partout
....... et j'ai toujours le problème
Que puis-je vérifier d'autres ?? - merci d'avance à ceux qui ont déjà eu mon PB et qui l'on solutionné

signaler à un administrateur
Commentaire de Algade le 01/10/2005 19:44:59

Hello A tous

Malgré avoir pris la précaution de mettre des "Serveur.localPort=0" et des "Client.close" avant de dééconnecter le client et aussi des DoEvents - j'ai toujours le problème du client qui se connecte une fois et qui, la deuxième fois à le message "Adresse en utilisation"
Que puis-je vérifier d'autres dans mon programme - merci pour ce tuto Celiphane et tous ceux qui le commentent

signaler à un administrateur
Commentaire de kinouseba le 07/10/2005 18:50:53

Bonjour à tous !!!!!!!

Effectivement, ce tutoriel est très bien fait.

J'ai voulu faire comme ALGADE en rajoutant un bouton pour pouvoir cloturer la connection de Wck:

wck.close

Mais, lorsque je clique à nouveau sur "Connection", je n'ai plus le message 'trouvé' et ensuite losque je veux envoyer le texte, j'ai un message d'erreur !!!!??????????????
Comment faut-il faire pour cloturer correctement une connection ?

signaler à un administrateur
Commentaire de celiphane le 07/10/2005 20:02:44

Bonjour,
à la question :
<< comment faut-il faire pour cloturer correctement une connection (ndlr : conneXion au passage)>>

Je réponds : une connexion est correctement coupée avec la méthode Close. Le tuto ne présente rien de "sale".
L'impossiblité de vous reconnecter tient au fait que vous n'avez tout simplement pas remis le serveur en écoute avec Listen.
Le message d'erreur lorsque vous tenté d'envoyer du texte en découle directement puisque vous n'êtes pas connecté.

Concernant le message d'erreur un peu plus haut, adresse en utilisation, cela n'arrive que si vous tentez un Listen en ayant paramétré un port d'écoute qui est déjà utilisé.

<<J'ai bien mis des Clent.LocalPort=0 et des  Client.Close partout>>
Où ai-je mentionner qu'il faut mettre LocalPort = 0, et de surcroit le faire partout, ainsi que des Close partout également ?

- A écoute (listen)
- B appelle A (connect)
- A arrête d'écouter (close)
- A accepte (accept)
- A & B partage des informations (senddata & getdata)
- A ou B "raccroche" (close)
- l'autre raccroche aussi dans l'évènement qu'il l'en prévient (event close, et close dedans)
- à partir de là c'est comme s'il ne s'était rien passé. On peut reprendre au début.

@+
Celiphane

signaler à un administrateur
Commentaire de fredflo74 le 29/12/2005 12:45:56

Salut celiphane

dis moi lol ce tuto a eu beaucoup d'effet depuis 2002 lol, c'est la rançon de la gloire, c'est vrai que pour les debutant il est bien fait !!!

Pourquoi ne pas faire le meme tuto avec , non pas l'objet winsock , mais avec les Api Windows ;-p

Je cherche ça depuis longtemps mais jamais trouvé le top !

Merci

signaler à un administrateur
Commentaire de chatainsim le 31/12/2005 00:14:40

10/10 pour cette explication, merci beaucoup !

signaler à un administrateur
Commentaire de jacko20 le 23/01/2006 19:35:28

T'es le meilleur pour expliquer les controls winsock et franchement j'ai chercher pas mal de temps apres ce genre de tuto et grace a toi je suis arriver au bout de mes peines avec vb :)
Un tout grand merci !

signaler à un administrateur
Commentaire de Papymuzo le 29/01/2006 15:18:29

gg celiphane mais il aurait fallu plus détailler pour la multi - connec (par exemple, une liste avec les pseudos des clients)

signaler à un administrateur
Commentaire de Programeur debutant le 03/02/2006 17:33:09

je ne sais pas si c'est toi au lui mais il y as le m^m tutorial sur ce site http://t.u.n.free.fr/Tutaux/tutowinsck.htm

signaler à un administrateur
Commentaire de Ahweb le 25/03/2006 23:25:26

Un peu mal expliqué mais utile :)

signaler à un administrateur
Commentaire de celiphane le 26/03/2006 12:12:07

<< je ne sais pas si c'est toi au lui mais il y as le m^m tutorial sur ce site http://t.u.n.free.fr/Tutaux/tutowinsck.htm >>
Lui sans aucun doute possible. Je suis l'auteur. C'est mon style. Tu auras la preuve en parcourant les autres "tutos" qu'il propose. Aucune trace de ce style "inimitable" ^^.

<< Un peu mal expliqué mais utile :) >>
C'est là tout le charme : expliquer dramatiquement mal, sans terme technique si péjoratif dans l'oreille de ceux qui sont visés par ce tutorial, c'est à dire les débutants.

@+
Celiphane

signaler à un administrateur
Commentaire de Lunduli le 01/06/2006 11:01:37

Bonjour à tous!
Oui ca tuto est très bon pour débuter il m'a moi même aider dans mon appli donc merci à toi ô combien grand auteur qui pense à des débutants qui prendont la relève!
10/10
Cordialement
Lunduli

signaler à un administrateur
Commentaire de Mayzz le 24/10/2006 06:32:56

Bonjour

J'ai eu l'occaz de faire une source avec winsock ya déjà un moment. Mais je m'apprçois que maintenant avec les routeurs les connexions Winsock deviennent impossibles.

Existe-t-il une solution ?

Sinon bravo celiphane ! je crois que tu as la source la + commenté de tt vbfrance ;)

signaler à un administrateur
Commentaire de MadM@tt le 29/10/2006 13:58:35

En ce qui concerne le routeur, aucune solution sinon :
parametrer le routeur pour "relayer" une connexion arrivant de l'exterieur sur le routeur vers une adresse IP du réseau local (si tu pige pas je peux t'expliquer plus en détail)
mais (à ma connaissance), aucune solution pour que le programme s'occupe de ça tout seul, c'est à l'utilisateur de parametrer son routeur lui meme, donc pas pratique.

Enfin ce problème se présente si l'utilisateur veut etre en mode serveur, s'il est client, le routeur ne pose pas de prob (sinon on aurait des problèmes pour jouer sur internet, aller sur msn, ou meme voir une page web...)

Le mieux je pense, c'est de faire un petit guide pour expliquer aux utilisateur comment parametrer leurs routeurs

A+

signaler à un administrateur
Commentaire de Mayzz le 29/10/2006 17:58:23

En effet, tu as raison, je viens de me renseigner la dessus.

Pour les routeurs, paramétrer le port vers la machine, mais pour cela il faut que son adresse réseaux ne soit pas délivré par le routeur lui même mais spécifié par l'utilisateur sur la machine dans les paramètres TCP/IP.

C'est possible avec toutes les "box" normalement...

ceci pour les connexions entrantes (Listen), pour les sortantes, no problemo mis à par le paramétrage FireWall.

Bonne Prog @+

signaler à un administrateur
Commentaire de toufou2006 le 30/01/2007 13:38:17

BRAVO :) j aurai pas fait mieux :)
:p on a la meme chose pour les acces Mysql ?
si oui, j y cours :)

signaler à un administrateur
Commentaire de terafun le 30/06/2007 12:47:46

HI
j'ai une petite question
est ce que quelcun connqi une méthode pour lancer un serveur sur une machine du réseau local accessible depuis le réseau Internet sans faire une redirection de port dans le routeur ou le proxy, comme le fait Skype ou MSN, etc ...,
Merci

signaler à un administrateur
Commentaire de peug le 02/12/2007 17:39:51

Avé,
P'tit question. Peut-on envoyer une instance de class ?

dim oObjet as cMaClasse

set oObjet = collection.item(2)

wsock.senddata  oObjet
?
merci

signaler à un administrateur
Commentaire de marco62118 le 30/01/2008 12:12:06

bonjour à tous
Merci CELIPHANE pour ce tuto! de plus le langage assez cool et abordable est très sympatique!
je cherchais ce genre d'explication mais sans savoir qu'il fallait chercher dans les connexions avec winsock!
petite question j'ai fait un jeu de scrabble, je veux jouer en réseau sur internet à 4 joueurs.
donc je comprends bien qu'il faut utiliser les winsocks pour communiquer mais pour communiquer sur le net au départ est ce qu'il suffit de se connecter à son fournisseur d'accès et de récupérer l'adresse IP qu'on trouve dans l'ipconfig?
aussi je voudrais faire des essais mais comme je suis seul comment faire pour simuler 4 joueurs sur le même ordi et surtout avec une seule connexion internet?

signaler à un administrateur
Commentaire de marco62118 le 30/01/2008 16:42:08

rebonjour
je teste actuellement ce tuto
une question s'est posée plus haut ou tu donnais comme solution:

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

c'est for each W in wck 'nom du des controle winsock qui ont un index

signaler à un administrateur
Commentaire de pile_poil le 20/04/2008 18:18:49 10/10

voilà les explications qu'il me fallait pour que mon application soit encore plus puissante

MERCI

signaler à un administrateur
Commentaire de Nowid50 le 18/05/2008 13:41:04

Très bien expliqué, les codes sont clairs et l'humour et la pour rester motivé !

Quel beau "mix" nous avons là ! :D

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,406 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.