2011-01-26 156 views
-2

我一直在阅读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的某种组合会更健壮。

回答

1

我用IcmpSendEcho2与事件,而不是一个回调,但我认为流动是在两种情况下是相同的。 IcmpSendEcho2内部使用NtDeviceIoControlFile。它在早期检测到一些与ICMP相关的错误,并将它们作为12xx范围内的错误代码返回。如果(且仅当)IcmpSendEcho2回报ERROR_IO_PENDING,它最终将调用回调和/或设置的事件,无论平是否成功,失败或超时。您传入的任何缓冲区都必须保留至此,但可以在之后重新使用。

至于版本检查,你可以在一个很小的成本使用事件与RegisterWaitForSingleObject,而不是一个APC回调避免它。

+0

我对使用IcmpSendEcho2Ex调用的事件和回调函数以及超时的体验是,记录的Vista风格的回调可能会被调用,但唯一有效的参数是第一个用于XP风格回调的参数。如果事件尚未解除,那么我也会保留内存,直到超时过期。似乎没有任何_safe_方法来取消请求。更多详细信息,请访问:https://groups.google.com/forum/#!topic/microsoft.public.win32.programmer.networks/Kyi5lKgGdxM – 2014-08-15 04:09:37