我一直在阅读IcmpSendEcho2 的 MSDN 文档,它提出的问题多于回答的问题。
我熟悉来自其他 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
会更健壮。