IcmpSendEcho2 - 异步调用不是异步的

时间:2011-11-30 13:06:26

标签: c++ winapi

我正在使用IcmpSendEcho2向我想检查的主机发送ICMP回应请求。但是,我需要在一个单独的接收器线程中异步处理响应。

为了实现这一点,我为每个发出的请求创建了一个新的Windows事件句柄(CreateEvent)。将通知接收线程并使用WaitForMultipleObjects等待传入的回复。

此事件通知系统工作正常,但我不能异步调用IcmpSendEcho2。 MSDN说

  

当指定了ApcRoutine或Event参数时,异步调用IcmpSendEcho2函数。

我确实指定了 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 个答案:

答案 0 :(得分:3)

根据official documentation

  

IcmpSendEcho2函数发送IPv4 ICMP echo请求并返回   或者立即(如果Event或ApcRoutine是非NULL)或返回   在指定的超时后。 ReplyBuffer包含ICMP echo   回复,如果有的话。

您对异步的理解是正确的,如果您传递了非NULL事件,它应立即返回。

如果它没有按预期工作,有3种可能性:

  1. 您的eventHandle为NULL,表示CreateEvent失败并返回NULL句柄。你检查了吗?
  2. 您正在异步IcmpCloseHandle调用之后关闭ICMP文件句柄(IcmpSendEcho)(OP在评论中建议)。
  3. 如果您正在运行防火墙应用程序,它可能会挂起该API并无意中违反了异步要求。
  4. 您可能发现了Windows错误。