【问题标题】:Pinging using ARP always return host offline使用 ARP ping 总是使主机脱机
【发布时间】:2012-02-15 13:26:42
【问题描述】:

我正在尝试使用代码检查网络上的计算机是否在线,该代码应该使用 ARP 数据包进行检查。

即使我确定主机在线,我也总是收到主机离线的消息。我检查了我的本地主机 IP 和一些始终工作的 IP,例如 google。

这段代码可能有问题吗?

[DllImport("iphlpapi.dll", ExactSpelling = true)]
public static extern int SendARP(IPAddress DestIP, int SrcIP, byte[] pMacAddr, ref uint PhyAddrLen);

private byte[] macAddr = new byte[6];
private uint macAddrLen;

private void Ping(IPAddress address)
{
    if (SendARP(address, 0, new byte[6], ref macAddrLen) == 0)
    {
        open++;
        txtDisplay.AppendText("Host " + address + " is open." + Environment.NewLine);
    }
    else
    {
        closed++;
        txtDisplay.AppendText("Host " + address + " is closed." + Environment.NewLine);
    }
}

通过使用以前的代码,我基本上是在尝试执行类似以下代码的操作。但是这段代码的问题是,当主机关闭时,需要大约 2 秒才能获得我想要消除的响应。有人suggested使用ARP ping:

private void Ping(IPAddress address)
{
    Ping pingSender = new Ping();
    PingOptions options = new PingOptions();
    if (cbDontFragment.Checked) options.DontFragment = true;
    else options.DontFragment = false;
    string dataa = string.Empty;
    int dataCounter = 0;
    options.Ttl = (int)nudTTL.Value;

    for (int i = 0; i < nudData.Value; i++)
    {
        dataCounter++;
        if (dataCounter == 10) dataCounter = 0;
        dataa += dataCounter.ToString();
    }

    byte[] buffer = Encoding.ASCII.GetBytes(dataa);
    int timeout = 120;
    try
    {
        PingReply reply = pingSender.Send(address, timeout, buffer, options);

        if (reply.Status == IPStatus.Success)
        {
            open++;
            txtDisplay.AppendText("Host " + address + " is open. ");
            if (cbDontFragment.Checked) txtDisplay.AppendText(" Don't fragment. ");
            txtDisplay.AppendText(" TTL: " + options.Ttl.ToString() + " ");
            txtDisplay.AppendText(" Bytes: " + nudData.Value + " ");
            txtDisplay.AppendText(Environment.NewLine);
        }
        else
        {
            closed++;
            txtDisplay.AppendText("Host " + address + " is closed. ");
            if (cbDontFragment.Checked) txtDisplay.AppendText(" Don't fragment. ");
            txtDisplay.AppendText(" TTL: " + options.Ttl.ToString() + " ");
            txtDisplay.AppendText(" Bytes: " + nudData.Value + " ");
            txtDisplay.AppendText(Environment.NewLine);
        }
    }
    catch (Exception ex)
    {
        txtDisplay.SelectedText += Environment.NewLine + ex.Message;
    }
}

【问题讨论】:

  • 您为什么希望 ARP 能够告诉您远程地址是否处于活动状态???
  • @Andrew Barber,我不知道,只是想解决一些人建议的问题。这不是一条路吗?

标签: c# .net ping arp


【解决方案1】:

ARP 不能用于您正在尝试做的事情。它仅适用于本地网络。

它的目的是将IP地址(路由)解析为MAC地址(不是)。它永远不会超出网段(局域网)

【讨论】:

  • 这可能是它不起作用的原因。检查 127.0.0.1 或 localhost IP 时也会返回 false 吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-23
  • 2014-10-15
  • 1970-01-01
相关资源
最近更新 更多