我试图获取WiFi环境(整个子网)中存在的所有设备的Mac地址。
最初当我运行代码大约花了10分钟来获得整个子网的结果所以为了减少我在windows机器中使用多线程概念的时间,但这种方法根本不起作用。
我正在粘贴下面的代码段。 即使我尝试了不同的逻辑,例如一次运行255,100,50,2个线程但仍然失败。
我怀疑这是同步问题,但我不知道要解决这个问题,所以请帮我完成这项工作。
DWORD WINAPI GetMacAddrOfSubNet(LPVOID lpParam)
{
DWORD dwRetVal;
IPAddr DestIp = 0;
IPAddr SrcIp = 0; /* default for src ip */
ULONG MacAddr[2]; /* for 6-byte hardware addresses */
ULONG PhysAddrLen = 6; /* default to length of six bytes */
char look[100];
strcpy(look ,(char *)lpParam);
DestIp = inet_addr(look);
memset(&MacAddr, 0xff, sizeof (MacAddr));
/*Pinging particular ip and retrning mac addrs if response is thr*/
dwRetVal = SendARP(DestIp, SrcIp, &MacAddr, &PhysAddrLen);
if (dwRetVal == NO_ERROR)
{
/**/
}
return 0;
}
extern "C" __declspec(dllexport) int __cdecl PopulateARPTable(char *IpSubNetMask)
{
char ipn[100];
char buffer[10];
unsigned int k;
DWORD dwThreadIdArray[260];
HANDLE hThreadArray[260];
/*Run 255 threads at once*/
for (k=1; k<255; k++)
{
itoa(k, buffer, 10);
strcpy(ipn, IpSubNetMask);
strcat(ipn, ".");
strcat(ipn, buffer);
/*Thread creation */
hThreadArray[k] = CreateThread( NULL, 0, GetMacAddrOfSubNet, ipn, 0, &dwThreadIdArray[k]);
if (hThreadArray[k] == NULL)
{
//ExitProcess(3);
}
}
WaitForMultipleObjects(255, hThreadArray, TRUE, INFINITE);
return 0;
}
答案 0 :(得分:1)
ipn
缓冲区仅存在一次。您正在使用并修改它作为(最多)255个线程的参数。并且您希望线程中的语句strcpy(look ,(char *)lpParam)
将在之前执行,主线程再次修改ipn
以调用下一个线程。但事实并非如此,至少不能保证。所以你的线程可能使用错误的参数。
为每个线程使用不同的缓冲区,或实现同步,以确保在主线程再次修改缓冲区之前线程已复制参数。