网络上的命名管道
Posted
技术标签:
【中文标题】网络上的命名管道【英文标题】:Named pipes over network 【发布时间】:2015-07-13 23:12:01 【问题描述】:我编写了一个非常简单的代码来设置一个“服务器”,它创建一个命名管道并等待客户端连接。一旦客户端打开管道,服务器就会发送它的数据(大约 10mb 的块),客户端应该读取它并关闭连接。
现在真正的问题是:当管道使用本地名称 (\.\pipe\xxx) 时,它会毫无问题地发送所有数据,但如果我将路径更改为网络名称 (\computer\pipe\ xxx)它改变了行为,客户端只能读取大约 65000~ 字节,但即使我循环它也不会完成读取操作(我想它会中断 65k 块以通过网络发送,因为我使用的是网络名称,它发生了甚至在本地)。 ReadFile 读取 65k 块并返回 TRUE,如果我尝试在管道中再次强制 ReadFile 它读取 0 字节。
我用来创建管道的标志是 PIPE_ACCESS_DUPLEX、FILE_FLAG_WRITE_THROUGH、PIPE_TYPE_BYTE、PIPE_READMODE_BYTE、PIPE_WAIT、PIPE_ACCEPT_REMOTE_CLIENTS
这是一段代码应该是什么样子(代码在其他地方,我现在无法访问它,但正如我之前所说,它很简单)
lPipe := CreateFileA('\\.\pipe\test', GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0);
ReadFile(lPipe, lMemoryStream.Memory^, 1024*1024*15, lBytesRead, nil);
CloseHandle(lPipe);
【问题讨论】:
如果您希望获得有关代码的帮助,您需要在问题中包含代码。请edit the question出示您的阅读码。 我希望避免使用代码,因为它会缩小我猜想的答案。我目前正在使用 delphi 7,代码非常简单,就像 CreateFile->ReadFile->CloseHandle 一样简单,但我会将其添加到帖子中以提供更好的图片。 【参考方案1】:来自MSDN documentation for WriteFileEx:
Pipe write operations across a network are limited to 65,535 bytes per write. For more information regarding pipes, see the Remarks section.
要解决这个问题,您必须设置服务器以分块发送数据。
【讨论】:
以上是关于网络上的命名管道的主要内容,如果未能解决你的问题,请参考以下文章