Я искал использование IcmpSendEcho
и обнаружил, что он не сможет выполнить проверку некоторых устройств (например, моего домашнего концентратора BT 4) с сообщением GetLastError
11010. Хотя для других устройств он работает нормально (когда выполняются в одной и той же системе). Для сравнения, ping.exe
преуспевает на всех этих устройствах, но я не знаю, как отличается реализация Ping
. Все случаи, которые я пробовал до сих пор, были IPv4, которые я предоставил напрямую (так что DNS и т. Д.).IcmpSendEcho завершается с ошибкой, но «ping» завершается успешно
hIcmpFile = IcmpCreateFile();
ipAddress = inet_addr(ipAddressStr);
...hIcmpFile is reused
static const WORD sendSize = 32;
static const DWORD replySize = sizeof(ICMP_ECHO_REPLY) + sendSize;
char sendData[sendSize] = { 0 };
char replyBuffer[replySize];
auto ret = IcmpSendEcho(hIcmpFile, ipAddress, sendData, sendSize, NULL, replyBuffer, replySize, 1000);
if (ret == 0)
{
auto error = GetLastError();
Единственный другой отчет, который я нашел, - what would cause ICMPsendEcho to fail when ping.exe succeeds. Однако эти ответы отличаются от моей проблемы. Я попытался использовать разные размеры полезной нагрузки, и я попробовал IcmpSendEcho2
, что также не удалось для тех же устройств.
Ваш код выглядит в значительной степени идентичным примеру, опубликованному на странице MSDN функции. Пробовали ли вы использовать инструмент захвата сети, чтобы проверить, действительно ли пакеты покидают хост? –
11010 - 'IP_REQ_TIMED_OUT'. –
Да, и ping.exe последовательно меньше 2 мс на моем локальном маршрутизаторе lan ... Я попытаюсь сравнить их в Wireshark. –