ใช้ ping ใน c #


91

เมื่อฉัน Ping ระบบระยะไกลกับ windows มันบอกว่าไม่มีการตอบกลับ แต่เมื่อฉัน ping กับ c # มันบอกว่าสำเร็จ Windows ถูกต้องอุปกรณ์ไม่ได้เชื่อมต่อ เหตุใดรหัสของฉันจึงสามารถ ping ได้สำเร็จเมื่อ Windows ไม่ใช่

นี่คือรหัสของฉัน:

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 Link msdn.microsoft.com/en-us/library/… หรือ stackoverflow.com/questions/1281176/…
MethodMan

9
คุณควรเปรียบเทียบ PR.Status กับ IPStatus.Success การเปรียบเทียบสตริงไม่ใช่เครื่องมือที่ถูกต้องในกรณีนี้
Sam Axe

หลังจากที่คุณทำการ ping ของคุณสิ่งที่มีค่าของบางส่วนของคุณสมบัติ PingReply ที่ (เช่นPR.Address, PR.RoundtripTime, PR.reply.Buffer.LengthและPR.Options.Ttl)? คุณแน่ใจหรือไม่ว่าคุณมีที่อยู่ IP ที่ถูกต้องในรหัสของคุณไม่ใช่ที่อยู่ IP ทดสอบ
Jon Senchyna

Jon Senchyna: ฉันไม่ได้ตั้งค่าและใช่ฉันแน่ใจว่า IP ของฉันถูกต้อง
Black Star

ในกรณีของฉันถ้า "เปิดใช้งานกระบวนการโฮสต์ Visual Studio" (ตำแหน่งคือ == >> project-> property-> debug) ปิดใช้งานวิธีการ ping อาจไม่ทำงาน โปรดลอง!
สตีฟ

คำตอบ:


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
@Jamie เห็นคุณลืม ";" ที่ท้ายบรรทัด
Sharpowski

10
นี้เป็นรหัสคำตอบเดียว ฉันเดาว่ามันใช้การเปรียบเทียบที่ถูกต้องและแสดงวิธีจัดการกับข้อยกเว้นที่เป็นไปได้ คุณช่วยระบุได้หรือไม่ว่าเหตุใดจึงเป็นรหัสที่ถูกต้องเมื่อเทียบกับรหัสในคำถาม
Maarten Bodewes

8
ไม่ทราบว่ามีกี่คนที่ใช้คำตอบนี้โดย copy and paste: / ทำอย่างน้อย a using (var pinger = new Ping()) { .. }และผลตอบแทนก่อนกำหนดชั่วร้ายหรือ
Peter Schneider

2
ไม่มีจุดใดในการตัดอินสแตนซ์ Ping ด้วยการใช้ if try / catch / ในที่สุดก็ใช้อย่างถูกต้อง เป็นอย่างใดอย่างหนึ่งไม่ใช่ทั้งสองอย่าง ดูstackoverflow.com/questions/278902/...
JamieSee

3
@JamieSee แม้ว่าจะเป็นจริง แต่ก็ใช้usingแทนได้ดีกว่าและเป็นที่ต้องการในกรณีนี้
Kelly Elton

43

การใช้ปิงใน C # จะทำได้โดยการใช้วิธีการPing.Send(System.Net.IPAddress)ซึ่งไหลคำขอ ping ไปยังที่อยู่ที่ให้ไว้ (ที่ถูกต้อง) IP หรือ URL และได้รับการตอบสนองที่ถูกเรียกว่าการควบคุมอินเทอร์เน็ต Message Protocol (ICMP) แพ็คเก็ต แพ็คเก็ตมีส่วนหัว 20 ไบต์ซึ่งมีข้อมูลการตอบกลับจากเซิร์ฟเวอร์ที่ได้รับคำขอ ping System.Net.NetworkInformationเนมสเปซ. Net framework มีคลาสที่เรียกPingReplyว่ามีคุณสมบัติที่ออกแบบมาเพื่อแปลการICMPตอบสนองและส่งมอบข้อมูลที่เป็นประโยชน์เกี่ยวกับเซิร์ฟเวอร์ pinged เช่น:

  • IPStatus : รับที่อยู่ของโฮสต์ที่ส่งการตอบกลับด้วยเสียงสะท้อนของ Internet Control Message Protocol (ICMP)
  • IPAddress : รับจำนวนมิลลิวินาทีที่ใช้ในการส่งคำขอสะท้อนข้อความ Internet Control Message Protocol (ICMP) และรับข้อความตอบกลับ ICMP echo ที่เกี่ยวข้อง
  • RoundtripTime (System.Int64) : รับตัวเลือกที่ใช้ในการส่งการตอบกลับไปยังคำขอสะท้อนข้อความ Internet Control Message Protocol (ICMP)
  • PingOptions ( System Byte []) : รับบัฟเฟอร์ของข้อมูลที่ได้รับในข้อความตอบกลับแบบสะท้อนของ Internet Control Message Protocol (ICMP)

ต่อไปนี้เป็นตัวอย่างง่ายๆที่ใช้WinFormsเพื่อสาธิตการทำงานของ ping ใน c # ด้วยการระบุที่อยู่ IP ที่ถูกต้องtextBox1และคลิกbutton1เรากำลังสร้างอินสแตนซ์ของPingคลาสตัวแปรโลคัลPingReplyและสตริงเพื่อจัดเก็บที่อยู่ IP หรือ URL เรากำหนดวิธีการPingReplyping Sendจากนั้นเราจะตรวจสอบว่าคำขอประสบความสำเร็จหรือไม่โดยเปรียบเทียบสถานะของการตอบกลับกับIPAddress.Successสถานะคุณสมบัติ สุดท้ายเราดึงPingReplyข้อมูลจากข้อมูลที่จำเป็นสำหรับผู้ใช้ซึ่งได้อธิบายไว้ข้างต้น

    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
ความรุ่งโรจน์สำหรับการใช้อ้างอิง!
mattpm

1
คุณเขียนไม่กี่บรรทัดและอธิบายโค้ดของคุณได้หรือไม่? Couse สิ่งนี้ไม่มีประโยชน์สำหรับผู้ที่ต้องการทำความเข้าใจรหัสนี้ ...
Hille

4
แน่นอน @Hille ฉันเขียนคำตอบนี้อย่างรวดเร็วเมื่อสองสามปีก่อนฉันจะแก้ไขและเพิ่มคำอธิบายที่เหมาะสมของคำตอบ
Ashraf Abusada

3

นำเข้า System.Net.NetworkInformation

ฟังก์ชันสาธารณะ PingHost (ByVal nameOrAddress As String) เป็น Boolean Dim pingable เป็น Boolean = False Dim pinger เป็น Ping Dim lPing ตอบกลับเป็น 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
คุณเขียนไม่กี่บรรทัดและอธิบายโค้ดของคุณได้หรือไม่? Couse สิ่งนี้ไม่มีประโยชน์สำหรับผู้ที่ต้องการทำความเข้าใจรหัสนี้ ...
Hille

รหัสเดิมที่นำเสนอไม่แห้งเลย
greybeard
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.