繁体   English   中英

即使缓冲区被覆盖以进行挂起操作,WriteFile也成功

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM