Первоначально опубликовано здесь, но не по теме: https://serverfault.com/questions/617459/faster-processing-of-sendarp-function
Я хотел бы получить ответ на этот вопрос.
OC:
Я работал над созданием сетевого сканера для Windows. Я успешно написал код для этого, и он работает нормально. Моя проблема в том, что сканирование компьютеров, которые не работают, занимает слишком много времени. Когда я попытался сканировать подсеть (от 1 до 255), это заняло более получаса! Я искал много вещей в интернете, но не смог найти функцию для контроля лимита времени или способ контроля тайм-аута функции SendARP. Я предоставляю часть кода здесь. Пожалуйста помоги.
DestIp = inet_addr(strn.c_str()); //Setting Destination IPv4 dotted-decimal address into a proper address for the IN_ADDR structure.
SrcIp = inet_addr(SrcIpString);
memset(&MacAddr, 0xff, sizeof(MacAddr)); //Initializing MAC Address to ff-ff-ff-ff-ff-ff
dwRetVal = SendARP(DestIp, SrcIp, &MacAddr, &PhysAddrLen); //Sending ARP request to the destined IP Address
if (dwRetVal == NO_ERROR) {
bPhysAddr = (BYTE *)& MacAddr;
if (PhysAddrLen) {
std::cout << strn<<std::endl;
for (int i = 0; i < (int)PhysAddrLen; i++) {
if (i == ((int)PhysAddrLen - 1))
printf("%.2X\n", (int)bPhysAddr[i]);
else
printf("%.2X-", (int)bPhysAddr[i]);
}
}
}
Вы используете вспомогательную функцию из библиотеки «IP Helper». Это не ориентировано на производительность.
Комментарии ServerFault действительно попали в почту: используйте потоки. С <thread>
это в наше время довольно просто. Просто сделай 255 std::async
вызовы вашей функции. Конечно, убедитесь, что все MacAddr
а также PhysAddrLen
ссылки не являются недействительными.