Есть ли способ изменить поведение синхронного Windows API SendARP?

Я пишу сканер локальной сети в Windows, чтобы найти онлайн-хосты с функциями IP Helper, что эквивалентно nmap -PR но без WinPcap. я знаю SendARP будет блокировать и отправлять запрос arp 3 раза, если удаленный хост не отвечает, поэтому я использую std::aync создать по одному потоку для каждого хоста, но проблема в том, что я хочу отправлять ARP-запрос каждые 20 мс, чтобы не было слишком много arp-пакетов за очень короткое время.

#include <iostream>
#include <future>
#include <vector>

#include <winsock2.h>
#include <iphlpapi.h>#pragma comment(lib, "iphlpapi.lib")
#pragma comment(lib, "ws2_32.lib")

using namespace std;

int main(int argc, char **argv)
{
ULONG MacAddr[2];       /* for 6-byte hardware addresses */
ULONG PhysAddrLen = 6;  /* default to length of six bytes */
memset(&MacAddr, 0xff, sizeof (MacAddr));
PhysAddrLen = 6;

IPAddr SrcIp = 0;
IPAddr DestIp = 0;

char buf[64] = {0};

size_t start = time(NULL);

std::vector<std::future<DWORD> > vResults;

for (auto i = 1; i< 255; i++)
{
sprintf(buf, "192.168.1.%d", i);
DestIp = inet_addr(buf);
vResults.push_back(std::async(std::launch::async, std::ref(SendARP), DestIp, SrcIp, MacAddr, &PhysAddrLen));
Sleep(20);
}

for (auto it= vResults.begin(); it != vResults.end(); ++it)
{
if (it->get() == NO_ERROR)
{
std::cout<<"host up\n";
}
}

std::cout<<"time elapsed "<<(time(NULL) - start)<<std::endl;

return 0;
}

Сначала я могу сделать это, позвонив Sleep(20) после запуска потока, но один раз SendARP в этих потоках повторно отправлять запросы ARP, если нет ответов от удаленного хоста, это вне моего контроля, и я вижу много запросов в очень короткое время (<10ms) в Wireshark, поэтому мой вопрос:

  1. Любой способ сделать SendARP асинхронный?
  2. если нет, могу ли я контролировать время отправки SendARP в темах?

8

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]