[英]WriteFile succeeded even when buffer is overwritten for pending operation
在我的程序(發布到此問題中 )中,我在客戶端進行了以下更改:
wretry:
cbToWrite = _stprintf(chBuf[0], TEXT("Message %d from Client"), retrycount - numberofsend + 1);
cbToWrite *= sizeof(TCHAR);
fSuccess = WriteFile(hPipe, chBuf[0], cbToWrite,
&cbWritten, &woverlapped[retrycount-numberofsend]);
這樣,現在每次將使用相同的緩沖區進行寫入。
在這種情況下, WriteFile
每次都將掛起,因為它返回ERROR_IO_PENDING
。 由於緩沖區的內容每次都會被覆蓋,因此服務器應收到寫入緩沖區的最后一條消息。 但是服務器正在接收消息,沒有任何問題。
這是否意味着該消息首先被復制到某個內部緩沖區中? 我可以銷毀緩沖區並期望消息將傳遞到服務器嗎?
再次引用MSDN:
lpBuffer [in]指向緩沖區的指針,該緩沖區包含要寫入文件或設備的數據。 該緩沖區必須在寫操作期間保持有效。 在寫操作完成之前,調用者不得使用此緩沖區。
因此,如果在進行寫操作時弄亂了緩沖區,似乎無法保證安全地到達您的消息。 您絕對不應該破壞緩沖區
您的代碼本質上是使用未定義的行為。 從WriteFile文檔中:
在寫操作使用緩沖區的同時訪問輸出緩沖區可能會導致從該緩沖區寫入的數據損壞。 在寫操作完成之前,應用程序不得寫入,重新分配或釋放寫操作正在使用的輸出緩沖區。
正如雷蒙德·陳(Raymond Chen)指出的那樣, 看起來成功是不確定的行為
未定義的行為意味着任何事情都可能發生。 該程序可能會立即崩潰。 五分鍾后可能會崩潰。 它可能會向您的老板發送電子郵件,說您搞砸了,然后讀了Vogon詩歌。 或者可能不是。
您的代碼可能現在就可以工作,但是將來可能會停止工作。 可能是因為您已內置發行版,或者Microsoft更改了WriteFile
的基礎工作方式或隨機機會。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.