2012-03-27 41 views
0

我第一次使用$ SUB並遇到此問題。客戶端和服務器都使用重疊操作,這裏是我遇到問題的具體情況。重疊的消息命名管道,ERROR_MORE_DATA和CancelIoEx

客戶端

C1。連接到服務器。 C238。發送大於傳遞給服務器中重疊讀取操作的管道緩衝區和緩衝區的消息。
C3。成功取消發送操作。

服務器

S1。創建並等待客戶。 S S2。當客戶端連接時,它讀取消息。
S21。因爲消息不適合緩衝區(ERROR_MORE_DATA),所以會逐個讀取它。

在我看來,沒有辦法告訴整個消息何時作爲一個孤立的單元取消。特別是,如果客戶端取消發送操作,服務器不會收到整個消息,只是其中的一部分,隨後的讀操作返回ERROR_IO_PENDING(在我的情況下),這意味着沒有要讀取和讀取的數據操作已排隊。我希望能有某種方式告訴讀者,該信息已被取消,以便讀者可以採取行動。

但是,相關文檔散佈在MSDN上,所以我可能會錯過一些東西。我真的很感激,如果任何人都可以點亮它。謝謝。

回答

0

你是對的,沒有辦法告訴。

如果您在中途取消Writefile,則只會寫入部分消息,因此只有該部分將被服務器讀取。沒有「簿記」信息發送消息將在您取消之前有多大 - 發送的只是原始數據。

所以答案是:不要取消IO,只是等待它成功。

如果你需要中途取消IO,你應該切斷連接並重新開始,就像你對網絡中斷一樣。

(你可以檢查你的OVERLAPPED結構,以找出多少實際上是書面的,並從那裏下去,但如果你想這樣做,你可能只是沒有擺在首位取消IO)

你爲什麼要取消IO呢?什麼樣的情況觸發了這個要求?

+0

我的客戶端(管道編寫器)有一個事件循環,除了通過管道發送消息外,它還處理其他內容。這就是爲什麼管道發送是異步的,客戶端不會永遠阻止,以防服務器(讀取器)無法處理消息和緩衝區填充。如果發送操作是異步的,則將重疊的事件句柄添加到WaitForMultibleObjects調用中。 – 2012-03-27 22:30:47

+0

感謝您建議關閉管道。這就是我現在正在做的事情,它適用於我的情況。 – 2012-03-27 22:39:03

+0

@PeterVrabel你見過'MsgWaitForMultipleObject'和'CoWaitForMultipleHandles'嗎?它們允許您喚醒其他消息,例如用戶輸入。這可能會讓您在需要取消IO之前等待更長時間。 – Ben 2012-03-27 22:43:10