命名管道客户端可以写入多个实例吗?
Posted
技术标签:
【中文标题】命名管道客户端可以写入多个实例吗?【英文标题】:Can a named-pipe client write to multiple instances? 【发布时间】:2011-03-29 20:55:14 【问题描述】:创建命名管道的多个实例后(使用 CreateNamedPipe()),我使用 CreateFile() 来形成一个管道客户端。 当客户端向管道写入一条消息时,只有一个服务器实例会得到它。
客户端有没有办法向所有实例写入消息?
【问题讨论】:
您需要一个用于广播功能的邮槽。 我想要的是健康和幸福。这只是互联网上的一个问题...... 【参考方案1】:据我所知,当客户端连接到命名管道的实例时,操作系统选择连接到哪个服务器实例的方式是未记录的。然而,从经验上看,它似乎是在循环的基础上完成的。
如果您准备依赖可能随服务包和 QFE 补丁而改变的未记录行为,您的客户端可以继续关闭其管道句柄并再次调用 CreateFile 以获取新的 - 每次它都会附加到新的服务器实例的管道。但是,这样做存在一个问题,即客户端不知道何时停止。我想您可以发明一些涉及服务器响应以打破循环的机制,但这远不能令人满意。这不是命名管道的设计目的。
管道的多个服务器实例的真正目的是使管道服务器能够同时处理多个客户端。通常,同一个服务器进程管理所有实例。
您真的想扭转局面:您认为的客户端应该是服务器,并且应该创建和管理管道。然后,需要通知的进程将作为命名管道的客户端连接。这是一种可以使用 WCF 轻松实现的模式,如果可以的话,可以使用双工合同和 NetNamedPipeBinding。
【讨论】:
【参考方案2】:不,管道有两端。通过管道循环。邮槽支持广播,但不能保证传送。
【讨论】:
我如何循环使用给定名称创建的所有现有管道? 呃,例如,将它们存储在 HANDLE[] 中。顺便说一句,客户端管理多个管道非常不寻常。通常它是一个服务器。我可能在你的问题中遗漏了一些东西。 场景是:有几个应用想要在新消息到达时得到通知。每个都使用 CreateNamedPipe() 创建同一管道的一个实例。因此,它们都是“管道服务器”。消息由写方提供,写方只知道管道名。 好的,这就是我的意思。是的,只需迭代您连接到的管道并 WriteFile() 每个管道。 所以问题仍然存在:写作应用程序(“管道客户端”)如何迭代当前存在的实例,它只知道管道的名称?以上是关于命名管道客户端可以写入多个实例吗?的主要内容,如果未能解决你的问题,请参考以下文章