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

sol*_*old 20 sockets winapi ipc named-pipes

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

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

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

小智 18

一些微妙的差异:

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

防火墙软件可能会导致建立TCP/IP连接时出现问题.它不应该是本地IPC的问题,但我不相信.命名管道也可以有防火墙.

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

尽管鲁本斯提到的文章主要是关于网络上的IPC,但它的确指出"本地命名管道在内核模式下运行并且非常快".

  • Windows PC始终安装了虚拟环回接口.您不需要在PC中使用网络适配器或驱动程序来使用Windows套接字.使用IP地址127.0.0.1来解决本地进程. (7认同)

小智 5

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