我写了一个非常简单的代码来设置一个"服务器"创建命名管道并等待客户端连接。一旦客户端打开管道,服务器就会发送其数据(大约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);
答案 0 :(得分:4)
来自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.
要完成此操作,您必须设置服务器以块的形式发送数据。