IcmpSendEcho2 -异步调用不是异步的
IcmpSendEcho2 - Asynchronous invocation is not asynchronous
我正在使用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是否对"异步"有不同的理解,还是我做错了什么?
根据官方文件:
IcmpSendEcho2函数发送IPv4 ICMP echo请求并返回要么立即(如果Event或ApcRoutine是非null),要么返回在指定的超时时间之后。ReplyBuffer包含ICMP回显信息响应,如果有的话。
你对异步的理解是正确的,如果你传递一个非null事件,它应该立即返回。
如果没有按预期工作,有三种可能:
- 您的
eventHandle
为NULL,意味着CreateEvent
失败并返回NULL句柄。你查过了吗? - 在异步
IcmpSendEcho
调用(OP在中建议的)之后关闭ICMP文件句柄(IcmpCloseHandle
)。 - 如果你正在运行一个防火墙应用程序,它可能会钩住API,无意中破坏异步需求。
- 你可能发现了一个Windows错误。
相关文章:
- 如何在 c++ 中异步调用静态方法?
- 在 NodeJS 异步调用C++ DLL
- Qt异步调用:如何在异步调用完成任务后运行一些东西
- 重构后,异步调用方法不再有效
- 通过谷歌测试测试异步调用
- 如何使用从Swift代码中调用的线程在C 上制作异步调用功能
- 如何从 dart 对用 C/C++ 编写的函数进行异步调用
- 异步调用槽,而不使用清晰的代码行连接到它
- 修复此标准::异步调用
- V8 JavaScript 如何进行异步调用
- 进行异步调用 - 我必须创建自己的p/s吗?
- C++异步调用最佳实践
- 处理多个std::异步调用
- JNI:C++是否异步调用Java
- 使用 Emscripten 异步调用 JavaScript C++函数
- 如何在 Kernal32.dll 中异步调用 ReadFile()?C#.
- 使用JNI异步调用Java方法
- C++:如何异步调用同步库调用
- 对ReadFile函数的异步调用返回6个错误代码
- 在c++中异步调用CreateFile和ReadFile