我一直在阅读MSDN documentation for IcmpSendEcho2和它产生的问题比解决的问题多。用法与异步回调
我熟悉其他的Win32 API的异步回调,如ReadFileEx
......我提供我保证会为驾驶者的使用,直到操作比IO_PENDING
以外的任何结果完成预留缓冲,我得到我的回调在成功或失败的情况下(并请致电GetCompletionStatus
找出哪一个)。超时是我的责任,我可以致电CancelIo
中止处理,但缓冲区仍保留,直到驱动程序取消操作并调用状态为CANCELLED
的完成例程。还有一个OVERLAPPED
结构,它通过所有这些来唯一标识请求。
IcmpSendEcho2
不使用OVERLAPPED
上下文结构的异步请求。和文档是
不清楚
过于简约什么了,如果ping时间发生或失败(失败是缺乏网络连接,为当地同龄人失踪ARP表项,从远程对等的介入路由器ICMP目的地不可达响应等)。
有谁知道回调是否发生在超时和/或失败?特别是,如果没有响应,我可以重新使用缓冲区再次拨打IcmpSendEcho2
,或者它会永久保留以防应答迟到吗?
我想从Win32服务中使用这个函数,这意味着我必须得到错误处理的情况下,我不能泄漏缓冲区(或者如果API没有泄漏缓冲区,我必须使用一个帮手程序,所以我有办法放弃请求)。
回调的方式也存在丑陋的不兼容性。看起来第一个参数在两个签名之间是一致的,所以我应该可以使用更新的PIO_APC_ROUTINE
,只要我使用第二个参数,如果操作系统版本检查返回Vista或更新版本?虽然MSDN说“不要做Windows版本检查”,但似乎我需要,因为具有新参数的版本集与iphlpapi.dll中存在函数的版本集不同。
使用此功能和APC的其他文档或工作代码的指针将非常感谢。
请让我知道,如果这完全是错误的方法 - 即如果使用原始套接字或IcmpCreateFile
+ WriteFileEx
+ ReadFileEx
的某种组合会更健壮。
我对使用IcmpSendEcho2Ex调用的事件和回调函数以及超时的体验是,记录的Vista风格的回调可能会被调用,但唯一有效的参数是第一个用于XP风格回调的参数。如果事件尚未解除,那么我也会保留内存,直到超时过期。似乎没有任何_safe_方法来取消请求。更多详细信息,请访问:https://groups.google.com/forum/#!topic/microsoft.public.win32.programmer.networks/Kyi5lKgGdxM – 2014-08-15 04:09:37