Si erreur alors je recommence jusqu'au but!!! "winsock renverse connection"

Signaler
Messages postés
58
Date d'inscription
lundi 17 janvier 2005
Statut
Membre
Dernière intervention
27 janvier 2015
-
Messages postés
58
Date d'inscription
lundi 17 janvier 2005
Statut
Membre
Dernière intervention
27 janvier 2015
-
Bonjour a tous j'ai un petit souci!!!

Private Sub Form_Load()
On Error GoTo erreur:
image_screen_sock.Connect ip_master, 8000
Exit Sub
erreur:
Call Form_Load
End Sub

voila j'aimerais que server se connect au client , mais j'aimerais que le server si par exemple le client n'est pas en ligne , que le server essaye en boucle la connection , et que quand le client est en ligne le server ci connect.

en gros mon probléme : j'ouvre le server "celui qui essaiye en boucle une connection", ensuite j'execute le client et quand le client est ouvert le server ne s'y connect pas!!

please aider moiiiiiiiiiii

12 réponses

Messages postés
4822
Date d'inscription
lundi 11 novembre 2002
Statut
Membre
Dernière intervention
15 novembre 2016
12
Salut,

Sert toi je pense d'un boucle peut-être comme celle-ci à essayer je ne suis pas sûr :

Dim MaxTentative As Integer
Dim EtatConnection As Boolean

    'Init compteur déterminie le nombre max de tentatives
     MaxTentative = 0
   
     Do While Not (Etat_Connection)
        MaxTentative = MaxTentative + 1
        EtatConnection = image_screen_sock.Connect ip_master, 8000
        If MaxTentative = 10 Then Exit Sub
     Loop

' Si connection ok tu poursuit
....
.....
A+
Exploreur

 Linux a un noyau, Windows un pépin

 
Messages postés
6786
Date d'inscription
vendredi 16 décembre 2005
Statut
Membre
Dernière intervention
21 décembre 2011
18
En tout cas il est impossible d'appeler Load depuis Load. Une Form ne se charge qu'une fois (enfin, tu peux plusieurs fois, mais faut unloader avant nouveau Load)

@++

<hr size="2" width="100%" />( Nouveau forum : Exclusivement Office & VBA
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
37
Bon d'abord que les choses soient claires.

En connection Client/Serveur, ce n'est pas le serveur qui fait la connection mais le client.

Le serveur attend, peut attendre indéfiniment et  gentiement une demande de connection. On dit qu'il est en écoute. Ce n'est pas lui qui demande une connection.

Le client par contre au besoin, vient faire une demande de connection sur le serveur. Si les conditions sont remplies (et à fortiori si aucune condition n'est requise) le serveur accepte la demande, la connection est établie et le dialogue peut commencer.

Toi tu as simplement inverser les termes clients et serveurs.

En plus le code que tu donne est du VB6 alors que tu as posté en VB2005.

Il faut que tu fasse une boucle en testant le status de la connection :
(Code d'Explorer corrigé)
Dim MaxTentative As Integer
Dim EtatConnection As Integer

    'Init compteur déterminie le nombre max de tentatives
     MaxTentative = 0
     EtatConnection = image_screen_sock.State
   
     Do While Not (Etat_Connection=7)
        MaxTentative = MaxTentative + 1
        image_screen_sock.Connect ip_master, 8000
        EtatConnection = image_screen_sock.State
        If MaxTentative = 10 Then Exit Sub
     Loop
   

Mortalino > il est tout à fait possible de rappeller le Form_Load (pas comme ici de manière récursive car c'est très dangereux), c'est une procedure comme une autre. Ce n'est pas cette procédure qui charge l'écran, elle est simplement appellé au cours du chargement. La nuance à son importance.
Attention par contre dans ce cas là à ne pas mettre un Me.Show ou autre pour afficher la form. Lors du rappel ça générera un message d'erreur je pense.

---- Sevyc64  (alias Casy) ---- <hr size ="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #    http://aide-office-vba.monforum.com/index.php
Messages postés
6786
Date d'inscription
vendredi 16 décembre 2005
Statut
Membre
Dernière intervention
21 décembre 2011
18
oui, autant pour moi, c'est Unload Me puis Load Me que vb n'aime pas (dans le Load)

@++

<hr size="2" width="100%" />( Nouveau forum : Exclusivement Office & VBA
Messages postés
918
Date d'inscription
vendredi 3 août 2007
Statut
Membre
Dernière intervention
27 octobre 2008
10
De toute facon appeler une fonction depuis cette fonction, ca s'appelle de la récursivité !! Et en général, on y met une condition de sortie (cas ou on ne fera pas un autre tour gratuit, quoi !)
Içi, la seule condition de de sortie que je vois dans ton code, c'ets qu'il n'y ai pas d'erreur !! Sachant que ton code va boucler très très vite, tu vas rapidement faire déborder la stack !!!
Voila, sinon le code de Casy est top (comme toujours !! Non !j'fait pas d'la lèche, hein !!) C'était juste pour souligner ce problème de récursivité qui m'a sauté aux yeux !
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
37
Rendons à César ce qui est à Cléopatre.... (oups, on me souffle que c'est as tout à fait ça le proverbe)

Mon TipTopCod est en réalité celui donné par Explorer, je me suis contenté d'en corriger les erreurs les plus flagrantes.

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #    http://aide-office-vba.monforum.com/index.php
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
37
Ah ça y est , j'ai retrouvé le slogan :

Rendons à Cesar ce que Médor à laissé dans sa gamelle

Mais mince, je crois que la pub est interdite ici DSL

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #    http://aide-office-vba.monforum.com/index.php
Messages postés
4822
Date d'inscription
lundi 11 novembre 2002
Statut
Membre
Dernière intervention
15 novembre 2016
12
C'est Tip Top Moumoutte ce soir...A gue la donffe...

A+
Exploreur

 Linux a un noyau, Windows un pépin

 
Messages postés
58
Date d'inscription
lundi 17 janvier 2005
Statut
Membre
Dernière intervention
27 janvier 2015

Lol c'est vrai que c'est le client qui se connect en generale au server!!

Mais pour des souci de routeur "liveBox" je préfére le faire à l'envers, c'est à dire que le server se connect à moi.

Pour une application de controle à distance c'est mieu, pas besoin de connaitre l'ip du server juste une redirection DNS suffit !!!

amicalement ++
Messages postés
58
Date d'inscription
lundi 17 janvier 2005
Statut
Membre
Dernière intervention
27 janvier 2015

le code de Exploteur me mettais en rouge la ligne ou le socket se connecter, donc j'ai utiliser le code de Casy et la une autre erreur au méme endroit sauf qui ne le met pas en rouge mais à l'execution erreur!!

la dite ligne :         image_screen_sock.Connect ip_master, 8000

le code que j'ai adapter pour mes besoin de demande de connection à l'infini sauf si trouvé le client

Dim EtatConnection As Boolean

Private Sub Form_Load()
     MaxTentative.Caption = 0
     EtatConnection = image_screen_sock.State
  
     Do While Not (Etat_Connection = 7)
        MaxTentative = MaxTentative + 1
        image_screen_sock.Connect ip_master, 8000
        EtatConnection = image_screen_sock.State
        If MaxTentative = 1000 Then Exit Sub
     Loop
End Sub

Private Sub MaxTentative_Change()
If MaxTentative.Caption = 1000 Then
Call Form_Load
Else

End If
End Sub

execute sans avoir le server de ouvert:
----------error------------------
Run-time error "40020"
invalid operation on current state
----------error------------------

:(
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
37
Ok, probablement que ça vient du fait que tu tente d'ouvrir une connection alors qu'une est en cours d'ouverture ou un truc comme ça.

Déjà 2 remarques sur ton code. Ta boucle DoWhile est une boucle bloquante et infinie. Comme principe de base en informatique pour les boucles, on évite le plus possible de faire des bloucles bloquantes et on ne fait jamais de boucles infinies. Les boucles doivent toujours avoir une condition de sortie.

Pour rendre une boucle non bloquante, il suffit de rajouter une instruction DoEvents à l'intérieur de la boucle.

Pour ce qui est de la boucle infinie, tu as bien mis une condition de sortie (MaxTentative), mais lorsque cette condition est remplie, tu sort bien de la boucle pour la relancer. En gros elle ne sert à rien.

Ensuite pour l'erreur, il faut filtrer l'état du socket avant de redemender une connection.

Private Sub Form_Load()
Dim EtatConnection As Integer

    EtatConnection = image_screen_sock.State
 
    Do While Not (EtatConnection = sckConnected)
       If (EtatConnection < 3) Then image_screen_sock.Connect ip_master, 8000
       DoEvents
       EtatConnection = image_screen_sock.State       If EtatConnection sckError Or EtatConnection sckClosing Then Exit Do
    Loop
   
    If EtatConnection = sckClosing Then MsgBox "Connection fermée par le client"
    If EtatConnection = sckError Then MsgBox "Socket en erreur"
   
End Sub<hr />, ----
[code.aspx?ID=41455 By Renfield]

Bon il n'y a toujours pas de conditions de sortie de ta boucle autre que le socket en erreur ou la fermeture de la connection par le client (chose quie ne devrait pas se produire à ce stade là). Ces 2 conditions ne sont pas suffisantes mais c'est difficile d'en mettre une vu que le code est sur le form_load, tu n'as donc encore aucun écran d'affiché et donc pas de possibilité de mettre un bouton.

---- Sevyc64  (alias Casy) ---- <hr size ="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #    http://aide-office-vba.monforum.com/index.php
Messages postés
58
Date d'inscription
lundi 17 janvier 2005
Statut
Membre
Dernière intervention
27 janvier 2015

bonjour , j'ai vrément besoin que la demande de connection soit infini!!!! ou j'ai pensé à :
faire une demande de connection toute les 10 secondes et si erreur continuer et réesayer de se connecter 10seconde plus tard.

J'ai essayer de méttre ton code et ladapter pour l'infini , il y a une erreur au bout d'un moment : out of stack space
je crois que j'ai depasser l'espace de la pile!!!

voici le code :

Private Sub Form_Load()
Dim EtatConnection As Integer

    EtatConnection = image_screen_sock.State
 
    Do While Not (EtatConnection = sckConnected)
       If (EtatConnection < 3) Then image_screen_sock.Connect ip_master, 8000
       DoEvents
       EtatConnection = image_screen_sock.State       If EtatConnection sckError Or EtatConnection sckClosing Then Exit Do
    Loop
  
    If EtatConnection = sckClosing Then Call Form_Load
    If EtatConnection = sckError Then Call Form_Load
  
End Sub