具有多线程功能的sendarp不适用于整个子网(wifi环境)

时间:2015-11-26 13:21:09

标签: c windows multithreading

我试图获取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;

}

1 个答案:

答案 0 :(得分:1)

ipn缓冲区仅存在一次。您正在使用并修改它作为(最多)255个线程的参数。并且您希望线程中的语句strcpy(look ,(char *)lpParam)将在之前执行,主线程再次修改ipn以调用下一个线程。但事实并非如此,至少不能保证。所以你的线程可能使用错误的参数。

为每个线程使用不同的缓冲区,或实现同步,以确保在主线程再次修改缓冲区之前线程已复制参数。