我一直在閱讀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