2014-09-19 3 views
0

Я пытаюсь разобрать вывод arp.exe, чтобы получить MAC-адрес для компьютера. Я могу разобрать ping.exe и получить IP-адрес, но по какой-то причине arp.exe, похоже, никогда не выходит. Если я удалю аргументы, я выйду почти мгновенно. Если я запускаю команду самостоятельно в командной строке, она выводит результат менее чем за одну секунду. Я не уверен, почему он не работает.Parsing arp.exe - WaitForExit (60000) отключен

Public Function DNSLookup(ByVal dnsName As String) 

#If Not Debug Then 
    Try 
#End If 
    Dim p As New Process 
    With p.StartInfo 
     .FileName = "ping.exe" 
     .Arguments = "-n 1 -4 " + dnsName 'Send 1 echo/packet (-n 1) and force IPv4 (-4) 
     .CreateNoWindow = True 
     .RedirectStandardOutput = True 
     .RedirectStandardError = True 
     .UseShellExecute = False 
    End With 

    p.Start() 
    If p.WaitForExit(5000) Then 

     'Find and parse "Reply from xxx.xxx.xxx.xxx: bytes=xx time=xms TTL=xxx" 
     Dim result As String = p.StandardOutput.ReadToEnd 'Read the result from the command line 
     Dim i As Integer = result.IndexOf("Reply from ") + 11 '11 is the length of "Reply from " 
     result = result.Substring(i, result.IndexOf(": bytes=") - i) 'Get the IP from the command line output 

     Return result 
    Else 
     Throw New System.Exception("DNS lookup failed. Timeout exceeded") 
    End If 

#If Not Debug Then 
    Catch ex As Exception 
     MsgBox(ex.Message, MsgBoxStyle.Critical) 
    End Try 
#End If 

End Function 

Public Function GetMACAddress(ByVal dnsName As String) 
    Dim ip As String = DNSLookup(dnsName) 

#If Not Debug Then 
    Try 
#End If 
    Dim arp As New Process 
    With arp.StartInfo 
     .FileName = "arp.exe" 
     .Arguments = "-a" ' | find " + Chr(34) + ip + Chr(34) 'Example: arp -a | find "192.168.0.1" 
     .CreateNoWindow = True 
     .RedirectStandardOutput = True 
     .RedirectStandardError = True 
     .RedirectStandardInput = False 
     .UseShellExecute = False 
    End With 

    arp.Start() 
    If arp.WaitForExit(60000) Then 
     MsgBox(arp.StandardOutput.ReadToEnd) 
    Else 
     Throw New System.Exception("ARP lookup failed. Timeout exceeded") 

    End If 

    Return 1 '### TO DO: Return parsed MAC address 

#If Not Debug Then 
    Catch ex As Exception 
     MsgBox(ex.Message, MsgBoxStyle.Critical) 
    End Try 
#End If 

End Function 

ответ

0

Я не уверен, почему это не работало с аргументами, которые были установлены только на «-а» прошлой ночью, когда я запускал его этим утром, что сработало. Однако я понял, что причина, по которой мой полный аргумент не работает, заключается в том, что «| find» не является аргументом, признанным arp.exe. Чтобы решить эту проблему, я использовал cmd.exe/c arp. Обновленный код ниже работает:

Public Function GetMACAddress(ByVal dnsName As String) 
    Dim ip As String = DNSLookup(dnsName) 

#If Not Debug Then 
    Try 
#End If 
    Dim arp As New Process 
    With arp.StartInfo 
     .FileName = "cmd.exe" 
     .Arguments = "/c arp -a | find " + Chr(34) + ip + Chr(34) 'Example: arp -a | find "192.168.0.1" 
     .CreateNoWindow = False 
     .RedirectStandardOutput = True 
     .RedirectStandardError = True 
     .RedirectStandardInput = False 
     .UseShellExecute = False 
    End With 

    arp.Start() 
    If arp.WaitForExit(5000) Then 
     MsgBox(arp.StandardOutput.ReadToEnd) 
    Else 
     Throw New System.Exception("ARP lookup failed. Timeout exceeded") 
    End If 

    Return 1 '### TO DO: Return parsed IP address 

#If Not Debug Then 
    Catch ex As Exception 
     MsgBox(ex.Message, MsgBoxStyle.Critical) 
    End Try 
#End If 

End Function 
+0

um .... в вашем первом примере «найти» -комментацию прокомментировал ... вот почему он не работал. Вы даже можете увидеть, что SO окрашивает его в серый цвет, что сразу бросается в глаза ... – specializt

+0

Я прокомментировал это, чтобы выяснить, не вызывает ли это проблемы. Но по какой-то неизвестной причине он все еще не работал, когда просто использовал -a и ничего больше. Однако на следующее утро, когда я снова запустил его, не внося никаких изменений (все еще используя только -а), он работал ... Я не понимаю, почему это произошло: S поместив часть «| find», а затем сразу же сломал ее снова. Использование cmd/c отлично работает с аргументом «| find». – Daniel

+0

Лучше всего называть WINAPI-функции для таких задач, используя команды командной строки и параметры передачи, которые всегда дают неожиданные результаты, а не просто как разрабатывать программное обеспечение в окнах, которое работает только на linux – specializt

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