Windows上本地IPC的套接字与命名管道?

时间:2009-11-17 01:43:09

标签: winapi sockets ipc named-pipes

是否有任何理由支持在套接字上使用命名管道进行本地IPC(使用win-api),Effective-wize,resource-wize或其他方式,因为两者的行为非常相似(并且很可能被类似的接口抽象出来无论如何),在一个可能已经使用套接字用于网络目的的应用程序中?

我至少可以说出寻址问题:套接字的端口号与管道的文件名。此外,命名管道(AFAIK)不会警告防火墙(阻止/取消阻止对话框),尽管被阻止的应用程序仍然可以通过本地套接字进行通信。还有什么要考虑的吗?

在使用套接字的情况下,在本地使用套接字时是否有任何winsock设置/标志?

2 个答案:

答案 0 :(得分:17)

一些微妙的差异:

如果没有正常运行的适配器,套接字将无法用于本地IPC。没有功能适配器的PC有多常见?好吧,当有人试图在未插入网络或电源的笔记本电脑上向客户演示我们的软件时(因此操作系统禁用了网卡以节省电量)并且无线适配器被禁用时,我被咬了(因为笔记本电脑用户没有使用无线)。您可以通过安装环回适配器来解决这个问题,但这并不理想。

防火墙软件可能会导致建立TCP / IP连接时出现问题。它不应该是本地IPC的问题,但我不相信。 Named pipes can have firewalls too.

由于创建命名管道所需的权限或创建命名管道的新实例,可能会出现问题。例如,我使用相同的命名管道运行多个服务器(可能不是一个好主意,但这是用于测试),而有些在CreateNamedPipe中失败,因为创建管道的第一个服务器在管理员模式下运行(因为它是从管理员模式下的Visual Studio,其余部分是从具有正常UAC级别的命令行启动的。

虽然Rubens提到的文章主要是关于网络上的IPC,但它的确指出“本地命名管道在内核模式下运行并且非常快”。

答案 1 :(得分:5)

您可能需要考虑的另一个解决方案是命名共享内存区域。这是一个小工作,因为你必须自己建立一个流量控制协议,但我已经成功地使用了它,速度是最重要的事情。