IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB 6 et antérieur Discussion :

Tchat grace a winsock: probleme de reconnection apres une utilisation


Sujet :

VB 6 et antérieur

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 6
    Points : 3
    Points
    3
    Par défaut Tchat grace a winsock: probleme de reconnection apres une utilisation
    salut a tous

    tout d'abord je vous rassure je me suis renseigne sur le net avant de venir, en regardant la faq les tuto et surtout le forum de long en large mais je n'ai pas trouvé de réponse satisfaisante et pour un info je suis débutant en vb même si je fais de la programmation pour mes études ce petit aparté c juste pour que vous compreniez mieux ma demande

    je fais un tchat pour valider un des 5 projets que je dois faire pour mon bts ici il s'agit du client/serveur

    en gros j'ai commence un tchat façon msn dont le programme fais le client et le serveur selon le cas

    Fonctionnement:
    quand l'utilisateur1 double clic dans la liste d'ip ça ouvre une nouvelle form de type dialogue qui essaye de se connecte a l'ip sélectionné sur le port 3000

    sur le pc de l'ip sélectionné donc l'utilisateur2 (si le logiciel est en marche chez lui évidement) la form principal intitulé menu accepte cette connection elle ouvre une nouvelle form de type dialogue qui se met en mode écoute sur le port 300
    le winsock du menu envoie une chaîne (/co) à l'utilisateur1 en lui demandant de se deco du port 3000 et essayer de se connecter sur le port 300

    hop la connection est établie et le menu se remet en mode écoute

    donc je vous donne le code pour que vous compreniez mieux

    LA FORM PRINCIPAL MENU
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
     Dim Frm As Dialogue
    Dim Frm2 As Dialogue
     
    Public nb_contact As Integer
     
    Private Sub Ajout_Click(Index As Integer)
        Ajout_Form.Show
    End Sub
     
    Private Sub Form_Load()
    'au chargement on met le serveur en mode ecoute et on initialise le nbr de contact
        nb_contact = 0
        pseudo = txtPseudo.Text
        WServeur.Listen
        lstAmis.AddItem "192.168.0.3" ' mes ip de test
        lstAmis.AddItem "192.168.0.1"
    End Sub
     
    Private Sub Form_Unload(Cancel As Integer) 'quand on quitte avec la croix
        End
    End Sub
     
    Private Sub lstAmis_DblClick()
    'quand on double clic sur une ip de la liste ca ouvre la fenetre discussion
        Set Frm2 = New Dialogue
        Frm2.testip = lstAmis.Text
        Frm2.Show
    End Sub
     
    Private Sub Quitter_Click() 'quand on quitte par le menu
        End
    End Sub
     
    Private Sub txtPseudo_Change()
        If txtPseudo.Text = "" Then
            MsgBox ("Le pseudo doit être défini.")
            txtPseudo.Text = "Pseudo"
        Else
            pseudo = txtPseudo.Text
        End If
    End Sub
     
    Private Sub WServeur_ConnectionRequest(ByVal requestID As Long)
    'quand on recoit une demande de connection ca ouvre une nouvelle fenetre de type dialogue
    'cette fenetre jouera role du serveur et on donne l'ordre au client de demander de se connecter
    ' a celle ci grace a la chaine /co
        Set Frm = New Dialogue
        Frm.Show
        WServeur.Close
        WServeur.Accept (requestID)
       ' On Error Resume Next
        WServeur.SendData ("/co")
    End Sub
     
    Private Sub WServeur_DataArrival(ByVal bytesTotal As Long)
        Dim t As String
        On Error Resume Next
        WServeur.GetData t
        MsgBox (t)
    End Sub
     
    Private Sub WServeur_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 "Menu : Erreur n°" & Number & " -- " & Description, vbInformation
    End Sub

    LA FORM DIALOGUE
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    Public testip As String
    Dim testconnect As Integer
     
    Private Sub btnEnvoyer_Click()
    'si le message n'est pas vide on le copie dans la fenetre de discussion ...
        If txtMessage.Text <> "" Then
             txtDiscussion.Text = txtDiscussion.Text & pseudo & " a dit: " & vbNewLine
             txtDiscussion.Text = txtDiscussion.Text & txtMessage.Text & vbNewLine
    '... puis on l'envoie au correspondant
             On Error Resume Next
             Wclient.SendData (pseudo & " a dit:" & vbNewLine & txtMessage.Text)
    ' et on efface l'ancien message
             txtMessage.Text = ""
        End If
     
    End Sub
     
    Private Sub btnPolice_Click()
    'boite police pour le message
        CD1.Flags = cdlCFBoth
        CD1.ShowFont
     
           If CD1.FontName <> Null And CD1.FontName <> "" Then
                txtMessage.FontName = CD1.FontName
           End If
     
      txtMessage.FontSize = CD1.FontSize
      txtMessage.FontItalic = CD1.FontItalic
      txtMessage.FontBold = CD1.FontBold
    End Sub
     
    Private Sub Form_Load()
    Dim data2 As String
    testconnect = 0
     
     'on test si une conversation n'est pas deja en route si c'est le cas on essaye de se connecter
        If testip <> "" And testconnect = 0 Then
            Wclient.Close
            Wclient.RemoteHost = Wclient.LocalIP
            Wclient.RemotePort = 300
            Wclient.LocalPort = 0
            Wclient.Connect testip, 300
            lbltitre.Caption = "client"
            On Error Resume Next
            DoEvents
            Wclient.GetData data2
            If data2 = "/confirmco" Then
            testconnect = 1
            MsgBox ("connection rétablie")
            End If
        End If
    'si testip  contient une ip  on se met en mode client sinon en serveur
        If testip <> "" And testconnect = 0 Then
           Wclient.Close
           Wclient.RemoteHost = Wclient.LocalIP
            Wclient.RemotePort = 3000
            Wclient.LocalPort = 0
            Wclient.Connect testip, 3000
            lbltitre.Caption = "client"
     
        ElseIf testconnect = 0 Then
            Wclient.Close
            lbltitre.Caption = "serveur"
            Wclient.LocalPort = 300
            Wclient.RemotePort = 0
            Wclient.RemoteHost = 0
            Wclient.Listen
        End If
    End Sub
     
    Private Sub Form_Unload(Cancel As Integer)
    'quand on ferme la fenetre on se deco et on envoi une confirmation au correspondant
        On Error Resume Next
        Wclient.SendData "/deco"
        DoEvents
        Wclient.Close
        Wclient.LocalPort = 0
     
    End Sub
     
    Private Sub WClient_ConnectionRequest(ByVal requestID As Long)
    'on accepte que le client se connecte au serveur
        Wclient.Close
        Wclient.Accept (requestID)
        Wclient.SendData "/confirmco"
    End Sub
     
    Private Sub WClient_DataArrival(ByVal bytesTotal As Long)
        Dim data As String
     
        On Error Resume Next
            Wclient.GetData data
     
        If data = "/co" Then
        'le serveur du menu a accepte la connection et demande de se reconnecte sur le port 300
            Wclient.Close
            Wclient.RemoteHost = Wclient.LocalIP
            Wclient.RemotePort = 300
            Wclient.LocalPort = 0
            Wclient.Connect testip, 300
        'comme le client et le serveur sont relie on reactive le serveur du menu en mode ecoute
            Menu.WServeur.Close
            Menu.WServeur.Listen
        ElseIf data = "/deco" Then
        'votre correspondant vous previent qu'il s'est deconnecte donc vous ferme
        'la liason et vous l'affichez
            Wclient.Close
            Wclient.LocalPort = 0
        'si vous etiez serveur vous vous mettez a réecouter
            If lbltitre.Caption = "serveur" Then
                Wclient.Listen
                MsgBox Wclient.State
            Else
        'sinon ovus devenez serveur et vous ecoutez
                Wclient.Close
                lbltitre.Caption = "serveur"
                Wclient.LocalPort = 300
                Wclient.RemotePort = 0
                Wclient.RemoteHost = 0
                Wclient.Listen
            End If
     
            txtDiscussion.Text = txtDiscussion.Text & "Votre correspondant est deconnecté" & vbNewLine
        Else
            txtDiscussion.Text = txtDiscussion.Text & data & vbNewLine
        End If
    End Sub
     
    Private Sub WClient_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 lbltitre.Caption & " :Erreur n°" & Number & " -- " & Description, vbInformation
    End Sub
    il ya aussi la form pour ajouter des ip et un module qui comptient la variable pseudo mais cela ne rentre pas en compte pour mon probleme

    alors mon probleme c'est que quand on ferme une fenetre de dialogue je ne sais pas si l'envoie de "/deco" bug ou si c'est la reception qui bug mais l'autre correspondant n'est pas prevenu

    mon deuxieme est lié je pense c'est que je n'arrive pas a me reconnecte une deuxieme fois mais par compte si user1 lance une conversation avec user2 ca marche s'il retente (apres que les 2 users aient fermés leurs fenetre) ca marche pas et autant de fois qu'il tentera
    puis si l'user2 lance une conversation la ca marchera puis si l'user1 lance apres ca marchera en gros ca marche si les discussions sont lances chacun leurs tours en alternance

    si vous pouviez m'aider ce serais super je demande pas la solution mais un petit indice qui me mettrai sur la voix

    sinon j'ai deja vu
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set Nomdelaform = Nothing
    dans unload

    mais je ne sais pas a quoi ca correspond

    sinon pour ceux qu'ils veulent les sources vb avec les form etc enfin le tout faut aller ici

  2. #2
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 038
    Points
    20 038
    Par défaut
    et bien dans ta userform Unload ... met en commentaire la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    On Error Resume Next
    qui te masque les éventuelles erreur .... tu aura peu-être un message d'erreur supplémentaire..?

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    effectivement que ce soit le client ou le serveur

    le premier se ferme normalement et le deuxieme indique

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    erreur : 40006 etat de connection errone pour la transaction ou la requete
    requise
    il dit que c'est Wclient.SendData "/deco" dans la procedure unload

    cette erreur ne vient pas du fait que le wclient.close est dans la meme procedure que wclient.send data enfin normalement non

    je vais chercher sur le net mais si quelqu'un sait comment resoudre ca je suis preneur

    au fait j ai choisi le protocol tcp je sais pas si ca joue

    edit: j'ai trouve pour l erreur 40006 c'est que celui qui ferme en premier envoie le /deco mais le deuxieme quand on le ferme il essaye de faire pareil alors que la conncection est coupe enfin de toute façon l envoie ou la recpetion de /deco ne se fait pas vu qu il y a aucune reaction de l'autre cote

    premier probleme resole
    j'ai rajouté un DoEvents entre le wclient.sendData et le wclient.close
    j'ai vu ca par comtre je sais pas ce que ca fait

    il me reste seulement mon probleme de reconnection

    bon bah je galere trop pour la reconnexion donc bah je compte sur vous je cherche mais je trouve pas

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    je sais que ca se fait pas mais je up car il faut vraiment que je trouve la solution

    desole

  5. #5
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 038
    Points
    20 038

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    oh oui

    mais ca ne resoud pas mon probleme qui pourtant est exactement celui la

    a moins que j'ai pas compris et que l'on ferme seulement quand on veut se connecter

  7. #7
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 038
    Points
    20 038
    Par défaut
    Faudrai peu être revoir l'utilisation des 2 contrôles Winsock je comprends pas pourquoi tu n'utilise pas le même contrôle en écoute lors de la première connexion et les autres ?

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    je sais j'ai toujours une façon tordu de voir les choses

    mais bon en c et c++ ca passe mais avec vb lol

    bon en gros j'avais cru pauvre de moi qu un winsok en mode ecoute ne pouvait recevoir la connection d'un seul client maintenant quand j y pense enfin bon le probleme c'est que comme tout logiciel tel que msn ce n'est pas conçu pour faire une seul conversation a la fois

    et si je reçois tout sur "wserveur" alias le winsock de la premiere connection je devrai transfere a la form correspondante et verifie a chaque fois a qui l envoye etc

    j ai trouve plus facil ma solutions bon apres si tu me dis c pas possible comme ca j'essaierai de revoir mon concept sinon je voudrai bien un exempte pour fermer mes connection proprement parceque sinon je vois pas ou est le bug de mon programme

    edit :

    bon on m a convaincu que je m'y étais mal pris donc je recommence depuis le debut seul probleme j'ai un winsock qui me sert a faire la connection entre le serveur et le client de cette façon

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub WServeur_ConnectionRequest(requestID As Long)
        compteur = compteur + 1
        Load Wclient(compteur)
        Wclient(compteur).requestID
    End Sub
    mais lorsque je fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Private Sub Wclient_DataArrival(Index As Integer, ByVal bytesTotal As Long)
        Dim data As String
        Wclient(index).GetData data
    End Sub
    ca bug car le Index As Integer c'est moi qui l'aie rajouté enfin je vais trouvé

    c bon fallait mettre index = 0 en parametre du winsock concerné

Discussions similaires

  1. Reprendre la main avec SAS après une utilisation de Matlab
    Par 8twilight8 dans le forum SAS Base
    Réponses: 5
    Dernier message: 03/03/2009, 11h21
  2. Réponses: 2
    Dernier message: 05/12/2005, 11h02
  3. probleme de MBR apres suppression de linux
    Par amadoulamine1 dans le forum Windows XP
    Réponses: 15
    Dernier message: 17/05/2005, 15h19
  4. Probleme de boot apres suppression de Linux
    Par m@xou dans le forum Administration système
    Réponses: 6
    Dernier message: 19/04/2004, 09h12
  5. Probleme de redirection apres fermeture de session
    Par soufienne dans le forum ASP
    Réponses: 3
    Dernier message: 08/04/2004, 10h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo