2012-01-21 5 views
-1

Я пытаюсь проверить, находится ли компьютер в сети, используя код, который предположительно проверяет его с помощью ARP-пакетов.Pinging using ARP always return host offline

Я всегда получаю сообщение, что хост отключен, даже если я уверен, что он в сети. Я проверил мой IP-адрес localhost и на некоторых всегда работающих 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 пинг:

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

@ Андрин Парикмахер, я не знаю, просто пытаюсь что-то сделать, что кто-то предложил. Это не путь? – HelpNeeder

ответ

1

ARP не могут быть использованы для того, что вы пытаетесь сделать. Он работает только через локальную сеть.

Целью является разрешение IP-адреса (который маршрутизируется) на MAC-адрес (который не является). Он никогда не отправляется за пределы сегмента сети (a lan)

+0

Возможно, это причина, по которой она не работает. Будет ли он также возвращать false при проверке 127.0.0.1 или localhost IP? – HelpNeeder

 Смежные вопросы

  • Нет связанных вопросов^_^