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

C 具有多线程功能的sendarp不适用于整个子网(wifi环境),c,windows,multithreading,C,Windows,Multithreading,我试图获取WiFi环境(整个子网)中所有设备的Mac地址 最初,当我运行代码时,大约需要10分钟才能得到整个子网的结果,因此为了减少时间,我在windows机器中使用了多线程概念,但这种方法根本不起作用 我正在粘贴下面的代码片段。 即使我尝试了不同的逻辑,比如一次运行255、100、50、2个线程,但还是失败了 我怀疑这其中存在同步问题,但我不知道如何解决这个问题,所以请帮助我完成这项工作 DWORD WINAPI GetMacAddrOfSubNet(LPVOID lpParam) {

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

}
DWORD WINAPI GetMacAddrOfSubNet(LPVOID lpParam)
{
德沃德·德雷特瓦尔;
IPAddr DestIp=0;
IPAddr SrcIp=0;/*src ip的默认值*/
ULONG MacAddr[2];/*用于6字节硬件地址*/
ULONG PhysAddrLen=6;/*默认长度为六个字节*/
字符外观[100];
strcpy(look,(char*)lpParam);
DestIp=inet_addr(外观);
memset(&MacAddr,0xff,sizeof(MacAddr));
/*ping特定ip并在响应为thr时重新调用mac地址*/
dwRetVal=SendARP(DestIp、SrcIp、MacAddr和PhysAddrLen);
if(dwRetVal==无错误)
{
/**/ 
} 
返回0;
}
外部“C”\uuuu declspec(dllexport)int\uuuu cdecl populateartable(char*IpSubNetMask)
{
char-ipn[100];
字符缓冲区[10];
无符号整数k;
德沃德·德瓦里[260];
句柄hThreadArray[260];
/*一次运行255个线程*/

对于(k=1;k而言,
ipn
缓冲区只存在一次。您正在使用并修改它作为(最多)255个线程的参数。并且您希望语句
strcpy(look,(char*)lpParam)
在主线程再次修改
ipn
以调用下一个线程之前,将执行线程中的。但情况并非如此,至少不能保证。因此,线程可能使用了错误的参数


为每个线程使用不同的缓冲区,或者实现同步,在主线程重新修改缓冲区之前确保线程已经复制了参数。< / P>请不要标记垃圾邮件,这不是C++,我已经在前面进行了,并且为YouHi修正了您的标记,谢谢您的快速响应,我为每个T使用了不同的缓冲区。但是这一次只有很少的响应返回(预期的结果是diff)。我确实找到了不同的方法来实现相同的结果,所以再次感谢您的努力