如何使用NamedPipes c#发送长数据?

时间:2015-04-20 21:55:47

标签: c# pipe

我试图使用namedpipes将图像发送到另一台电脑 我们正在使用此代码:

byte[] DataToBeSend;

    NamedPipeClientStream PipeClient =
    new NamedPipeClientStream(_Nombre, _Pipe,
    PipeAccessRights.FullControl, PipeOptions.None,                      TokenImpersonationLevel.None,
    HandleInheritability.None);
    DataToBeSend = BitConverter.GetBytes(_Dato.Length);
    int HL = _Dato.Length;
    int Longitud = BitConverter.ToInt32(_Dato, 0);
    PipeClient.Connect();
    Console.WriteLine("Conected");
    PipeClient.Write(DataToBeSend, 0, DataToBeSend.Length);
    PipeClient.WaitForPipeDrain();
    PipeClient.Write(_Dato, 0,HL);
    PipeClient.WaitForPipeDrain();
    PipeClient.Close();

NamedPipeClientStream PipeClient = new NamedPipeClientStream(_Nombre, _Pipe, PipeAccessRights.FullControl, PipeOptions.None, TokenImpersonationLevel.None, HandleInheritability.None); DataToBeSend = BitConverter.GetBytes(_Dato.Length); int HL = _Dato.Length; int Longitud = BitConverter.ToInt32(_Dato, 0); PipeClient.Connect(); Console.WriteLine("Conected"); PipeClient.Write(DataToBeSend, 0, DataToBeSend.Length); PipeClient.WaitForPipeDrain(); PipeClient.Write(_Dato, 0,HL); PipeClient.WaitForPipeDrain(); PipeClient.Close();

我发送缓冲区的长度然后缓冲区(包含图像的字节)问题是该图像是100 MB并且命名管道不能发送如大信息,什么是最好的解决方案这个问题?有一个metod能够将这个缓冲区转换成一个较小的缓冲区!

1 个答案:

答案 0 :(得分:0)

您必须实施自己的流量控制。您需要将有效负载分解为更易于管理的块(可能大约1KB),并一次发送每个块(数据包)。

为了有效地执行此操作,您需要有效负载的标头才能知道如何在另一侧重新组装。您可能至少需要ID,Index和IsLast字段。

ID = A unique identifier indicating all packets that belong together
Index = The index of the packet in the group (same ID)
IsLast = Indicating this is the last packet of the group and you can now process as a whole