Utilisation de ping en c #


88

Quand je cingle un système distant avec Windows, il dit qu'il n'y a pas de réponse, mais quand je cingne avec c #, cela indique le succès. Windows est correct, l'appareil n'est pas connecté. Pourquoi mon code est-il capable d'envoyer un ping avec succès alors que Windows ne l'est pas?

Voici mon code:

Ping p1 = new Ping();
PingReply PR = p1.Send("192.168.2.18");
// check when the ping is not success
while (!PR.Status.ToString().Equals("Success"))
{
    Console.WriteLine(PR.Status.ToString());
    PR = p1.Send("192.168.2.18");
}
// check after the ping is n success
while (PR.Status.ToString().Equals("Success"))
{
    Console.WriteLine(PR.Status.ToString());
    PR = p1.Send("192.168.2.18");
}

4
Consultez l'exemple suivant publié au bas de cette page lorsque vous cliquez sur le lien MSDN msdn.microsoft.com/en-us/library/… ou stackoverflow.com/questions/1281176/…
MethodMan

8
Vous devriez comparer PR.Status à IPStatus.Success. La comparaison de chaînes n'est pas l'outil approprié dans ce cas.
Sam Axe

Après avoir effectué votre ping, quelles sont les valeurs de certaines propriétés PingReply, (comme PR.Address, PR.RoundtripTime, PR.reply.Buffer.Lengthet PR.Options.Ttl)? Êtes-vous également sûr d'avoir la bonne adresse IP dans votre code, et non une adresse IP de test?
Jon Senchyna

Jon Senchyna: Je ne les définis pas et oui je suis sûr que mon adresse IP est correcte.
Black Star

Dans mon cas, si l'option "activer le processus d'hébergement de Visual Studio" (l'emplacement est == >> projet-> propriété-> débogage) est désactivée, la méthode ping peut ne pas fonctionner. s'il vous plaît essayez!
steve

Réponses:


216
using System.Net.NetworkInformation;    

public static bool PingHost(string nameOrAddress)
{
    bool pingable = false;
    Ping pinger = null;

    try
    {
        pinger = new Ping();
        PingReply reply = pinger.Send(nameOrAddress);
        pingable = reply.Status == IPStatus.Success;
    }
    catch (PingException)
    {
        // Discard PingExceptions and return false;
    }
    finally
    {
        if (pinger != null)
        {
            pinger.Dispose();
        }
    }

    return pingable;
}

1
@JamieSee vous avez oublié ";" à la fin de la ligne.
Sharpowski

8
Ceci est une réponse de code uniquement . Je suppose que cela implémente une comparaison correcte et montre comment gérer les exceptions possibles. Pouvez-vous indiquer pourquoi c'est le code correct par rapport au code de la question?
Maarten Bodewes

7
Je ne sais pas combien de personnes ont utilisé cette réponse par copier-coller: / Faites au moins un using (var pinger = new Ping()) { .. }et les premiers retours sont-ils si mauvais?
Peter Schneider

2
Il est inutile d'encapsuler l'instance Ping avec une utilisation si try / catch / finally est utilisé correctement. C'est l'un ou l'autre pas les deux. Voir stackoverflow.com/questions/278902/… .
JamieVoir le

3
@JamieSee Bien que cela puisse être vrai, il est plus propre à utiliser à la usingplace, et il est préférable dans ce cas.
Kelly Elton

40

L'utilisation de ping en C # est obtenue à l'aide de la méthode Ping.Send(System.Net.IPAddress), qui exécute une requête ping à l'adresse IP ou à l'URL fournie (valide) et obtient une réponse appelée paquet ICMP (Internet Control Message Protocol) . Le paquet contient un en-tête de 20 octets qui contient les données de réponse du serveur qui a reçu la requête ping. L' System.Net.NetworkInformationespace de noms .Net Framework contient une classe appelée PingReplyqui a des propriétés conçues pour traduire la ICMPréponse et fournir des informations utiles sur le serveur ping, telles que:

  • IPStatus : obtient l'adresse de l'hôte qui envoie la réponse d'écho ICMP (Internet Control Message Protocol).
  • IPAddress : obtient le nombre de millisecondes nécessaires pour envoyer une demande d'écho ICMP (Internet Control Message Protocol) et recevoir le message de réponse d'écho ICMP correspondant.
  • RoundtripTime (System.Int64) : obtient les options utilisées pour transmettre la réponse à une demande d'écho ICMP (Internet Control Message Protocol).
  • PingOptions (System.Byte []) : Obtient la mémoire tampon des données reçues dans un message de réponse d'écho ICMP (Internet Control Message Protocol).

Voici un exemple simple d'utilisation WinFormspour illustrer le fonctionnement de ping dans c #. En fournissant une adresse IP valide textBox1et en cliquant button1, nous créons une instance de la Pingclasse, une variable locale PingReplyet une chaîne pour stocker l'adresse IP ou URL. Nous attribuons PingReplyà la Sendméthode ping , puis nous inspectons si la requête a abouti en comparant l'état de la réponse à l' IPAddress.Successétat de la propriété . Enfin, nous extrayons PingReplyles informations que nous devons afficher pour l'utilisateur, qui sont décrites ci-dessus.

    using System;
    using System.Net.NetworkInformation;
    using System.Windows.Forms;

    namespace PingTest1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }

            private void button1_Click(object sender, EventArgs e)
            {
                Ping p = new Ping();
                PingReply r;
                string s;
                s = textBox1.Text;
                r = p.Send(s);

                if (r.Status == IPStatus.Success)
                {
                    lblResult.Text = "Ping to " + s.ToString() + "[" + r.Address.ToString() + "]" + " Successful"
                       + " Response delay = " + r.RoundtripTime.ToString() + " ms" + "\n";
                }
            }

            private void textBox1_Validated(object sender, EventArgs e)
            {
                if (string.IsNullOrWhiteSpace(textBox1.Text) || textBox1.Text == "")
                {
                    MessageBox.Show("Please use valid IP or web address!!");
                }
            }
        }
    }

10
Félicitations pour avoir inclus la référence d'utilisation!
mattpm

1
Ne pouvez-vous pas simplement écrire quelques lignes et expliquer votre code? Couse ce n'est pas utile pour les personnes qui veulent comprendre ce bout de code ...
Hille

4
Bien sûr @Hille, j'ai écrit cette réponse rapidement il y a quelques années, je vais éditer et ajouter une description appropriée de la réponse.
Ashraf Abusada

2

Importe System.Net.NetworkInformation

Fonction publique PingHost (ByVal nameOrAddress As String) As Boolean Dim pingable As Boolean = False Dim pinger As Ping Dim lPingReply As PingReply

    Try
        pinger = New Ping()
        lPingReply = pinger.Send(nameOrAddress)
        MessageBox.Show(lPingReply.Status)
        If lPingReply.Status = IPStatus.Success Then

            pingable = True
        Else
            pingable = False
        End If


    Catch PingException As Exception
        pingable = False
    End Try
    Return pingable
End Function

-9
private void button26_Click(object sender, EventArgs e)
{
    System.Diagnostics.ProcessStartInfo proc = new System.Diagnostics.ProcessStartInfo();
    proc.FileName = @"C:\windows\system32\cmd.exe";
    proc.Arguments = "/c ping -t " + tx1.Text + " ";
    System.Diagnostics.Process.Start(proc);
    tx1.Focus();
}

private void button27_Click(object sender, EventArgs e)
{
    System.Diagnostics.ProcessStartInfo proc = new System.Diagnostics.ProcessStartInfo();
    proc.FileName = @"C:\windows\system32\cmd.exe";
    proc.Arguments = "/c ping  " + tx2.Text + " ";
    System.Diagnostics.Process.Start(proc);
    tx2.Focus();
}

3
Ne pouvez-vous pas simplement écrire quelques lignes et expliquer votre code? Couse ce n'est pas utile pour les personnes qui veulent comprendre ce bout de code ...
Hille
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.