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

Réseau .NET Discussion :

les Sockets en asynchrone


Sujet :

Réseau .NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 2
    Par défaut les Sockets en asynchrone
    Bonjour,

    Je programmais en VB6 et je n'avais aucun problème avec les sockets.
    Je récupérais mes données avec le DataArrival .
    Mais je suis passé en .NET et je galère vraiment.
    En Synchrone je n'ai pas de problème mais pour la reception de données (comme le dataArrival du WinSock ) je ne sais pas comment faire.
    J'ai vu qu'on pouvait utiliser le mode Asynchrone qui permettrait de faire ce DataArrival Mais je seche totalement.

    A ma commande : Socket.BeginConnect , ca n'a pas l'air de passer.
    Ca a bien l'air d'aller dans le CallBack mais foire la connexion.. et je n'arrive pas a trouver le probleme.

    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
    #Region "Imports"
    Imports System.Net
    Imports System.Text
    Imports System.Net.Sockets
    Imports System.IO
    Imports System.Threading
     
    #End Region
    #Region "Form1"
    Public Class Form1
    #Region "Dim Socket"
        'Création du nouveau Socket
        Dim CaraSocket As New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
        'Numéro de Port
        Dim CaraPort As Int32 = 6666 
        'Résolution de l'hôte
        Dim CaraHost As IPHostEntry = Dns.GetHostEntry("www.bidule.com") 
        'Adresse IP de l'hôte
        Dim CaraIP As IPAddress = CaraHost.AddressList(0)
        'Point de terminaison
        Dim CaraIPEnd As New IPEndPoint(CaraIP, CaraPort)
        'Buffer
        Dim CaraBuffer(655360) As Byte
    #End Region
     
     
    #Region "Form1 Load"
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
     
        End Sub
    #End Region
     
    #Region "Bouton Connexion"
        Private Sub btn_CaraConnect_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_CaraConnect.Click
            If btn_CaraConnect.Text = "Connexion" Then
                Try
                    'Info barre de status
                    Tab_StatusInfos.Text = "Tentative de connection"
                    'Connexion du Client
                    CaraSocket.BeginConnect(CaraIPEnd, AddressOf CaraConnectCallback, CaraSocket) 'c'est ici que ca merdouille
                    'Timer1.Enabled = True
                    Dim MessRecept As Integer = CaraSocket.Receive(CaraBuffer, 0, CaraBuffer.Length, SocketFlags.None)
                    If MessRecept <> 0 Then
                        RTF_Info.Text = Encoding.ASCII.GetString(CaraBuffer)
                    End If
                    MessRecept = CaraSocket.Receive(CaraBuffer, 0, CaraBuffer.Length, SocketFlags.None)
                    If MessRecept <> 0 Then
                        RTF_Info.Text = Encoding.ASCII.GetString(CaraBuffer)
                    End If
                Catch
                    Tab_StatusInfos.Text = "Echec de connection"
                End Try
            Else
                btn_CaraConnect.Text = "Connexion"
            End If
        End Sub
    #End Region
     
     
    #Region "Connexion CallBack"
        Private Sub CaraConnectCallback(ByVal asyncResult As IAsyncResult)
            Try
                CaraSocket.ConnectAsync(asyncResult)
                CaraSocket.EndConnect(asyncResult)
                Tab_StatusInfos.Text = "Connectée"
                btn_CaraConnect.Text = "Déconnexion"
            Catch
     
                Tab_StatusInfos.Text = "Echec de connection"
            End Try
        End Sub
    #End Region
     
        Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
            If CaraSocket.Connected Then
                Try
                    CaraSocket.BeginReceive(CaraBuffer, 0, CaraBuffer.Length, SocketFlags.None, AddressOf ReceptionCallback, CaraSocket)
     
                Catch
                End Try
            End If
        End Sub
     
        Private Sub ReceptionCallback(ByVal asyncResult As IAsyncResult)
            'If CaraSocket.Connected Then
            Try
                Dim read As Integer = CaraSocket.EndReceive(asyncResult)
                If read <> 0 Then
                    RTF_Info.Text = Encoding.ASCII.GetString(CaraBuffer)
                    Debug.Print(Encoding.ASCII.GetString(CaraBuffer))
                End If
            Catch
            End Try
            'End If
        End Sub
     
        Private Sub EnvoiCallback(ByVal asyncResult As IAsyncResult)
            If CaraSocket.Connected Then
                Try
                    Dim send As Integer = CaraSocket.EndSend(asyncResult)
                Catch
                End Try
            End If
        End Sub
     
    #End Region
    End Class
    #End Region
    Donc quand je lance le débug , il foire au CallBack (apparement)
    Si vous pouvez me donner des conseils.
    (C'est pour acceder à un chat et pouvoir récuperer les infos des gens qui parlent en temps réel. En mode Synchrone , pas de souci , je me connecte , je peux parler , tout fonctionne sauf que je ne récupere pas les données des gens... c'est le gros soucis...)

    Merci de votre aide.

  2. #2
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 197
    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 197
    Par défaut
    le principe en asynchrone:
    appeler beginconnect en lui donnant un callback
    ne rien faire d'autre
    quand le callback est appelé, appeler endconnect, puis appeler beginreceive en lui fournissant un callback aussi
    dans le callback du beginreceive appeler endreceive pour avoir les octets, puis réappeler dans la foulée beginreceive pour pouvoir avoir la prochaine réception de données

    si tu n'y arrives pas, tu peux tenter de faire un thread par client en utilisant les méthodes synchrones, là l'attente des méthodes synchrones n'est plus dérangeant (les méthodes asynchrones ne font que démarrer un thread qui fera le rappel)

    sinon tu peux tester wcf (ou .net remoting si tu n'es pas sur le fx3 ou supérieur)
    ca permet d'éviter de coder la transmission et la norme de dialogue, en schématisant le serveur expose des méthodes et les clients en les appelant font que la méthode est exécutée sur le serveur
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Nouveau candidat au Club
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 2
    Par défaut
    Merci pour ta réponse.

    Quand je fais mon action :
    BeginConnect ca va vers le callback
    au callback ca n'effectue pas correctement le Try et donc va au Catch...
    Donc on pourrait dire que la connexion ne s'effectue pas.
    Mais Disons que je reprenne mon mode Synchrone qui fonctionne bien.
    Il faut que je puisse aussi faire un DataArrival (donc dans un timer?)
    Le souci c'est qu'il ne faut pas que le timer me bloque l'appli il faut que je puisse garder la main. Ou alors que je puisse faire une fonction qui est appellé qu'a la reception de nouveau paquet (comme le DataArrival) Mais je ne sais pas comment le coder , je suis assez perdu en fait. Je n'ai pas forcément besoin de multiThreads. En Socket sous VB6 je n'en avais pas et ca fonctionnait très très bien.
    (je ne connais pas wcf, ni .net remoting et je ne sais pas ce qu'est le fx3 (je pense que tu parles du framework, non ?)
    Google m'a renseigner sur le .net Remoting mais je vois mal si ca pourrait vraiment coller. Je préfererais rester sur les sockets là , Vraiment mon plus gros souci est le fait de ne pas arriver a receptionner des paquets "automatiquement". Si j'ai la solution à ca en gardant toujours la main sur le logiciel pas de prob.
    Mon but est de pouvoir faire un client du type Chat IRC (mais pas pour IRC)
    et aussi (et surtout) un Bot (donc il devra etre capable de lire les infos entrantes puis les traiter )
    Enfin, et bien, dès que je peux receptionner tout correctement, le reste sera un jeu d'enfant. Mais là vraiment je bloque a fond

  4. #4
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 197
    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 197
    Par défaut
    Citation Envoyé par overthetop Voir le message
    au callback ca n'effectue pas correctement le Try et donc va au Catch...
    il serait judicieux ne nous dire la ligne qui plante, le message d'erreur, et éventuellement le type d'exception


    Citation Envoyé par overthetop Voir le message
    Mais Disons que je reprenne mon mode Synchrone qui fonctionne bien.
    Il faut que je puisse aussi faire un DataArrival (donc dans un timer?)
    Le souci c'est qu'il ne faut pas que le timer me bloque l'appli il faut que je puisse garder la main. Ou alors que je puisse faire une fonction qui est appellé qu'a la reception de nouveau paquet (comme le DataArrival) Mais je ne sais pas comment le coder , je suis assez perdu en fait. Je n'ai pas forcément besoin de multiThreads. En Socket sous VB6 je n'en avais pas et ca fonctionnait très très bien.
    (je ne connais pas wcf, ni .net remoting et je ne sais pas ce qu'est le fx3 (je pense que tu parles du framework, non ?)
    par fx3 j'entend framework 3 oui
    wcf et .net remoting ne sont utile que si tu gères les 2 côtés de la connexion, ce qui ne semble pas être ton cas

    les sockets en vb.net sont de plus bas niveau que ceux de vb6, il y a plus de choses à gérer

    avec les méthodes synchrones, l'exécution du code est suspendu jusqu'à "l'évènement" qui débloque, pour connect ce n'est pas généralement un soucis car si le serveur répond vite ca ne bloque, mais si le serveur ne répond pas ou sur la méthode receive ca va bloquer, et donc bloquer l'interface
    il faut alors un autre thread, car le thread principal s'occupe de l'interface, et donc bloquer sur un autre thread n'est pas un soucis
    si tu fais une classe pour gérer le socket, tu peux faire un evènement sur cette classe, démarrer le thread sur l'instanciation de la classe, et lever l'évènement en cas de réception de données
    ton interface doit être abonnée à cet évènement et ca te feras comme sous vb6 le datareceive (il faudra revenir sur le thread principal pour modifier l'interface, voir délégués / uncontrol.invokerequired / uncontrol.invoke)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

Discussions similaires

  1. Réponses: 0
    Dernier message: 21/04/2013, 11h54
  2. [Kylix] Aide por les sockets
    Par nabs dans le forum EDI
    Réponses: 1
    Dernier message: 03/04/2004, 12h35
  3. les sockets sur != réseaux
    Par Hypnos dans le forum Développement
    Réponses: 2
    Dernier message: 02/03/2004, 09h45
  4. [Kylix] cherche composants pour les sockets
    Par coriolis dans le forum EDI
    Réponses: 1
    Dernier message: 09/04/2003, 10h18
  5. Questionsssss sur les sockets?
    Par Nino dans le forum Développement
    Réponses: 5
    Dernier message: 01/04/2003, 21h11

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