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 :

Problème avec ICMP


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 91
    Par défaut Problème avec ICMP
    Bonsoir, je rencontre un problème avec ICMP, ce simple bout de code ne fonctionne pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim s As Socket = New Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.Icmp)
    J'ai l'erreur suivante :

    Une tentative d’accès à un socket de manière interdite par ses autorisations d’accès a été tentée
    errorCode:10013 qui correspond à :
    Permission denied.

    An attempt was made to access a socket in a way forbidden by its access permissions. An example is using a broadcast address for sendto without broadcast permission being set using setsockopt(SO_BROADCAST).

    Another possible reason for the WSAEACCES error is that when the bind function is called (on Windows NT 4.0 with SP4 and later), another application, service, or kernel mode driver is bound to the same address with exclusive access. Such exclusive access is a new feature of Windows NT 4.0 with SP4 and later, and is implemented by using the SO_EXCLUSIVEADDRUSE option.
    Jusqu'ici je ne vois pas comment faire, j'ai essayé d'appeler l'autre constructeur de socket mais il requiert de sérialiser/dé sérialiser une autre socket.

    Je tiens a dire que je ne vois pas quel programme pourrait empêcher mon initialisation, et j'ai aussi écarté tout code en ne mettant ca qu'au démarrage de mon application pour tester.

    Enfin bref, je suis assez embêté, peut être est-ce un autre problème de droit que je connais pas ?

    Tout ceci est pour faire une simple requête ping sur une interface bien précise par contre.

    J'ai d'abord cherché a faire un connect à par exemple google.fr mais on ne peux pas configurer de timeout pour le connect, a moins de faire un BeginConnect, mais ca m'apporte d'autres soucis.

    Need help

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    C'est clairement un problème de droits, comme l'indique le message d'erreur. J'ai testé et j'ai obtenu la même erreur, mais si je lance le programme en tant qu'administrateur, ça passe. La sécurité est un peu plus draconienne depuis Vista, n'importe quel programme n'a pas le droit de balancer des commandes ICMP comme ça...

    Si c'est juste pour faire un ping, tu peux utiliser la classe Ping

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 91
    Par défaut
    Citation Envoyé par tomlev Voir le message
    C'est clairement un problème de droits, comme l'indique le message d'erreur. J'ai testé et j'ai obtenu la même erreur, mais si je lance le programme en tant qu'administrateur, ça passe. La sécurité est un peu plus draconienne depuis Vista, n'importe quel programme n'a pas le droit de balancer des commandes ICMP comme ça...

    Si c'est juste pour faire un ping, tu peux utiliser la classe Ping
    Oui, le problème est que je voudrais faire un ping à partir d'une interface particulière, donc me binder sur une interface voulue, et la classe ping ne permet pas de faire ca

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par anat1212 Voir le message
    Oui, le problème est que je voudrais faire un ping à partir d'une interface particulière, donc me binder sur une interface voulue, et la classe ping ne permet pas de faire ca
    ah ok... dans ce cas j'ai l'impression que tu n'as pas le choix, il va falloir le faire en mode admin

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 91
    Par défaut
    Bon finalement j'ai créé ma propre classe pour me connecter à google voilà mon code :

    Classe Pinger
    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
     
    Imports System.Net.Sockets
    Imports System.Net
     
    Public Class Pinger
        Private _socket As Socket
        Private _Connected As Boolean
        Private _sw As Stopwatch
     
        Public Function ping(ByVal adapter As IPAddress, ByVal timeout As Integer) As Boolean
            _Connected = False
            _socket = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
            _socket.Bind(New IPEndPoint(adapter, 0))
     
            _socket.BeginConnect("google.fr", 80, AddressOf ConnectedCallBack, _socket)
            _sw = New Stopwatch()
            _sw.Start()
            While _sw.ElapsedMilliseconds() < timeout And _sw.IsRunning
                System.Threading.Thread.Sleep(1)
            End While
            Return _Connected
        End Function
     
        Public Sub ConnectedCallBack(ByVal ar As IAsyncResult)
            Try
                Dim s As Socket = CType(ar.AsyncState, Socket)
                s.EndConnect(ar)
                _Connected = True
                s.Close()
            Catch
                _Connected = False
            End Try
            _sw.Stop()
        End Sub
    End Class

    Et la classe qui permet de lister les ipv4 qui ont internet :
    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
    Imports System.Net
    Imports System.Net.Sockets
     
    Public Class AdapterManager
        Dim _adapters() As NetworkInformation.NetworkInterface
     
        Public Sub New()
            _adapters = NetworkInformation.NetworkInterface.GetAllNetworkInterfaces
        End Sub
     
        Public Function GetInterfaces() As List(Of NetworkInformation.NetworkInterface)
            Dim upAdapter As New List(Of NetworkInformation.NetworkInterface)
            For Each adapter As NetworkInformation.NetworkInterface In _adapters
                If (adapter.OperationalStatus = NetworkInformation.OperationalStatus.Up) Then
                    upAdapter.Add(adapter)
                End If
            Next
            Return upAdapter
        End Function
     
        Public Function getIPUp() As List(Of IPAddress)
            Dim IPUp As New List(Of IPAddress)
            For Each adapter As NetworkInformation.NetworkInterface In GetInterfaces()
                For Each adr As NetworkInformation.UnicastIPAddressInformation In adapter.GetIPProperties.UnicastAddresses
                    If (adr.Address.AddressFamily = Sockets.AddressFamily.InterNetwork) Then
                        If checkAvailability(adr.Address) Then
                            IPUp.Add(adr.Address)
                        End If
                    End If
                Next
            Next
            Return IPUp
        End Function
     
        Public Function checkAvailability(ByVal adapter As IPAddress) As Boolean
            Dim pg As New Pinger()
            Return pg.ping(adapter, 300)
        End Function
     
     
    End Class
    et enfin un exemple pour afficher les IP qui ont le net :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
            Dim ad As New AdapterManager()
            Dim s As String = ""
            For Each ip As IPAddress In ad.getIPUp()
                s &= ip.ToString & vbNewLine
            Next
            MsgBox(s)
    Vous allez probablement trouver ce code plutôt sale alors si vous avez des optimisations a me proposer je suis ouvert !

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

Discussions similaires

  1. VC++ Direct3D8, problème avec LPD3DXFONT et LPD3DTEXTURE8
    Par Magus (Dave) dans le forum DirectX
    Réponses: 3
    Dernier message: 03/08/2002, 11h10
  2. Problème avec [b]struct[/b]
    Par Bouziane Abderraouf dans le forum CORBA
    Réponses: 2
    Dernier message: 17/07/2002, 10h25
  3. Problème avec le type 'Corba::Any_out'
    Par Steven dans le forum CORBA
    Réponses: 2
    Dernier message: 14/07/2002, 18h48
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

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