在C#中使用ping


88

当我使用Windows Ping一个远程系统时,它说没有答复,但是当我使用C#Ping时,它说成功。Windows正确,设备未连接。为什么我的代码无法在Windows上成功ping?

这是我的代码:

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


8
您应该将PR.Status与IPStatus.Success进行比较。在这种情况下,字符串比较不是正确的工具。
山姆Ax

你执行你的平之后,什么是一些PingReply属性的值,(例如PR.AddressPR.RoundtripTimePR.reply.Buffer.Length,和PR.Options.Ttl)?您还确定代码中具有正确的IP地址,而不是测试IP地址吗?
乔恩·森奇纳

乔恩•森奇纳(Jon Senchyna):我没有设置它们,是的,我确定我的IP地址是正确的。
Black Star'8

在我的情况下,如果禁用“启用Visual Studio托管过程”(位置== >>>> project-> property-> debug),则ping方法可能不起作用。请尝试!
史蒂夫

Answers:


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
@Jamie看到您忘记了“;” 在行尾。
Sharpowski

8
这是仅代码答案。我猜它实现了正确的比较并显示了如何处理可能的异常。你说明为什么这是正确的代码,在这个问题的代码进行比较?
Maarten Bodewes,

7
不知道有多少人通过复制和粘贴来使用此答案:/至少ausing (var pinger = new Ping()) { .. }和早期收益是如此邪恶吗?
彼得·施耐德

2
如果try / catch / finally的使用正确,则用use包装Ping实例是没有意义的。是一个或另一个,而不是两者兼而有之。参见stackoverflow.com/questions/278902/…
JamieSee'2

3
@JamieSee虽然这可能是正确的,但使用它更干净using,在这种情况下,它是首选。
凯利·艾尔顿

40

在C#中使用ping是通过使用方法实现的,该方法Ping.Send(System.Net.IPAddress)对提供的(有效)IP地址或URL运行ping请求并获得响应,该响应称为Internet控制消息协议(ICMP)数据包。该数据包包含一个20字节的标头,其中包含来自接收到ping请求的服务器的响应数据。.Net框架System.Net.NetworkInformation名称空间包含一个名为的类PingReply,该类具有旨在转换ICMP响应并提供有关ping服务器的有用信息的属性,例如:

  • IPStatus:获取发送Internet控制消息协议(ICMP)回显答复的主机的地址。
  • IPAddress:获取发送Internet控制消息协议(ICMP)回显请求和接收相应的ICMP回显应答消息所花费的毫秒数。
  • RoundtripTime (System.Int64):获取用于将答复传输到Internet控制消息协议(ICMP)回显请求的选项。
  • PingOptions (System.Byte []):获取Internet控制消息协议(ICMP)回显答复消息中接收到的数据的缓冲区。

以下是一个简单的示例,WinForms用于演示ping在c#中的工作方式。通过在中提供有效的IP地址textBox1并单击button1,我们可以创建Ping该类的实例,局部变量PingReply和用于存储IP或URL地址的字符串。我们指定PingReplypingSend方法,然后通过将回复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
您不能只写几行并解释您的代码吗?因为这对于想了解这段代码的人没有用……
Hille

4
好的,@ Hille,几年前我迅速写了这个答案,我将编辑并添加正确的答案描述。
Ashraf Abusada

2

导入System.Net.NetworkInformation

公共函数PingHost(ByVal名称或地址为字符串)为布尔型Dim pingable为布尔型= False Dim pinger为Ping Dim lPingReply为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
您不能只写几行并解释您的代码吗?因为这对于想了解这段代码的人没有用……
Hille
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.