Winsock.close ne déclenche pas winsock_close()

cs_marco62118 Messages postés 176 Date d'inscription mercredi 7 avril 2004 Statut Membre Dernière intervention 1 avril 2013 - 18 sept. 2010 à 23:18
 Utilisateur anonyme - 19 sept. 2010 à 16:40
bonsoir
j'ai créé un jeu avec un client et serveur avec des winsocks,ça fonctionne mais!! lorsque le serveur envoi des données attends un accusé réception du client par ce petit code:
Public Sub SeverEnvoi(ByVal strdata As String)
Dim W As Winsock
Dim NJoueur As Byte

For Each W In frm_plateau.ServerWscK
   If (W.Index > 0) Then
        If W.State = 7 Then
            NJoueur = CByte(Val(W.Tag))
            While OK(NJoueur) = False 'tant que le client n'a pas aqquité la réception de l'envoi précédent du Winsock index
                DoEvents
            Wend
        End If
    End If
Next
For Each W In frm_plateau.ServerWscK
   If (W.Index > 0) Then
        If W.State = 7 Then
            NJoueur = W.Tag
            Debug.Print " serveurWsck " & W.Index & " envoi " & strdata
            OK(NJoueur) = False 'pour attendre l'aquittement de la réception de l'envoi
            frm_plateau.Timer_Deconnect.Enabled = True 'si le client n'aquitte pas la connection sera coupée
            Debug.Print " serveurWsck " & W.Index & " est bloqué OK(" & NJoueur & ") est " & OK(NJoueur)
            W.SendData strdata 'envoi des données vers le client (index) par le winsock index
        End If
  End If
Next


si un client ne fait d'acquittement un timer est déclenché, au bout du temps le timer coupe la connection en utilisant la méthode close
Private Sub Timer_Deconnect_Timer()
Dim i As Byte
For i = 1 To NbreJoueurConnecté
    If OK(i) = False Then
    frm_plateau.ServerWscK(i).Close
    DoEvents
    End If
Next i
End Sub

mais apparemment la méthode close ne déclenche pas l'événement "Public Sub ServerWsck_Close(Numwsck As Integer)"

3 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
19 sept. 2010 à 00:19
Salut
Pas vraiment compris de quel côté était ce code ...

Je pense que si c'est le programme A qui fait le .Close, seule la procédure _Close du côté B se déclenchera, pas celle du côté A.
C'est confirmé par l'aide de VB que tu aurais dû consulter.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
cs_marco62118 Messages postés 176 Date d'inscription mercredi 7 avril 2004 Statut Membre Dernière intervention 1 avril 2013 1
19 sept. 2010 à 10:21
bonjour, merci pour cette prompte réponse

le prog est sur serveur.
Ok la méthode .close déclenche l'évènement distant _close()!!!
mais comme sur le serveur, lorsque je suis dans la boucle d'attente, le serveur n'a pas l'air de voir la déconnexion du distant!
est ce que j'ai le "droit" dans le timer à la place du .close (pour le distant) de déclencher directement l'évènement _close() du winsock du serveur, comme si j'avais reçu une fermeture du distant.
0
Utilisateur anonyme
19 sept. 2010 à 16:40
bonsoir,
à mon avis ce serait plus simple que ton serveur gère lui même les déconnexions selon l'état (State) de la socket.
WinSock.State sckClosed 0
WinSock.State sckOpen 1
WinSock.State sckListening 2
WinSock.State sckConnectionPending 3
WinSock.State sckResolvingHost 4
WinSock.State sckHostResolved 5
WinSock.State sckConnecting 6
WinSock.State sckConnected 7
WinSock.State sckClosing 8
WinSock.State sckError 9

Bonne soirée
0
Rejoignez-nous