我正在使用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对“异步”有不同的理解,或者我做错了什么?
答案 0 :(得分:3)
IcmpSendEcho2函数发送IPv4 ICMP echo请求并返回 或者立即(如果Event或ApcRoutine是非NULL)或返回 在指定的超时后。 ReplyBuffer包含ICMP echo 回复,如果有的话。
您对异步的理解是正确的,如果您传递了非NULL事件,它应立即返回。
如果它没有按预期工作,有3种可能性:
eventHandle
为NULL,表示CreateEvent
失败并返回NULL句柄。你检查了吗?IcmpCloseHandle
调用之后关闭ICMP文件句柄(IcmpSendEcho
)(OP在评论中建议)。