我的ARP ping有问题。
首先我ping扫描以找到网络上的IP。然后我进行ARP查找以查找MAC(并使用数据库查找供应商)和主机名(如果设备有任何)。然后我将它全部添加到foreach循环中的Device类,并将其显示在我的GUI中。
这是我的foreach循环的一部分
if (SendARP(intAddress, 0, macAddr, ref macAddrLen) == 0) // ARP Success!
{
DoAlotOfStuff(IP,macAddr); // Adds Info to Device class
}
上述代码不起作用。如果我添加一个Threaded睡眠它也不起作用,但如果我添加一个
System.Windows.Forms.MessageBox.Show("");
在DoAlotOfStuff()之前,我必须按下消息框上的“确定”按钮,但循环工作,设备成功添加并在GUI中显示。
现在该怎么办?我认为Timers可能是一个选择,但我不确定如何使用它们。由于暂停GUI,因此螺纹睡眠不起作用。
SendARP是Pinvoke
[DllImport("iphlpapi.dll", ExactSpelling=true)]
public static extern int SendARP(
int DestIP, int SrcIP, byte[] pMacAddr, ref uint PhyAddrLen);
DoAlotOfStuff函数只使用Device类Setters来设置IP,MAC,VENDOR和Hostname等选项
Dns.GetHostEntry(IP).HostName;
编辑:我的整个循环:
foreach (Device d in Devices)
{
IPAddress Destination = IPAddress.Parse(d.GetIP());
byte[] macAddr = new byte[6];
uint macAddrLen = (uint)macAddr.Length;
int intAddress = BitConverter.ToInt32(Destination.GetAddressBytes(), 0);
if (SendARP(intAddress, 0, macAddr, ref macAddrLen) == 0)
{
d.SetMAC(MacFormat(ByteArrayToString(macAddr)));
d.SetVendor(CheckVendorList(d.GetIP(), ByteArrayToString(macAddr)));
d.SetName(FindName(d.GetIP()));
ADD_TO_LISTVIEW(d.GetAll());
}
}