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 :

Réception d'un paquet en UDP


Sujet :

VB.NET

  1. #1
    Membre à l'essai
    Homme Profil pro
    Retraité
    Inscrit en
    août 2008
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : août 2008
    Messages : 25
    Points : 17
    Points
    17
    Par défaut Réception d'un paquet en UDP
    Bonjour à chacun et chacune !
    Je continue ma migration vers VB.NET 2010 Express, après de logues années en VB6.

    J'ai développé et utilise une application en VB6, tournant sur un serveur dédié. Cette application répond à des commandes reçues de PC clients, en UDP. Cela fonctionne très bien. Par exemple, la commande "INTLISTEUSERS" envoie la liste des users (!). Je veux intégrer cela dans une nouvelle application client en VB.NET et me livre depuis plusieurs jours à des essais soldés par des échecs, au moyen d'exemples trouvés sur le net.
    Voici mon dernier essai :
    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
     
    Imports System.Net
    Imports System.Net.Sockets
    Imports System.Text
     
    Public Class Form1
        Public UDPCli As UdpClient
        Public UDPSer As UdpClient
        Public Start As Boolean = False
     
        ' Démarre le serveur
        Private Sub ButDemarrer_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButDemarrer.Click
            Start = True
            ButDemarrer.Enabled = False
            ButArreter.Enabled = True
            Dim th As New Threading.Thread(AddressOf Serveur) : th.Start()
        End Sub
     
        ' Arrêt du serveur (du thread)
        Private Sub ButArreter_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButArreter.Click
            Start = False
        End Sub
     
        ' Serveur sur un nouveau Thread
        Public Sub Serveur()
            While Start = True
                Try
                    UDPSer = New UdpClient(1550) ' Bind sur le port 1550
                    UDPSer.Client.ReceiveTimeout = 1000
                    Dim recu As Byte() = UDPSer.Receive(New IPEndPoint(IPAddress.Parse("127.0.0.1"), 1550)) ' Attente d'un message sur le port 1550
                    MsgBox(Encoding.UTF8.GetString(recu))
                Catch ex As Exception
                    MsgBox(ex.ToString)
     
                End Try
     
                UDPSer.Close()
            End While
     
            Me.Invoke(Sub() ButDemarrer.Enabled = True)
            Me.Invoke(Sub() ButArreter.Enabled = False)
        End Sub
     
        Private Sub ButEnvoyer_Click(sender As System.Object, e As System.EventArgs) Handles ButEnvoyer.Click
            UDPCli = New UdpClient()
            UDPCli.Connect(New IPEndPoint(IPAddress.Parse("91.121.xxx.xxx"), 1500)) ' IP masquée pour le forum
            Dim send As Byte() = Encoding.UTF8.GetBytes("INTLISTEUSERS")
            UDPCli.Send(send, send.Length)
            UDPCli.Close()
        End Sub
    End Class
    Mon serveur reçoit en port 1500 et répond en 1550.
    Lorsque je lance j'obtiens une exception :
    Nom : 2021-04-01 10_23_07-WindowsApplication2.jpg
Affichages : 84
Taille : 87,8 Ko

    Une âme charitable pourrait-elle m'expliquer comment corriger cela, ou me donner un exemple qui fonctionne ?
    Merci beaucoup !

    Eric

  2. #2
    Membre habitué
    Homme Profil pro
    Inscrit en
    mars 2011
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations forums :
    Inscription : mars 2011
    Messages : 102
    Points : 149
    Points
    149
    Par défaut
    Bonjour,

    Je suis loin d'être une flèche en réseau mais j'ai écrit un programme qui reçoit des infos et des images par UDP.
    J'utilise ça comme routine d'écoute (j'ai mis ton N° de port):

    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
    Private Sub EcouterReseau()
            'Création d'un Socket qui servira de serveur.
            Dim _ecouteur As UdpClient = Nothing
            Dim erreur As Boolean = False
            Dim attempts As Integer = 0
     
     
            Dim por As Integer = 1550
            Do
                Try
                    _ecouteur = New UdpClient(por)
                Catch
                    erreur = True
                    attempts += 1
                    Thread.Sleep(400)
                End Try
            Loop While erreur AndAlso attempts < 4
     
            'Si c'est vraiment impossible de se lier, on informe et on quitte le thread.
     
            If _ecouteur Is Nothing Then
                Invoke(affiche_logD, "Il est impossible de se lier au port " & por.ToString & ". Vérifiez votre configuration réseau.", False, 0, 0)
                _continuer = False
                Return
            End If
     
            _ecouteur.Client.ReceiveTimeout = 1000
     
            'Boucle infinie d'écoute du réseau.
     
            While _continuer
                Try
                    Dim ip As IPEndPoint = Nothing
                    Dim data As Byte() = _ecouteur.Receive(ip)
     
                    ' traitement data
                    '
     
                Catch ex As SocketException
                    If ex.ErrorCode <> 10060 Then
                        Invoke(affiche_logD, ex.ToString, False, 0, 0)
                    End If
                Catch ex2 As Exception
                    Invoke(affiche_logD, ex2.ToString, False, 0, 0)
                End Try
            End While
     
            _ecouteur.Close()
        End Sub

  3. #3
    Membre à l'essai
    Homme Profil pro
    Retraité
    Inscrit en
    août 2008
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : août 2008
    Messages : 25
    Points : 17
    Points
    17
    Par défaut
    Merci Baloub,

    ton code à l'air beaucoup simple, je vais m'empresser de l'essayer !

    Je te tiendrai au courant !

    Merci, bon week-end pascal. (même si tu ne t'appelles pas Pascal )
    Eric

  4. #4
    Membre à l'essai
    Homme Profil pro
    Retraité
    Inscrit en
    août 2008
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : août 2008
    Messages : 25
    Points : 17
    Points
    17
    Par défaut
    Bonjour Baloub,

    ca ne fonctionne pas, mais ne lève pas d’exception, c'est déjà çà !
    J'ai du modifier :
    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
     
      Dim _ecouteur As UdpClient = Nothing
            Dim erreur As Boolean = False
            Dim attempts As Integer = 0
            Dim _continuer As Boolean = True
            Dim por As Integer = 1550
            Dim ip As IPEndPoint = Nothing
     
            Do
                Try
                    _ecouteur = New UdpClient(por)
                    _ecouteur.Client.Bind(New IPEndPoint(IPAddress.Any, por))
                Catch
                    erreur = True
                    attempts += 1
                    Thread.Sleep(400)
                End Try
            Loop While erreur AndAlso attempts < 4
    bind
    en ajoutant la déclaration du boolean _continuer à true
    ensuite , voyant que ça ne fonctionnait pas j'ai ajouté un
    _ecouteur.Client.Bind(New IPEndPoint(IPAddress.Any, por))
    et j'ai mis le port à 1550 qui est celui d'envoi du serveur.

    mais rien de nouveau.
    Je continue mes recherches !
    Bon week-end

  5. #5
    Membre habitué
    Homme Profil pro
    Inscrit en
    mars 2011
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations forums :
    Inscription : mars 2011
    Messages : 102
    Points : 149
    Points
    149
    Par défaut
    Salut,

    Bizarre, j'ai essayé en adaptant ton exemple:
    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
     
    Imports System.Net
    Imports System.Net.Sockets
    Imports System.Text
     
    Public Class Form1
        Public UDPCli As UdpClient
        Public _continuer As Boolean = False
     
        ' Démarre le serveur
        Private Sub ButDemarrer_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButDemarrer.Click
            ' Start = True
            ButDemarrer.Enabled = False
            ButArreter.Enabled = True
            Dim th As New Threading.Thread(AddressOf Serveur) : th.Start()
        End Sub
     
        ' Arrêt du serveur (du thread)
        Private Sub ButArreter_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButArreter.Click
            _continuer = False
        End Sub
     
        ' Serveur sur un nouveau Thread
        Public Sub Serveur()
            Dim _ecouteur As UdpClient = Nothing
            Dim erreur As Boolean = False
            Dim attempts As Integer = 0
     
            _continuer = True
            Dim por As Integer = 1550
            Do
                Try
                    _ecouteur = New UdpClient(por)
                Catch
                    erreur = True
                    attempts += 1
                    Threading.Thread.Sleep(400)
                End Try
            Loop While erreur AndAlso attempts < 4
     
            'Si c'est vraiment impossible de se lier, on informe et on quitte le thread.
     
            If _ecouteur IsNot Nothing Then
                _ecouteur.Client.ReceiveTimeout = 1000
     
                'Boucle infinie d'écoute du réseau.
     
                While _continuer
                    Try
                        Dim ip As IPEndPoint = Nothing
                        Dim data As Byte() = _ecouteur.Receive(ip)
                        MsgBox(Encoding.UTF8.GetString(data))
                    Catch ex As SocketException
                        If ex.ErrorCode <> 10060 Then
                            MsgBox(ex.ToString)
                        End If
                    Catch ex2 As Exception
                        MsgBox(ex2.ToString)
                    End Try
                End While
            End If
     
            _ecouteur.Close()
            Me.Invoke(Sub() ButDemarrer.Enabled = True)
            Me.Invoke(Sub() ButArreter.Enabled = False)
        End Sub
     
        Private Sub ButEnvoyer_Click(sender As System.Object, e As System.EventArgs) Handles ButEnvoyer.Click
            UDPCli = New UdpClient()
            UDPCli.Connect(New IPEndPoint(IPAddress.Parse("127.0.0.1"), 1550))
            Dim send As Byte() = Encoding.UTF8.GetBytes("INTLISTEUSERS")
            UDPCli.Send(send, send.Length)
            UDPCli.Close()
        End Sub
    End Class
    Ca fonctionne bien.
    Tu n'aurais pas un problème de blocage par le pare-feu ?

  6. #6
    Membre à l'essai
    Homme Profil pro
    Retraité
    Inscrit en
    août 2008
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : août 2008
    Messages : 25
    Points : 17
    Points
    17
    Par défaut
    Bonjour Baloub,

    non le pare-feu ne pose pas de problème, mais j'ai fini par trouver un autre code mais il suppose que je modifie le NAT de ma box pour rediriger le port concerné sur mon PC. Comme mon programme est destiné à être utilisé par des personnes pourlesquelles cette opération peut poser problème, j'ai fini par décider de passer en TCP, beaucoup plus sûr car mode connecté et plus de pertes de paquets. J'ai rajouté une couche serveur TCP à mon serveur distant, ça fonctionne.
    J'ai trouvé un très bon source de client-serveur TCP en VB.NET. Il se lance bien la première fois mais ensuite me sort l'erreur suivante :

    Erreur 1 Deux noms de fichier de sortie ont été résolus vers le même chemin de sortie*: "obj\x86\Debug\Com_TCP_Client_Serveur.Form2.resources" Com TCP Client-Serveur

    J'ai beau chercher, je ne trouve pas comment réparer cela ? Je précise que j'utilise VB 2010 express.

    Aurais-tu une idée, ou un autre lecteur de ce post ?
    Merci beaucoup en tous cas pour ton aide sur mon UDP !

    Bon lundi de Pâques.
    Eric

  7. #7
    Membre à l'essai
    Homme Profil pro
    Retraité
    Inscrit en
    août 2008
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : août 2008
    Messages : 25
    Points : 17
    Points
    17
    Par défaut
    Je m'aperçois que je pose une autre question, d'un autre ordre, je copie donc cette demande dans un autre post.
    Merci !

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

Discussions similaires

  1. Ordre d'arrivée des paquets en UDP /SOCKET
    Par leoleo34 dans le forum Réseau
    Réponses: 13
    Dernier message: 23/05/2020, 17h30
  2. Réponses: 2
    Dernier message: 07/11/2015, 16h14
  3. Récupération de paquets sortants (UDP)
    Par ATXATX dans le forum C#
    Réponses: 0
    Dernier message: 28/06/2010, 21h54
  4. Programme permettant de créer ses propres paquets TCP/UDP
    Par mat087 dans le forum Développement
    Réponses: 6
    Dernier message: 21/05/2004, 21h42
  5. [UDP][Socket] perte de paquets et arret d'ecoute sur port
    Par Guismo1979 dans le forum Développement
    Réponses: 6
    Dernier message: 02/01/2003, 12h13

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