在c#中使用ping

Bla*_*tar 83 c# ping

当我使用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");
}
Run Code Online (Sandbox Code Playgroud)

Jam*_*See 202

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;
}
Run Code Online (Sandbox Code Playgroud)

  • 这是**代码唯一答案**.我想它实现了正确的比较,并展示了如何处理可能的异常.你能指出*为什么*这是与问题中的代码相比正确的代码? (6认同)
  • 不知道有多少人通过复制和粘贴来使用此答案:/至少使用`using(var pinger = new Ping()){..}`并且早期收益是如此邪恶吗? (4认同)
  • @JamieSee 虽然这可能是真的,但使用 `using` 会更简洁,并且在这种情况下是首选。 (4认同)
  • 如果正确使用 try/catch/finally,则用 using 包装 Ping 实例是没有意义的。它是一个或另一个,而不是两者。请参阅 /sf/ask/19523171/。 (3认同)

Ash*_*ada 34

在C#中使用ping是通过使用该方法实现的,该方法Ping.Send(System.Net.IPAddress)对提供的有效IP地址或URL运行ping请求,并获得响应的响应,称为Internet控制消息协议(ICMP)包,其中包含20字节的标头包含来自收到ping请求的ping服务器的响应数据,.Net框架System.Net.NetworkInformation命名空间包含一个名为PingReplyClass的类,该类具有用于转换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 class一个本地变量的实例PingReply,本地变量字符串来存储IP或URL地址,然后我们将PingReply我们创建的局部变量分配给ping 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!!");
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 感谢包括使用参考! (10认同)
  • 肯定的事情@Hille,几年前我快速写了这个答案,我将编辑并添加适当的答案说明. (4认同)