使用命名管道时发送数据的正确方法是啥?

Posted

技术标签:

【中文标题】使用命名管道时发送数据的正确方法是啥?【英文标题】:What is the correct way of sending data when using named pipes?使用命名管道时发送数据的正确方法是什么? 【发布时间】:2013-07-24 19:35:43 【问题描述】:

我想通过命名管道将大数据发送到另一个进程。换句话说,我有类似的东西:

var dataToSend = new byte[1024*1024]; // some large data
NamedPipeServerStream server = new NamedPipeServerStream("MyPipeName");
server.WaitForConnection();
server.Write(dataToSend,0,dataToSend.Length); // is it ok to send 1048576 bytes at once !??

我必须将dataToSend 拆分成更小的块吗?使用这种方法可以正常工作,我只是担心它将来可能会中断。我应该修复它吗?

编辑

在客户端,我认为我用 while 循环正确地读取了流。我只是担心发送方(在这种情况下是服务器)。

【问题讨论】:

我可能会。如果只是因为失败将意味着重新发送一百万字节而不是 1000 或 10,000。 +1 感谢您的回复!如果两个进程在同一台计算机上,它失败的概率是多少?在同一台电脑上发送 1024*1024 = 1MB 需要多长时间?我相信我会让我的代码更稳定? 如果你检查一下,你可能没问题。就像我说的那样,分解一个巨大的发送(千兆字节)可能是有意义的,这样重新发送就不会那么糟糕了。一百万字节将在几毫秒内传输;尝试计时。它会非常快。 检查是指检查发送是否正常(发送的字节数正确)。 【参考方案1】:

如果您检查并验证发送,您可能没问题。分解一个巨大的发送(千兆字节)可能是有意义的,这样重新发送就不会那么糟糕。一百万字节将在几毫秒内传输;尝试计时。它会非常快。

【讨论】:

+1 谢谢!因此,如果我不分解数据,最坏的情况是我必须再次发送所有数据,对吗?但最终所有数据都会从另一端接收? 是的,AFAIK,它们要么工作要么失败,这意味着如果记录的字节数匹配你就可以了。 (喜欢就采纳吧。)

以上是关于使用命名管道时发送数据的正确方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

实现 TCP、命名管道和 MSMQ 的传统方法是啥?

命名管道问题

如何保证 read() 实际上通过命名管道发送 write() 发送的 100% 数据

命名管道异步

如何继续从命名管道/流中发送/读取消息

网络上的命名管道