gpt4 book ai didi

c++ - IcmpSendEcho2 - 异步调用不是异步的

转载 作者:太空狗 更新时间:2023-10-29 21:27:52 25 4
gpt4 key购买 nike

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

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

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

The IcmpSendEcho2 function is called asynchronously when either the ApcRoutine or Event parameters are specified.

我确实指定了 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对“异步”的理解不同,还是我哪里做错了?

最佳答案

根据official documentation :

The IcmpSendEcho2 function sends an IPv4 ICMP echo request and returns either immediately (if Event or ApcRoutine is non-NULL) or returns after the specified time-out. The ReplyBuffer contains the ICMP echo responses, if any.

你对异步的理解是正确的,传递一个非NULL事件应该会立即返回。

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

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

关于c++ - IcmpSendEcho2 - 异步调用不是异步的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8326426/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com