-2

ARPパケットを使用してチェックするはずのコードを使用して、ネット上のコンピューターがオンラインかどうかをチェックしようとしています。

オンラインであると確信している場合でも、ホストがオフラインであるというメッセージが常に表示されます。ローカルホストのIPと、Googleなどの常に機能しているIPを確認しました。

それはこのコードで間違っている可能性がありますか?

[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秒ほどかかることです。誰かがARPpingを使用することを提案しました:

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;
    }
}
4

1 に答える 1

1

ARPは、あなたがやろうとしていることに使用することはできません。ローカルネットワーク上でのみ機能します。

目的は、IPアドレス(ルーティングされる)をMACアドレス(ルーティングされない)に解決することです。ネットワークセグメント(LAN)を超えて送信されることはありません

于 2012-01-21T04:37:30.580 に答える