2009-07-16 5 views
2

J'ai créé un projet simple WinForms vb.net qui pings adresses IP et enregistre les résultats. Cela fonctionne très bien sur la plupart des machines sur lesquelles j'ai essayé. Je consigner le résultat du ping (System.Net.NetworkInformation.IPStatus) en utilisant la méthode IPStatus.tostring.VB.Net Enum ToString renvoie un nombre inconnu

Normalement, ce renvoie un résultat de texte tel que « succès » ou « TimedOut »

Hier, sur une machine, il est revenu « 65 » ... ce qui ne fait pas partie des valeurs ENUM. J'ai le sentiment que cela pourrait être une combinaison de valeurs. J'ai couru un code de test:

Dim status As System.Net.NetworkInformation.IPStatus 
status = Net.NetworkInformation.IPStatus.Success 
MsgBox(status.ToString) 

qui retourne "succès"

Et ceci:

status = Net.NetworkInformation.IPStatus.BadDestination Or Net.NetworkInformation.IPStatus.BadHeader 
MsgBox(status.ToString) 

qui retourne "11050"

Je soupçonne que je vis "65" était le résultat d'une combinaison de valeurs enum. Est-il possible de changer le code dans mon second exemple pour afficher les noms des deux valeurs? C'est ... de toute façon je peux voir toutes les valeurs dans cette variable?

Répondre

2

IPStatus n'est pas un Flags enum, il n'est donc pas approprié de combiner ses valeurs membres de cette manière. Ceci est la définition par l'intermédiaire du réflecteur:

Public Enum IPStatus 
    ' Fields 
    BadDestination = &H2B0A 
    BadHeader = &H2B22 
    BadOption = &H2AFF 
    BadRoute = &H2B04 
    DestinationHostUnreachable = &H2AFB 
    DestinationNetworkUnreachable = &H2AFA 
    DestinationPortUnreachable = &H2AFD 
    DestinationProhibited = &H2AFC 
    DestinationProtocolUnreachable = &H2AFC 
    DestinationScopeMismatch = &H2B25 
    DestinationUnreachable = &H2B20 
    HardwareError = &H2B00 
    IcmpError = &H2B24 
    NoResources = &H2AFE 
    PacketTooBig = &H2B01 
    ParameterProblem = &H2B07 
    SourceQuench = &H2B08 
    Success = 0 
    TimedOut = &H2B02 
    TimeExceeded = &H2B21 
    TtlExpired = &H2B05 
    TtlReassemblyTimeExceeded = &H2B06 
    Unknown = -1 
    UnrecognizedNextHeader = &H2B23 
End Enum 

Comment vous obtenez une valeur IPStatus de 65 - maintenant c'est le réel question :)

+0

Alors le mystère reste ... Je l'ai fait avec un ping System.Net. NetworkInformation.Ping.Send et System.Net.NetworkInformation.PingReply.ToString ont renvoyé "65" et je n'ai aucune idée pourquoi –

0

Il ressemble à part le succès (0) et inconnus (- 1), les valeurs enum définies vont de 11002 à 11045, donc 65 n'est pas une combinaison d'aucune des valeurs enum définies.

Si vous obtenez 65 retour, vous ne serez pas en mesure de résoudre ce à une chaîne.

0

Cette énumération n'est pas marquée avec FlagsAttribute et ne doit donc pas être associée ou non parce que le résultat peut se chevaucher. Vous feriez mieux de créer votre propre énumération pour contenir les valeurs que vous recherchez.

0

Vous devriez pouvoir parcourir la plage d'enum en utilisant quelque chose comme [1], tester si le bit enum actuel est représenté dans la valeur et l'ajouter à un générateur de chaîne.

Je trouve difficile d'écrire un exemple de travail dans VB.NET dans cette petite zone de texte, mais je suis sûr que quelqu'un d'autre le fera.

[1] http://damieng.com/blog/2008/04/10/using-linq-to-foreach-over-an-enum-in-c

1

Essayez d'utiliser System.Enum pour obtenir le nom de la valeur.

Dans votre exemple, utilisez: MsgBox (System.Enum.GetName (GetType (Net.NetworkInformation.IPStatus), statut))

Questions connexes