c++ windows named pipe c++如何使用命名管道进行进程间通信

大晨吖_4838

大晨吖_4838

2026-03-21

150人浏览

原创

createnamedpipe 关键参数需匹配:pipe_access_duplex 必须配 pipe_type_message 或 pipe_type_byte;nmaxinstances 建议设具体值(如10)而非 pipe_unlimited_instances;dwpipemode 影响消息边界,ipc 场景优先选消息模式。

c++ windows named pipe c++如何使用命名管道进行进程间通信

创建命名管道时 CreateNamedPipe 的关键参数怎么选

Windows 命名管道不是“建了就能连”,CreateNamedPipe 的参数稍有偏差,客户端一调 ConnectNamedPipe 就阻塞或立刻失败。最常踩的坑是 dwOpenMode 和 dwPipeMode 搭配错。

  • PIPE_ACCESS_DUPLEX 必须和 PIPE_TYPE_MESSAGE 或 PIPE_TYPE_BYTE 配合使用;若只写 PIPE_ACCESS_INBOUND,客户端就只能单向写,服务端读完一次就断
  • 消息模式(PIPE_TYPE_MESSAGE)下,每次 WriteFile 是一个完整消息,ReadFile 也必须按消息边界读;字节模式(PIPE_TYPE_BYTE)则像流,不保消息边界——但多数 IPC 场景建议用消息模式,避免粘包
  • nMaxInstances 设为 PIPE_UNLIMITED_INSTANCES 看似省事,实际会因句柄泄漏或未清理实例导致后续创建失败,建议设具体值(如 10)

ConnectNamedPipe 为什么总卡住或返回 ERROR_PIPE_CONNECTED

这不是错误,是正常状态——说明客户端已连上,但你没处理好同步逻辑。常见现象:服务端调完 ConnectNamedPipe 后程序停住、CPU 降为 0,或者刚连上就报错断开。

  • 同步模式下,ConnectNamedPipe 会阻塞直到客户端调 CreateFile;若客户端还没启动,服务端就卡死——必须用超时(SetEvent + WaitForSingleObject)或改异步 I/O
  • 返回 ERROR_PIPE_CONNECTED 表示连接已在上次调用中建立(比如重连),此时不该再调一次 ConnectNamedPipe,直接读写即可
  • 每次连接处理完,务必调 DisconnectNamedPipe 再调 CloseHandle;漏掉 DisconnectNamedPipe 会导致下一次 CreateNamedPipe 失败(ERROR_ACCESS_DENIED)

客户端用 CreateFile 连接失败的典型原因

客户端连不上,90% 出在路径、权限或时机。错误信息往往是 ERROR_FILE_NOT_FOUND 或 ERROR_ACCESS_DENIED,但真正原因和字面意思常不一致。

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载
  • 管道名格式必须是 \\.\pipe\xxx,少一个反斜杠或大小写错误(如 PIPE 写成 pipe)都会报 ERROR_FILE_NOT_FOUND
  • 服务端还没调 ConnectNamedPipe(或已断开),客户端就急着 CreateFile,会返回 ERROR_PIPE_BUSY——应循环重试,配合 WaitNamedPipe
  • 跨用户会话(比如服务跑在 Session 0,GUI 客户端在 Session 1)默认无法访问;需在 CreateNamedPipe 中加 SECURITY_DESCRIPTOR 并设置 SE_GROUP_DEFAULT 权限,否则就是 ERROR_ACCESS_DENIED

消息收发时 ReadFile/WriteFile 返回 0 字节或失败

不是数据丢了,是管道状态或缓冲区没对齐。尤其在消息模式下,读写行为和文件完全不同。

  • 消息模式中,ReadFile 若传入缓冲区太小(小于消息实际长度),会返回 FALSE 且 GetLastError() 是 ERROR_MORE_DATA——必须按提示扩大缓冲区重读,不能忽略
  • 写入前确认管道是否仍处于连接状态:GetNamedPipeInfo 查 lpState 是否为 PIPE_CONNECTED;否则 WriteFile 可能返回 0 字节并设 ERROR_BROKEN_PIPE
  • 不要混用同步/异步句柄:服务端用 FILE_FLAG_OVERLAPPED 创建,客户端却用普通 CreateFile,会导致读写行为不可预测

命名管道真正的复杂点不在 API 调用顺序,而在状态机管理——连接、读、写、断开每个环节都可能中途失效,且错误码含义高度依赖上下文。别指望一次写对,先用 GetLastError 把每次失败的具体码打出来,比查文档快得多。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
session失效的原因
session失效的原因

session失效的原因有会话超时、会话数量限制、会话完整性检查、服务器重启、浏览器或设备问题等等。详细介绍:1、会话超时:服务器为Session设置了一个默认的超时时间,当用户在一段时间内没有与服务器交互时,Session将自动失效;2、会话数量限制:服务器为每个用户的Session数量设置了一个限制,当用户创建的Session数量超过这个限制时,最新的会覆盖最早的等等。

2023.10.17

580

4

session失效解决方法
session失效解决方法

session失效通常是由于 session 的生存时间过期或者服务器关闭导致的。其解决办法:1、延长session的生存时间;2、使用持久化存储;3、使用cookie;4、异步更新session;5、使用会话管理中间件。

2023.10.18

876

5

cookie与session的区别
cookie与session的区别

本专题整合了cookie与session的区别和使用方法等相关内容,阅读专题下面的文章了解更详细的内容。

2025.08.19

1866

14

windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.26

3159

3

查看端口占用情况windows
查看端口占用情况windows

端口占用是指与端口关联的软件占用端口而使得其他应用程序无法使用这些端口,端口占用问题是计算机系统编程领域的一个常见问题,端口占用的根本原因可能是操作系统的一些错误,服务器也可能会出现端口占用问题。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.07.27

2718

6

windows照片无法显示
windows照片无法显示

当我们尝试打开一张图片时,可能会出现一个错误提示,提示说"Windows照片查看器无法显示此图片,因为计算机上的可用内存不足",本专题为大家提供windows照片无法显示相关的文章,帮助大家解决该问题。

2023.08.01

1468

3

windows查看端口被占用的情况
windows查看端口被占用的情况

windows查看端口被占用的情况的方法:1、使用Windows自带的资源监视器;2、使用命令提示符查看端口信息;3、使用任务管理器查看占用端口的进程。本专题为大家提供windows查看端口被占用的情况的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

2499

5

windows无法访问共享电脑
windows无法访问共享电脑

在现代社会中,共享电脑是办公室和家庭的重要组成部分。然而,有时我们可能会遇到Windows无法访问共享电脑的问题。这个问题可能会导致数据无法共享,影响工作和生活的正常进行。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.08

3270

4

windows自动更新
windows自动更新

Windows操作系统的自动更新功能可以确保系统及时获取最新的补丁和安全更新,以提高系统的稳定性和安全性。然而,有时候我们可能希望暂时或永久地关闭Windows的自动更新功能。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

1557

3

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习