网络上的命名管道

Named pipes over network

我写了一个非常简单的代码来设置一个 "server",它创建一个命名管道并等待客户端连接。一旦客户端打开管道,服务器就会发送它的数据(一个大约 10mb 的块),客户端应该读取它并关闭连接。

现在真正的问题是:当管道使用本地名称 (\.\pipe\xxx) 时,它会毫无问题地发送所有数据,但是如果我将路径更改为网络名称 (\computer \pipe\xxx) 它改变了行为,客户端只能读取大约 65000~ 字节,但即使我循环它也不会完成读取操作(我想它会中断 65k 块以通过网络发送,因为我正在使用网络名字,它甚至发生在本地)。 ReadFile 读取 65k 块并且 returns 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);

来自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.

要解决这个问题,您必须将服务器设置为以块的形式发送数据。