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 :

[plusieurs Problème] - programmation réseau VB.net [Débutant]


Sujet :

VB.NET

  1. #1
    Membre régulier
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2014
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Août 2014
    Messages : 63
    Points : 123
    Points
    123
    Par défaut [plusieurs Problème] - programmation réseau VB.net
    Bonjour à tous je dois concevoir une appli réseau qui utilise le protocole UDP en VB.net. donc je décide de développer des procédures stocké dans un module dédié afin de les séparer de mon code et je vous référence mes problème

    Pour commencer dans le module nommé "Communication.vb" j'ai trouvé sur internet une fonction qui retourne l'adresse MAC d'une IP donné
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Declare Function SendARP Lib "iphlpapi.dll" (ByVal DestIP As UInt32, ByVal SrcIP As UInt32, ByVal pMacAddr As Byte(), ByRef PhyAddrLen As Integer) As Integer
        Function GetMAC(ByVal IPAddress As String) As String
            Dim addr As Net.IPAddress = Net.IPAddress.Parse(IPAddress)
            Dim mac() As Byte = New Byte(6) {}
            Dim len As Integer = mac.Length
            SendARP(CUInt(addr.Address), 0, mac, len)
            Dim macAddress As String = BitConverter.ToString(mac, 0, len)
            Return macAddress
        End Function
    à la ligne SendARP(CUInt(addr.Address), 0, mac, len) j'ai la variable "addr.address" souligné en vert avec le message d'avertissement suivant :
    'Public Property Address As Long' est obsolète*: 'This property has been deprecated. It is address family dependent. Please use IPAddress.Equals method to perform comparisons. cependant la fonction ... fonctionne : je cherche à virer cet avertissement

    ensuite voilà le plus gros problème que j'ai : j'ai vu que pour la réception d'un message qu'il faut créer un background-worker afin d'éviter de geler le programme et je dois avouer que c'est bien compliqué ><'
    je vous colle ici le code de mes procédure d'écoute :

    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
     
        Dim ecouter_local_port As Integer
        Dim ecouter_hote_ip_distant As IPAddress
        Dim ecouter_hote_port_distant As Integer
        'UDP recevoir message
        'on déclare un nouveau background_worker avec event
        Private WithEvents Ecouter As System.ComponentModel.BackgroundWorker
     
        Sub udp_recevoir_message(ByVal autre_form_local_port As Integer, ByVal autre_form_ip_hote_distant As String, ByVal autre_form_port_hote_distant As Integer)
            'on crée le thread d'écoute
            Ecouter = New System.ComponentModel.BackgroundWorker
            ' on configure le thread 
            Ecouter.WorkerReportsProgress = True
            Ecouter.WorkerSupportsCancellation = True
            'on configure les Handler pour ce thread dont on a besoin
            AddHandler Ecouter.DoWork, AddressOf Ecouter_DoWork
            AddHandler Ecouter.RunWorkerCompleted, AddressOf Ecouter_RunWorkerCompleted
     
            'depuis l'autre form on récupère les valeurs demandé (le port d'écoute local, les IP sources et les ports sources)
            ecouter_local_port = autre_form_local_port
            'récupération du port local en vue de la création du socket local (qui sont en variable globale)
            ecouter_hote_port_distant = autre_form_port_hote_distant
     
            'récupération du remote port depuis autre_form vers variable locale
            ' test de la variable IP_distant = any (on accepte les données de tout les hote ou seulement une IP en particulier ?)
            If autre_form_ip_hote_distant = "any" Then
                'commande si autre_form_ip_hote_distant = "any"
                ecouter_hote_ip_distant = IPAddress.Any
            Else 'sinon
                ' commande si autre_form_ip_hote_distant != "any"
                ecouter_hote_ip_distant = IPAddress.Parse(autre_form_ip_hote_distant)
            End If 'fin de test
            'On lance l'écoute (rappel : les variables désignant le port d'écoute local, les IP sources et les ports sources sont globalisé)
            Ecouter.RunWorkerAsync()
        End Sub
     
        Sub Ecouter_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles Ecouter.DoWork
            'On déclare une connexion UDP
     
            Dim receivingUdpClient As New UdpClient(ecouter_local_port)
            'On désigne un hote distant 
            Dim RemoteIP As New System.Net.IPEndPoint(ecouter_hote_ip_distant, ecouter_hote_port_distant)
            'On lance la réceptions des donnée
            Dim receiveBytes As [Byte]() = receivingUdpClient.Receive(RemoteIP)
            'on convertis les données recu
            Dim returnData As String = Encoding.ASCII.GetString(receiveBytes)
            'on prépare l'expédition du résultat au process principal
            e.Result = returnData
            'on ferme la connexion UDP
            receivingUdpClient.Close()
            'on stop le thread secondaire tout en renvoyant le résultat au sub Ecouter_RunWorkerCompleted via le handler qui va bien
            System.Threading.Thread.Sleep(1)
        End Sub
     
        Private Sub Ecouter_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles Ecouter.RunWorkerCompleted
            'On récupère la chaine transmise lors de la cloture du background worker
            Dim recup_data As String = e.Result
            'on déclenche une fonction de traitement
            traiter_message_recu(recup_data)
        End Sub
     
        Sub traiter_message_recu(ByVal message_a_traiter As String)
            'On fait le traitement
            Form1.Label1.Text = message_a_traiter
            'je dois redéclencher l'écoute de facon automatique ici
            udp_recevoir_message(10000, "any", 0)
        End Sub
    l'appel de l'écoute depuis form1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
            Communication.udp_recevoir_message(10000, "any", 0)
            Label1.Text = "En attente de reception"
        End Sub
    j'ai plusieurs problème :
    le 1er est que lorsque l'écoute est active il ne récupère que le second paquet UDP reçu exemple

    lancer écoute coté serveur (label1 = "en attente de réception")
    client envoie message "salut"
    client envoie message "toto"
    Serveur traite "toto" (label1 = "toto")

    ensuite si je demande une écoute secondaire (en recliquant sur le bouton1) après réception d'un message cela redémarre l'écoute.
    si je demande à automatiser l'écoute (par exemple en rappelant la sub depuis traiter_message_recu) je lève une exception de socket déjà utilisé oO alors que j'ai bien demandé la cloture du socket une fois le message reçu via la ligne "receivingUdpClient.Close()" . Je me rappelle des cours de VB ou mon profs nous expliquait que l'on pouvais forcer la libération des ressources mais j'y arrive pas

    Pouvez vous m'aider ?

    Merci d'avance

  2. #2
    Membre régulier
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2014
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Août 2014
    Messages : 63
    Points : 123
    Points
    123
    Par défaut
    Bonjour

    n'ayant pas eu de réponses j'ai décidé de réécrire mon code et j'ai pu résoudre tout les problèmes sauf celui de la fonction GETMAC (mineurs)

    je vous met ici le code du module communication.vb modifié (et amélioré) pour ceux qui aurait le même problème
    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
        Public WithEvents Ecoute As System.ComponentModel.BackgroundWorker
        Dim ecouter_local_port As Integer
        Dim ecouter_hote_ip_distant As IPAddress
        Dim ecouter_hote_port_distant As Integer
        Dim parametre_ecoute As String
        Dim boucle As Boolean
        Dim preparation_ecoute As String
     
        Function GetMAC(ByVal IPAddress As String) As String
            Dim addr As Net.IPAddress = Net.IPAddress.Parse(IPAddress)
            Dim mac() As Byte = New Byte(6) {}
            Dim len As Integer = mac.Length
            SendARP(CUInt(addr.Address), 0, mac, len)
            Dim macAddress As String = BitConverter.ToString(mac, 0, len)
            Return macAddress
        End Function
     
    [...une fonction lister interface qui récupère les couples IPv4/MAC des interface dispo et une fonction envoyer paquet udp...]
     
    Public Sub initialiser_ecoute()
            Ecoute = New System.ComponentModel.BackgroundWorker
            ' on configure le thread 
            Ecoute.WorkerReportsProgress = True
            Ecoute.WorkerSupportsCancellation = True
        End Sub
     
        Public Sub recevoir_message(ByVal local_p As Integer, ByVal ip_src As String, ByVal port_src As Integer, ByVal boucle_infini As Boolean)
            boucle = boucle_infini
            parametre_ecoute = local_p & "#" & ip_src & "#" & port_src
            If Ecoute.IsBusy = False Then
                Ecoute.RunWorkerAsync(parametre_ecoute)
            End If
        End Sub
     
        Private Sub Ecoute_démaré(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles Ecoute.DoWork
            'declaration
            Dim lport As Integer
            Dim dip_string As String
            Dim dip As IPAddress
            Dim dport As String
            Dim parametre As String
            Dim car_scanne As String
            Dim pos_1 As Integer = Nothing
            Dim pos_2 As Integer = Nothing
            Dim flag_nb As Boolean = False
            parametre = e.Argument
     
            For pos_scan_car As Integer = 0 To parametre.Count() - 1 Step 1
                car_scanne = parametre.Chars(pos_scan_car)
                If car_scanne = "#" Then
                    If flag_nb = False Then
                        pos_1 = pos_scan_car
                        flag_nb = True
                    Else
                        pos_2 = pos_scan_car
                    End If
                End If
            Next
            lport = CInt(parametre.Substring(0, pos_1))
            dip_string = parametre.Substring(pos_1 + 1, pos_2 - pos_1 - 1)
            dport = parametre.Substring(pos_2 + 1, parametre.Count() - pos_2 - 1)
            If dip_string = "any" Then
                dip = IPAddress.Any
            Else
                dip = IPAddress.Parse(dip_string)
            End If
            'On déclare une connexion UDP
            Dim receivingUdpClient As New UdpClient(lport)
            'On désigne un hote distant : tout le monde
            Dim RemoteIP As New System.Net.IPEndPoint(dip, dport)
            'On lance la réceptions des donnée
            Dim receiveBytes As [Byte]() = receivingUdpClient.Receive(RemoteIP)
            'on convertis les données recu
            Dim returnData As String = Encoding.ASCII.GetString(receiveBytes)
            'on prépare l'expédition du résultat au process principal
            e.Result = returnData
            'on ferme la connexion UDP
            receivingUdpClient.Close()
            'on stop le thread secondaire tout en renvoyant le résultat
            System.Threading.Thread.Sleep(1)
        End Sub
     
        Private Sub Ecoute_terminé(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles Ecoute.RunWorkerCompleted
            Dim recup_data As String = e.Result
            traiter_message_recu(recup_data)
        End Sub
     
        Private Sub traiter_message_recu(ByVal data As String)
            Form1.Label1.Text = data
            If boucle = True Then
                Ecoute.RunWorkerAsync(parametre_ecoute)
            End If
        End Sub
    les appel depuis mon form1 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
            Dim liste_carte_réseau As Collection = lister_interface_locale()
            For Each carte_reseau As String In liste_carte_réseau
                listbox_carte_reseau_dispo.Items.Add(carte_reseau)
            Next
            Communication.initialiser_ecoute()
        End Sub
     
        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
            Communication.recevoir_message(10000, "any", 0, False)
            Label1.Text = "En attente de reception"
        End Sub
    en fait mon souci je pense dans mon vieux code est que lorsque je lançais la seconde écoute je réutilisait les lignes d'initialisation du background-worker (Ecoute = New System.ComponentModel.BackgroundWorker) et me génère des bugs

    je tag ce post en résolus mais si quelqu'un connais le bout de code pour virer cet avertissement de la fonction GETMAC je suis prenneur

    Merci d'avance

  3. #3
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 904
    Points : 10 168
    Points
    10 168
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    Citation Envoyé par WisperDarkness Voir le message
    Bonjour

    je tag ce post en résolus mais si quelqu'un connais le bout de code pour virer cet avertissement de la fonction GETMAC je suis prenneur

    Merci d'avance
    Je te laisse le soin de tester:

    http://code.msdn.microsoft.com/VBMACAddress-86df039b
    À ma connaissance, le seul personnage qui a été diagnostiqué comme étant allergique au mot effort. c'est Gaston Lagaffe.

    Ô Saint Excel, Grand Dieu de l'Inutile.

    Excel n'a jamais été, n'est pas et ne sera jamais un SGBD, c'est pour cela que Excel s'appelle Excel et ne s'appelle pas Access junior.

  4. #4
    Membre régulier
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2014
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Août 2014
    Messages : 63
    Points : 123
    Points
    123
    Par défaut
    Bonjour clementmarcotte

    Merci pour ton lien je pense que la solution à mon problème se trouve dedans mais je n'y est pas mis la main dessus encore (je reste encore novice dans l'interprétation du code et y à tellement de fichier à explorer) donc en attendant je vais continuer mon projet avec cet avertissement (car il reste relativement urgent) et le corrigerais à la fin

    Merci encore

    EDIT : solution trouvé :
    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
     
        Declare Function SendARP Lib "iphlpapi.dll" (ByVal DestIP As UInt32, ByVal SrcIP As UInt32, ByVal pMacAddr As Byte(), ByRef PhyAddrLen As Integer) As Integer
     
        Declare Function inet_addr Lib "wsock32.dll" (ByVal s As String) As Integer
     
        Function GETmac(ByVal ip_address As String) As String
            Dim MACAddress As String
            Dim ab(6) As Byte
     
            ip_address = inet_addr(ip_address)
            SendARP(CType(ip_address, Int32), 0, ab, ab.Length)
            MACAddress = Hex(ab(0)).PadLeft(2, "0")
            MACAddress = MACAddress + "-" + Hex(ab(1)).PadLeft(2, "0")
            MACAddress = MACAddress + "-" + Hex(ab(2)).PadLeft(2, "0")
            MACAddress = MACAddress + "-" + Hex(ab(3)).PadLeft(2, "0")
            MACAddress = MACAddress + "-" + Hex(ab(4)).PadLeft(2, "0")
            MACAddress = MACAddress + "-" + Hex(ab(5)).PadLeft(2, "0")
            Return MACAddress
        End Function

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 03/04/2013, 11h40
  2. [Débutant] Console, plusieurs problèmes dans mon programme
    Par Maaarion.m dans le forum C#
    Réponses: 3
    Dernier message: 17/02/2012, 19h24
  3. Problème de programmation avec VB.Net
    Par monster74 dans le forum VB.NET
    Réponses: 3
    Dernier message: 02/09/2010, 12h14
  4. Réponses: 2
    Dernier message: 28/04/2008, 01h11

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