为啥命名管道是本地的?

Posted

技术标签:

【中文标题】为啥命名管道是本地的?【英文标题】:Why are named pipes local?为什么命名管道是本地的? 【发布时间】:2009-11-06 05:17:48 【问题描述】:

我记得使用命名管道在两台机器之间进行通信(早在 Windows NT 中)。 为什么现在我读到命名管道仅用于同一台机器中的进程间通信? (在 Vista 和 Windows 7 中)

【问题讨论】:

【参考方案1】:

作为操作系统基础架构的命名管道完全可用于机器间通信 - 请参阅MSDN docs on Named Pipes。

命名管道可用于提供 进程之间的通信 同一台计算机或进程之间 网络中的不同计算机。 如果服务器服务正在运行,全部 命名管道可以远程访问。 如果您打算使用命名管道 仅限本地,拒绝访问 NT AUTHORITY\NETWORK 或切换到本地 RPC。

但是,我假设您可能在谈论 WCF 绑定“NetNamedPipe”,它确实是仅在同一台机器上的通信。为什么会这样,您必须询问 WCF 设计团队 - 我没有任何相关信息。

但正如 Stephen C 所说的那样 - 如果您需要机器对机器的通信(在 WCF 中),请改用 netTcpBinding - 两者在功能、速度和特性集方面非常相似。

有关命名管道,请参阅此 article on the support added in .NET 3.5。

马克

【讨论】:

另外...我认为配置 SQL 以接受管道只能在本地工作 @Nestor:不,我相信 SQL Server 的命名管道实际上是跨机器的; “映射内存”方法仅适用于本地。【参考方案2】:

因为如果它们是非本地的,它们将被称为套接字。

编辑:实际上,这是一个相当轻率的、以 UNIX 为中心的答案。在 UNIX 上,命名管道仅用于本地通信。相比之下,套接字既可用于本地通信,也可用于非本地通信,并且可以使用多种传输协议。另一个不同之处在于您找到它们的方式。命名管道通常位于文件系统命名空间中。套接字(或更准确地说,套接字端点)由某种网络地址标识,该地址通常在某种名称服务器/服务中查找。

【讨论】:

不确定我是否同意(或理解你)。管道在套接字之上增加了很多握手。它们不一样。 @Nestor - 我同意。但我认为我的观点仍然有效。对于非本地通信,最好使用 Socket。尤其是如果您可能希望远程计算机不是 Windows 的……将来某个时候。 “那些不了解 UNIX 的人注定要重新发明它,很糟糕。” ——亨利·斯宾塞 @Stephen:是的,绝对 - 我想这就是为什么 WCF 只为同一机器通信实现命名管道,并在机器之间使用 NetTcp(即套接字) - 他们遵循了你的建议 :-)

以上是关于为啥命名管道是本地的?的主要内容,如果未能解决你的问题,请参考以下文章

为啥在没有人阅读后继续写入命名管道?

为啥这个命名管道不打印发送的行?

为啥 os.path.exists() 会阻止 Windows 命名管道连接?

为啥线程在进程间通信期间会破坏命名管道?

为啥 bash 在写入命名管道时关闭?

为啥这里举例说明在 LINUX 中使用命名管道 -FIFO 的程序会遇到竞争条件?