2012-01-21 8 views
-1

ARPパケットを使用して確認するコードを使用して、ネット上のコンピュータがオンラインであるかどうかを確認しようとしています。ARPを使用したPingは常にホストをオフラインに戻します

私はいつもオンラインであると確信しても、ホストがオフラインであるというメッセージを受け取ります。私は自分のlocalhost 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秒かかるということです。 ARPピングを使用するために誰かsuggested

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; 
    } 
} 
+0

なぜリモートアドレスがアクティブであるかをARPが伝えることができると思いますか? –

+0

@Andrew Barber、私は分かりません、ただ何かを提案して何かを試してみようとしています。これは行く方法ではありませんか? – HelpNeeder

答えて

1

ARP は何をしようとするために使用することはできません。ローカルネットワーク上でのみ動作します。

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

+0

これが原因で動作しない可能性があります。また、127.0.0.1またはlocalhost IPをチェックするときにfalseを返しますか? – HelpNeeder

関連する問題