Menggunakan ping di c #


91

Ketika saya melakukan Ping sistem jarak jauh dengan windows dikatakan tidak ada balasan, tetapi ketika saya ping dengan c # dikatakan berhasil. Windows benar, perangkat tidak terhubung. Mengapa kode saya berhasil melakukan ping ketika Windows tidak?

Ini kode saya:

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
Lihat contoh berikut yang diposting di bagian bawah halaman ini ketika Anda mengklik MSDN Link msdn.microsoft.com/en-us/library/… atau stackoverflow.com/questions/1281176/…
MethodMan

9
Anda harus membandingkan PR.Status dengan IPStatus.Success. Perbandingan string bukanlah alat yang tepat dalam kasus ini.
Sam Axe

Setelah Anda melakukan ping Anda, apa nilai dari beberapa properti PingReply, (seperti PR.Address, PR.RoundtripTime, PR.reply.Buffer.Length, dan PR.Options.Ttl)? Apakah Anda juga yakin memiliki alamat IP yang benar dalam kode Anda, dan bukan alamat IP uji?
Jon Senchyna

Jon Senchyna: Saya tidak mengaturnya dan ya saya yakin IP saya benar.
Black Star

Dalam kasus saya, jika "aktifkan proses hosting studio visual" (lokasi == >> proyek-> properti-> debug) dinonaktifkan, metode ping mungkin tidak berfungsi. silahkan coba!
steve

Jawaban:


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
@JamieLihat Anda lupa tentang ";" di akhir baris.
Sharpowski

10
Ini adalah jawaban hanya kode . Saya rasa ini mengimplementasikan perbandingan yang benar dan menunjukkan bagaimana menangani kemungkinan pengecualian. Bisakah Anda menunjukkan mengapa ini adalah kode yang benar dibandingkan dengan kode dalam pertanyaan?
Maarten Bodewes

8
Tidak tahu berapa banyak orang yang telah menggunakan jawaban ini dengan salin dan tempel: / Lakukan setidaknya using (var pinger = new Ping()) { .. }dan apakah pengembalian awal begitu jahat?
Peter Schneider

2
Tidak ada gunanya membungkus instance Ping dengan menggunakan jika coba / tangkap / akhirnya digunakan dengan benar. Itu satu atau yang lain, bukan keduanya. Lihat stackoverflow.com/questions/278902/… .
Jamie Lihat

3
@JamieSee Meskipun itu mungkin benar, ini lebih bersih untuk digunakan using, dan lebih disukai dalam kasus ini.
Kelly Elton

43

Menggunakan ping di C # dicapai dengan menggunakan metode Ping.Send(System.Net.IPAddress), yang menjalankan permintaan ping ke alamat IP atau URL yang disediakan (valid) dan mendapat respons yang disebut Paket Internet Control Message Protocol (ICMP) . Paket berisi header 20 byte yang berisi data respon dari server yang menerima permintaan ping. System.Net.NetworkInformationNamespace .Net framework berisi kelas yang disebut PingReplyyang memiliki properti yang dirancang untuk menerjemahkan ICMPrespons dan memberikan informasi berguna tentang server yang di-ping seperti:

  • IPStatus : Mendapatkan alamat host yang mengirim balasan gema Internet Control Message Protocol (ICMP).
  • Alamat IP : Mendapatkan jumlah milidetik yang diperlukan untuk mengirim permintaan gema Internet Control Message Protocol (ICMP) dan menerima pesan balasan gema ICMP yang sesuai.
  • RoundtripTime (System.Int64) : Mendapat opsi yang digunakan untuk mengirimkan balasan ke permintaan gema Internet Control Message Protocol (ICMP).
  • PingOptions (System.Byte []) : Mendapat buffer data yang diterima dalam pesan balasan gema Internet Control Message Protocol (ICMP).

Berikut ini adalah contoh sederhana yang digunakan WinFormsuntuk mendemonstrasikan bagaimana ping bekerja di c #. Dengan memberikan alamat IP yang valid di textBox1dan mengklik button1, kami membuat instance Pingkelas, variabel lokal PingReply, dan string untuk menyimpan alamat IP atau URL. Kami menetapkan PingReplyke Sendmetode ping , lalu kami memeriksa apakah permintaan berhasil dengan membandingkan status balasan dengan IPAddress.Successstatus properti . Akhirnya, kami mengekstrak dari PingReplyinformasi yang kami butuhkan untuk ditampilkan untuk pengguna, yang dijelaskan di atas.

    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
Kudos untuk memasukkan referensi penggunaan!
mattpm

1
Tidak bisakah Anda menulis beberapa baris dan menjelaskan kode Anda? Karena ini tidak berguna bagi orang yang ingin memahami bagian kode ini ...
Hille

4
Tentu @Hille, saya menulis jawaban ini dengan cepat beberapa tahun yang lalu, saya akan mengedit dan menambahkan deskripsi jawaban yang sesuai.
Ashraf Abusada

3

Impor System.Net.NetworkInformation

Fungsi Publik 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

-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
Tidak bisakah Anda menulis beberapa baris dan menjelaskan kode Anda? Karena ini tidak berguna bagi orang yang ingin memahami bagian kode ini ...
Hille

Kode yang awalnya disajikan tidak KERING sama sekali .
greybeard
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.