在创建命名管道的多个实例(使用CreateNamedPipe())之后,我使用CreateFile()来形成管道客户端。
当客户端将消息写入管道时,只有一个服务器实例获取它。
客户端是否有办法将消息写入所有实例?
答案 0 :(得分:2)
当客户端连接到命名管道的实例时,据我所知,操作系统选择与哪个服务器实例建立连接的方式是未记录的。但是,根据经验,它似乎是在循环的基础上完成的。
如果您准备依赖可能随Service Pack和QFE补丁更改的未记录行为,您的客户端可以继续关闭其管道句柄并再次调用CreateFile以获取新的 - 每次它将附加到新的服务器实例管道。但是,这有一个问题是客户端不知道何时停止。我想你可以发明一些涉及服务器响应的机制来打破循环,但它远非令人满意。这不是命名管道的设计目的。
管道的多个服务器实例的真正目的是使管道服务器能够同时处理多个客户端。通常,同一服务器进程管理所有实例。
你真的想扭转局面:你认为你的客户应该是服务器,应该创建和管理管道。然后,希望通知的进程将作为命名管道的客户端进行连接。这是一种可以使用WCF轻松实现的模式,具有双工合约和NetNamedPipeBinding(如果这是一个选项)。
答案 1 :(得分:1)
不,管子有两端。循环通过管道。邮箱支持广播,但不保证交付。