簡體   English   中英

IcmpSendEcho2 與異步回調的使用

[英]Usage of IcmpSendEcho2 with an asynchronous callback

我一直在閱讀IcmpSendEcho2MSDN 文檔,它提出的問題多於答案。

我熟悉來自其他 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某種組合會更健壯。

我將IcmpSendEcho2與事件一起使用,而不是回調,但我認為這兩種情況的流程是相同的。 IcmpSendEcho2 NtDeviceIoControlFile內部使用NtDeviceIoControlFile 它會盡早檢測到一些與 ICMP 相關的錯誤,並將它們作為 12xx 范圍內的錯誤代碼返回。 如果(且僅當) IcmpSendEcho2返回ERROR_IO_PENDING ,它將最終調用回調和/或設置事件,無論ping 成功、失敗還是超時。 在此之前,您傳入的任何緩沖區都必須保留,但之后可以重復使用。

至於版本檢查,您可以通過使用帶有RegisterWaitForSingleObject的事件而不是 APC 回調來以很小的代價避免它。

您應該使用某些功能將線程置於可警告狀態。 例如:

SleepEx(1, true);

然后您將收到所有在該點排隊的回調=)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM