【问题标题】:ReadFile named pipe after client closed other end客户端关闭另一端后的ReadFile命名管道
【发布时间】:2013-06-11 20:42:29
【问题描述】:

我的多线程应用程序运行良好,但以下情况除外: 最初我从管道中读取 16 个字节,然后根据标题读取其余部分。

问题是有时客户端会写一条消息(比如 300 字节长)然后关闭连接。

我的服务器收到前 16 个字节,然后决定获取其余 284 个字节,但 ReadFile 返回错误 233(管道的另一端没有进程。)

那么,这 284 个字节到哪里去了?我想它们应该在管道缓冲区或其他东西中。

像网络上所有示例一样创建的管道:

 HANDLE h= CreateNamePipe(
    name,                  // pipe name
    PIPE_ACCESS_DUPLEX |        // read/write access
    FILE_FLAG_OVERLAPPED,       // overlapped mode
    PIPE_TYPE_MESSAGE |         // message-type pipe
    PIPE_READMODE_MESSAGE |     // message read mode
    PIPE_WAIT,                  // blocking mode
    PIPE_UNLIMITED_INSTANCES,   // unlimited instances
    100000,                   // output buffer size
    100000,                   // input buffer size
    0,               // client time-out
    lpSecurityAttributes);                     // default security attributes

【问题讨论】:

  • 好的,在断开管道之前检查您的客户端是否正在调用FlushFileBuffers()。 (它应该在CloseHandle() 之前使用DisconnectNamedPipe())。
  • WhozCraig,感谢您的评论。但不幸的是我无法修改客户端。它的第 3 方计划。

标签: winapi networking named-pipes


【解决方案1】:

正如 WhozCraig 所注意到的,客户端在 DisconnectNamePIpe 之前不会执行 FlushFileBuffers。很遗憾。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    相关资源
    最近更新 更多