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.NET Discussion :

socket TCP et temps d'attent pour une connexion?


Sujet :

VB.NET

  1. #21
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 198
    Par défaut
    oui et on te l'a indiqué, mais tu n'arrives pas à la mettre en oeuvre
    il te manque peut etre des connaissances sur le langage pour y arriver
    moi il m'a fallu du temps avant de comprendre les méthodes asynchrones du framework et les callbacks

    je rééexplique quand meme
    beginaccept prend en paramètre un callback (information que de quelle sub appeler quand il a ce qu'il lui faut, ici une connexion au serveur)
    la sub est appelée quand c'est ok, et dans cette sub, si pour établir la connexion il faut faire endaccept
    begin + end équivaut donc à accept, sauf qu'accept est une méthode qui attend jusqu'à que la connexion soit établie

    (...)

    j'ai fini par te faire le code, si tu ne comprends pas tout le code ou son fonctionnement, utilise msdn (F1 sur un mot) et l'intellisense

    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
     
        Private _mre As New System.Threading.ManualResetEventSlim(False)
     
        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
            Dim t As New System.Net.Sockets.TcpClient
     
            Dim callback As New AsyncCallback(AddressOf ConnexionPossible)
     
            t.BeginConnect("google.fr", 960, callback, t)
            _mre.Wait(2000) ' on attend 2 secondes ou moins si la connexion passe
            If _mre.IsSet Then
                MsgBox("connexion ok")
     
            Else
                MsgBox("connexion pas ok, on tente sur le port 80")
                t.Close()
                t = New System.Net.Sockets.TcpClient
                t.BeginConnect("google.fr", 80, callback, t)
                _mre.Wait(2000) ' on attend 2 secondes ou moins si la connexion passe
                t.Close()
                If _mre.IsSet Then
                    MsgBox("connexion ok")
     
                Else
                    MsgBox("connexion pas ok")
                End If
            End If
        End Sub
     
        Private Sub ConnexionPossible(ar As IAsyncResult)
            Try
                Dim t As System.Net.Sockets.TcpClient = DirectCast(ar.AsyncState, System.Net.Sockets.TcpClient)
                If t.Client Is Nothing Then Exit Sub ' socket fermé
                _mre.Set() ' on débloque la ligne _mre.Wait(2000)
                t.EndConnect(ar) ' on fini de connecter, t est utilisable après
            Catch ex As Exception
                MsgBox("erreur")
            End Try
        End Sub
    on créé un tcpclient
    on créé un callback en lui donnant la sub à appeler à la fin
    on appelle beginconnect dans un premier temps sur quelque chose qui ne répond pas (google sur le port 960 au lieu de 80)
    on dit d'attendre 2 secondes
    si l'objet qui sert à attendre dit qu'il a été débloqué par le set ca veut dire que la connexion est bonne (msgbox ok)
    sinon on ferme le socket car il n'est plus utilisable
    ! : le socket un fois fermé va appeler le callback quand même, mais avec t.client à nothing (testé dans le callback)

    si la connexion passe (2ème tentative) le callback est appelé, on retrouve le socket qui a demandé de passer par ce callback dans ar.AsyncState (beginconnect demande un state as object en dernier paramètre, on peut en théorie mettre ce qu'on veut)
    si c'est ok on fait t.endaccept(ar) et ca doit être bon


    NB :
    ici j'attend 2 secondes mais sur le thread principal, donc c'est bloquant
    tu peux réécrire ca avec un timer qui ne bloque pas l'interface

    une autre méthode aurait été de créer un thread, de faire .accept et sur le thread principal via un timer si ca fait plus de 2 secondes tu faire thread.interrupt, c'est plus simple à écrire, plus propre je ne sais pas



    et je n'ai jamais utilisé le tcpclient, j'ai juste utilisé l'intellisense google et msdn
    le fait que le .close fait que le callback est appelé je l'ai pas deviné, ca se constate en testant et google l'explique
    donc il faut apprendre un peu plus avant de coder, sinon on avance pas (et apprendre à chercher aussi car il doit y avoir des sources sur le net quand même)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  2. #22
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    559
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 559
    Par défaut
    par contre le compilateur ne reconnait pas ce type de variable

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private _mre As New System.Threading.ManualResetEventSlim(False)
    Il faut sans doute ajouter un librairie

  3. #23
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    559
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 559
    Par défaut
    ce type n'existe pas par contre celui en dessous :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Private _mre As New System.Threading.ManualResetEvent(False)
    OUI

  4. #24
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 198
    Par défaut
    oui, le slim a du apparaitre avec le framework 4
    c'est comme le readerwriterlock, avec le framework 3.5 microsoft en a fait un plus simple (readerwriterlockslim)

    le fonctionnement doit être à peu près le même
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #25
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    559
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 559
    Par défaut
    OK ON PEUT METTRE

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private _mre As New System.Threading.ReaderWriterLockSlim(False)
    mais pas de méthode "set"

  6. #26
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 198
    Par défaut

    tu fais tout pour pas y arriver ou quoi ?

    je dis juste pourquoi il y a des slims et des pas slims
    le readerwriterlock ou slim ne sert à rien dans ton cas !
    il te faut le manualresetevent !
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  7. #27
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    559
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 559
    Par défaut
    le type de , je ne vois pas à quoi ça correpond?

  8. #28
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 198
    Par défaut
    la démarche de codage :

    quand on créé le callback (new asyncallback) il demande un délégué en paramètre
    j'ai mis adressof masub
    puis j'ai écris private sub masub
    là le compilateur dit que masub doit avoir un paramètre de type IAsyncResult, donc j'ai ajouté ar as IAsyncResult

    après IAsyncResult est une interface pas une classe, ca défini des membres mais permet plusieurs types de classes
    et vu le nom cette interface doit servir à passer un résultat asynchrone ...

    ca répond à ta question ?
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  9. #29
    Membre confirmé
    Inscrit en
    Janvier 2010
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 82
    Par défaut
    (Je lis quelques sujets sur le fofo pour apprendre des fois sur des sujets qui m'interesse, et là je dois dire que j'admire la patience de Pol63, enfin je dis pas ça péjorativement pour l'auteur du sujet, mais c'est vraiment sympa d'avoir des membres qui répondent aussi précisément et cherchent à aider jusqu'au bout, c'est très sympa c'était juste pour le faire remarquer...)

Discussions similaires

  1. [Débutant] Problème de temps de réponse pour une recherche d'articles
    Par Tazze-99 dans le forum VB.NET
    Réponses: 22
    Dernier message: 14/12/2011, 10h50
  2. Réponses: 0
    Dernier message: 19/07/2011, 16h50
  3. Temps d'exécution pour une procédure stockée PL/SQL Oracle 9
    Par strompakha dans le forum Administration
    Réponses: 3
    Dernier message: 18/05/2010, 14h09
  4. Réponses: 2
    Dernier message: 28/04/2009, 15h26
  5. Réponses: 20
    Dernier message: 10/07/2006, 16h53

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