IcmpSendEcho2 - асинхронный вызов не является асинхронным - PullRequest
3 голосов
/ 30 ноября 2011

Я использую IcmpSendEcho2 для отправки эхо-запроса ICMP хосту, который я хотел бы проверить.Однако мне нужно обрабатывать ответ асинхронно в отдельном потоке получателя.

Для этого я создаю новый дескриптор события Windows (CreateEvent) для каждого отправляемого запроса.Получающий поток будет уведомлен и ожидает входящих ответов, используя WaitForMultipleObjects.

. Эта система уведомлений о событиях работает нормально, но я не могу заставить IcmpSendEcho2 быть вызванным асинхронно.В MSDN говорится, что

Функция IcmpSendEcho2 вызывается асинхронно, если указаны параметры ApcRoutine или Event.

Я указываю параметр Event , но вызывающий поток по-прежнему заблокирован до тех пор, пока не будет получен ответ или не пройдет время Timeout .Я ожидал бы, что метод немедленно возвращается, и предоставленное событие получает сигнал, как только приходит ответ или истекло время ожидания.По крайней мере, я понимаю «асинхронный».

Это мой вызов функции, предоставленные параметры действительны:

dwResult = IcmpSendEcho2(
    icmpFileHandle,
    eventHandle,
    NULL, //no apcRoutine   
    NULL, //no apcContext
    ((sockaddr_in*)addrInfo->ai_addr)->sin_addr.S_un.S_addr,
    &requestData,
    sizeof(requestData),
    &requestOptions,
    &icmp4ReplyBuffer,
    sizeof(icmp4ReplyBuffer),
    30000);

Имеет ли MSDN другое понимание «асинхронного», или я что-то не так делаю?

1 Ответ

3 голосов
/ 30 ноября 2011

Согласно официальной документации :

Функция IcmpSendEcho2 отправляет эхо-запрос IPv4 ICMP и возвращает либо сразу (если Event или ApcRoutine не NULL), либо возвращает после указанного времени ожидания. ReplyBuffer содержит эхо ICMP ответы, если таковые имеются.

Ваше понимание асинхронного является правильным, и оно должно немедленно вернуться, если вы передали событие, отличное от NULL.

Если он не работает должным образом, есть 3 варианта:

  1. Ваш eventHandle равен NULL, что означает, что CreateEvent не выполнен и возвращен дескриптор NULL. Вы проверяли?
  2. Вы закрываете дескриптор файла ICMP (IcmpCloseHandle) сразу после асинхронного вызова IcmpSendEcho (, предложенный OP в комментариях ).
  3. Если вы используете приложение брандмауэра, оно может перехватить этот API и непреднамеренно нарушить асинхронное требование.
  4. Возможно, вы нашли ошибку Windows.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...