Sử dụng ping trong c #


88

Khi tôi Ping một hệ thống từ xa có cửa sổ, nó thông báo không có phản hồi, nhưng khi tôi ping bằng c # thì nó báo thành công. Windows là chính xác, thiết bị không được kết nối. Tại sao mã của tôi có thể ping thành công trong khi Windows thì không?

Đây là mã của tôi:

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
Kiểm tra ví dụ sau được đăng ở cuối trang này khi bạn nhấp vào Liên kết MSDN msdn.microsoft.com/en-us/library/… hoặc stackoverflow.com/questions/1281176/…
MethodMan

8
Bạn nên so sánh PR.Status với IPStatus.Success. So sánh chuỗi không phải là công cụ chính xác trong trường hợp này.
Sam Axe

Sau khi bạn thực hiện ping của bạn, các giá trị của một số thuộc tính PingReply là gì, (như PR.Address, PR.RoundtripTime, PR.reply.Buffer.Length, và PR.Options.Ttl)? Ngoài ra, bạn có chắc chắn rằng bạn có địa chỉ IP chính xác trong mã của mình và không phải là địa chỉ IP thử nghiệm không?
Jon Senchyna

Jon Senchyna: Tôi không đặt chúng và vâng, tôi chắc chắn rằng IP của tôi là chính xác.
Black Star

Trong trường hợp của tôi, nếu "kích hoạt quá trình lưu trữ studio trực quan" (vị trí là == >> dự án-> thuộc tính-> gỡ lỗi) bị vô hiệu hóa, phương pháp ping có thể không hoạt động. Vui lòng thử!
steve

Câu trả lời:


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
@JamieXem bạn đã quên ";" ở cuối dòng.
Sharpowski

8
Đây là một câu trả lời chỉ có mã . Tôi đoán nó thực hiện một so sánh chính xác và chỉ ra cách xử lý các trường hợp ngoại lệ. Bạn có thể cho biết tại sao đây là mã chính xác so với mã trong câu hỏi?
Maarten Bodewes

7
Không biết có bao nhiêu người đã sử dụng câu trả lời này bằng cách sao chép và dán: / Ít nhất là một using (var pinger = new Ping()) { .. }và trở lại sớm như vậy ác?
Peter Schneider,

2
Không có ích gì khi gói cá thể Ping bằng việc sử dụng nếu try / catch / last được sử dụng đúng cách. Đó là một hoặc khác không phải cả hai. Xem stackoverflow.com/questions/278902/… .
JamieSee

3
@JamieSee Mặc dù điều đó có thể đúng nhưng usingthay vào đó, nó sạch hơn để sử dụng và được ưu tiên trong trường hợp này.
Kelly Elton

40

Việc sử dụng ping trong C # đạt được bằng cách sử dụng phương thức Ping.Send(System.Net.IPAddress)chạy yêu cầu ping đến địa chỉ IP hoặc URL được cung cấp (hợp lệ) và nhận được phản hồi được gọi là Gói giao thức thông báo điều khiển Internet (ICMP) . Gói tin chứa một tiêu đề 20 byte chứa dữ liệu phản hồi từ máy chủ đã nhận được yêu cầu ping. Không System.Net.NetworkInformationgian tên .Net framework chứa một lớp được gọi PingReplycó các thuộc tính được thiết kế để dịch ICMPphản hồi và cung cấp thông tin hữu ích về máy chủ pinged như:

  • IPStatus : Lấy địa chỉ của máy chủ sẽ gửi phản hồi tiếng vọng Giao thức thông báo điều khiển Internet (ICMP).
  • IPAddress : Lấy số mili giây được thực hiện để gửi yêu cầu phản hồi Giao thức thông báo điều khiển Internet (ICMP) và nhận thông báo phản hồi ICMP tương ứng.
  • RoundtripTime (System.Int64) : Nhận các tùy chọn được sử dụng để truyền trả lời cho yêu cầu lặp lại Giao thức bản tin điều khiển Internet (ICMP).
  • PingOptions (System.Byte []) : Nhận bộ đệm dữ liệu nhận được trong tin nhắn trả lời vọng lại Giao thức thông báo điều khiển Internet (ICMP).

Sau đây là một ví dụ đơn giản sử dụng WinFormsđể chứng minh cách hoạt động của ping trong c #. Bằng cách cung cấp địa chỉ IP hợp lệ trong textBox1và nhấp chuột button1, chúng tôi đang tạo một phiên bản của Pinglớp, một biến cục bộ PingReplyvà một chuỗi để lưu trữ địa chỉ IP hoặc URL. Chúng tôi gán PingReplycho Sendphương thức ping , sau đó chúng tôi kiểm tra xem yêu cầu có thành công hay không bằng cách so sánh trạng thái của câu trả lời với IPAddress.Successtrạng thái thuộc tính . Cuối cùng, chúng tôi trích xuất từ PingReplythông tin chúng tôi cần để hiển thị cho người dùng, được mô tả ở trên.

    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
Kudo cho việc sử dụng tham chiếu!
mattpm

1
Bạn không thể chỉ viết một vài dòng và giải thích mã của bạn? Bởi vì điều này không hữu ích cho những người muốn hiểu đoạn mã này ...
Hille

4
Chắc chắn rồi @Hille, tôi đã viết câu trả lời này nhanh chóng vài năm trước, tôi sẽ chỉnh sửa và thêm mô tả phù hợp cho câu trả lời.
Ashraf Abusada

2

Imports System.Net.NetworkInformation

Chức năng công cộng 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
Bạn không thể chỉ viết một vài dòng và giải thích mã của bạn? Bởi vì điều này không hữu ích cho những người muốn hiểu đoạn mã này ...
Hille
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.