C # 'da ping kullanma


91

Windows ile uzaktaki bir sisteme Ping attığımda yanıt yok diyor, ancak c # ile ping attığımda başarı diyor. Windows doğru, cihaz bağlı değil. Windows olmadığında kodum neden başarılı bir şekilde ping atabiliyor?

İşte kodum:

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");
}

5
MSDN Bağlantısına tıkladığınızda bu sayfanın altında yayınlanan aşağıdaki örneğe bakın msdn.microsoft.com/en-us/library/… veya stackoverflow.com/questions/1281176/…
MethodMan

9
PR.Status'u IPStatus.Success ile karşılaştırmalısınız. Bu durumda dize karşılaştırması doğru bir araç değildir.
Sam Axe

Eğer ping gerçekleştirdikten sonra, PingReply bazı özelliklerini değerleri nelerdir (gibi PR.Address, PR.RoundtripTime, PR.reply.Buffer.Lengthve PR.Options.Ttl)? Ayrıca, kodunuzda bir test IP adresi değil, doğru IP adresi bulunduğundan emin misiniz?
Jon Senchyna

Jon Senchyna: Onları ayarlamıyorum ve evet eminim IP'm doğru.
Black Star

Benim durumumda, "görsel stüdyo barındırma işlemini etkinleştir" (konum == >> proje-> özellik-> hata ayıklama) devre dışı bırakılırsa, ping yöntemi çalışmayabilir. deneyin lütfen!
steve

Yanıtlar:


222
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
@JamieGördüğünüzde unuttuğunuz ";" satırın sonunda.
Sharpowski

10
Bu yalnızca kodlu bir cevaptır . Sanırım doğru bir karşılaştırma yapıyor ve olası istisnaların nasıl ele alınacağını gösteriyor. Sorudaki kodla karşılaştırıldığında bunun neden doğru kod olduğunu belirtebilir misiniz ?
Maarten Bodewes

8
Kaç kişinin bu yanıtı kopyalayıp yapıştırarak kullandığını bilmiyorum: / En azından a yapın using (var pinger = new Ping()) { .. }ve erken dönüşler bu kadar kötü mü?
Peter Schneider

2
Eğer dene / yakala / nihayet doğru bir şekilde kullanılırsa Ping örneğini bir kullanarak sarmamanın bir anlamı yoktur. Biri ya da diğeri ikisi de değil. Stackoverflow.com/questions/278902/… sayfasına bakın .
19'a

3
@JamieSee Bu doğru olsa da, bunun usingyerine kullanılması daha temizdir ve bu durumda tercih edilir.
Kelly Elton

43

C # içinde Ping.Send(System.Net.IPAddress)ping kullanımı, sağlanan (geçerli) IP adresine veya URL'ye bir ping isteği çalıştıran ve İnternet Kontrol Mesajı Protokolü (ICMP) Paketi olarak adlandırılan bir yanıt alan yöntem kullanılarak elde edilir . Paket, ping talebini alan sunucudan gelen yanıt verilerini içeren 20 baytlık bir başlık içerir. .Net çerçevesi System.Net.NetworkInformationad alanı PingReply, ICMPyanıtı çevirmek ve pinglenmiş sunucu hakkında aşağıdaki gibi yararlı bilgiler sunmak için tasarlanmış özelliklere sahip bir sınıf içerir :

  • IPStatus : İnternet Kontrol Mesajı Protokolü (ICMP) yankı cevabını gönderen ana bilgisayarın adresini alır.
  • IP adresi : Bir İnternet Kontrol Mesajı Protokolü (ICMP) yankı isteği göndermek ve karşılık gelen ICMP yankı yanıt mesajını almak için geçen milisaniye sayısını alır.
  • RoundtripTime (System.Int64) : Yanıtı bir İnternet Kontrol Mesajı Protokolü (ICMP) yankı isteğine iletmek için kullanılan seçenekleri alır.
  • PingOptions (System.Byte []) : Bir İnternet Kontrol Mesajı Protokolü (ICMP) yankı yanıtı mesajında ​​alınan veri tamponunu alır.

Aşağıdaki, WinFormsping'in c # ile nasıl çalıştığını göstermek için kullanılan basit bir örnektir . Geçerli bir IP adresi textBox1girip tıklayarak button1, Pingsınıfın bir örneğini, yerel bir değişkeni PingReplyve IP veya URL adresini saklamak için bir dize oluşturuyoruz. PingReplyPing Sendyöntemine atama yapıyoruz, ardından yanıtın IPAddress.Successdurumunu mülk durumu ile karşılaştırarak isteğin başarılı olup olmadığını inceliyoruz . Son olarak, PingReplyyukarıda açıklanan, kullanıcı için göstermemiz gereken bilgilerden çıkarıyoruz.

    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
Kullanım referansını dahil ettiğiniz için teşekkür ederiz!
mattpm

1
Birkaç satır yazıp kodunuzu açıklayamaz mısınız? Bunun, bu kod parçasını anlamak isteyenler için yararlı olmadığını düşünün ...
Hille

4
Elbette @Hille, bu cevabı birkaç yıl önce hızlı bir şekilde yazdım, cevabın uygun açıklamasını düzenleyip ekleyeceğim.
Ashraf Abusada

3

System.Net.NetworkInformation dosyasını içe aktarır

Genel İşlev PingHost (ByVal nameOrAddress As String) 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

-8
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
Birkaç satır yazıp kodunuzu açıklayamaz mısınız? Bunun, bu kod parçasını anlamak isteyenler için yararlı olmadığını düşünün ...
Hille

Başlangıçta sunulan kod hiç KURU değil .
greybeard
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.