2011-01-26 214 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