进程间通信(5) 命名管道
- 可以在本机上实现两个进程间的通信 支持跨网络进程间的通信。
- 在创建管道时,可以指定具有访问权限的用户,而其他用户则不能访问这个管道。
- 将命名管道作为一种网络编程方案时,它实际上建立了一个客户机/服务器通信体系,并在其中可靠地传输数据。
- 采用“命名管道文件系统(Named Pipc File System,NPFS)”接口,因此,客户机和服务器可利用标准的Win32文件系统函数(例如ReadFile和WriteFile)来进行数据的收发。
- 命名管道服务器和客户机的区别在于:服务器是惟一一个有权创建命名管道的进程,也只有它才能接受管道客户机的连接请求。而客户机只能同一个现成的命名管道服务器建立连接。
1 步骤
a. 服务端用CreateNamedPipe创建一个命名管道并使用ConnectNamedPipe等待客户端的连接。
b. 客户端使用WaitNamedPipe连接成功后,用CreateFile打开管道并使用WriteFile向管道中写入一段数据(即向服务端发送消息)。
c. 服务端使用ReadFile从管道中读取数据后(即收到消息)再向管道中写入确认信息表明已经收到客户端传输的数据(即通知客户端已收到)。
d. 客户端收到确认信息后结束,调用CloseHandle关闭管道(该管道是CreateFile打开的)。
e.服务端使用DisconnectNamedPipe和CloseHandle关闭管道。
2. CreateNamedPipe 创建命名管道的第一个实例,并建立它的基本属性
HANDLEWINAPI CreateNamedPipe( LPCTSTR lpName, DWORD dwOpenMode, DWORD dwPipeMode, DWORD nMaxInstances, // 指定管道能够创建的实例的最大数目。该参数的取值范围从1到PIPE_UNLIMITED_INSTANCES。DWORD nOutBufferSize, //输出缓冲区所保留的字节数DWORD nInBufferSize, //输入缓冲区所保留的字节数DWORD nDefaultTimeOut, LPSECURITY_ATTRIBUTES lpSecurityAttributes
);
lpName
- 一个指向空终止的字符串,该字符串的格式必须是:“l.lpipelpipename”。
- 其中该字符串开始是两个连续的反斜杆,其后的圆点表示是本地机器,如果想要与远程的服务器建立连接,那么在这个圆点位置处应指定这个远程服务器的名称。
- 接下来是“pipe”这个固定的字符串,也就是说这个字符串的内容不能修改,但其大小写是无所谓的。
- 最后是所创建的命名管道的名称。
dwOpenMode
指定管道的访问方式、重叠方式、写直通方式,还有管道句柄的安全访问方式。
重叠操作:对管道的读写函数将立即返回。
dwPipeMode
指定管道句柄的类型、读取和等待方式。
- 当把命名管道指定为消息模式时,系统发送消息时有–个定界符 当我们以消息读的模式去读取时,通过该定界符就可以读取到一条完整的消息
- 如果采用字节读方式读取,这时将忽略该定界符而直接读取数据。 对消息模式的命名管道来说,可以采用消息读,也可以采用字节读的方式读取数据。
- 对字节模式的命名管道来说,数据是一种字节流格式,没有定界符,因此如果采用消息读的模式读取时,就不知道应该读取多少字节的数据才合适。
nMaxInstances
对同一个命名管道的实例来说,在某一时刻,它只能和一个客户端进行通信。
3. BOOL waitNamedPipe (LPCTSTR lpNamedPipeName,DWORD nTimeout );
nTimeout 超时时间间隔
4代码
server
hPipe = CreateNamedPipe(TEXT("\\\\.\\pipe\\MyPipe"),PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED,0, 1, 1024, 1024, 0, NULL);if (INVALID_HANDLE_VALUE == hPipe){MessageBoxA(g_hWnd, "创建命名管道失败!", "f", MB_OK); hPipe = NULL;return;}HANDLE hEvent;hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);if (!hEvent){MessageBoxA(g_hWnd, "创建事件对象失败!", "f", MB_OK);CloseHandle(hPipe);hPipe = NULL;return;}OVERLAPPED ovlap;ZeroMemory(&ovlap, sizeof(OVERLAPPED));ovlap.hEvent = hEvent;if (!ConnectNamedPipe(hPipe, &ovlap)){if (ERROR_IO_PENDING != GetLastError()){MessageBoxA(g_hWnd, "等待客户端连接失败!", "f", MB_OK);CloseHandle(hPipe);CloseHandle(hEvent);hPipe = NULL;return;}}if (WAIT_FAILED == WaitForSingleObject(hEvent, INFINITE)){MessageBoxA(g_hWnd, "等待对象失败!", "f", MB_OK);CloseHandle(hPipe);CloseHandle(hEvent);hPipe = NULL;return;}CloseHandle(hEvent);
client:
if (!WaitNamedPipe(TEXT("\\\\.\\pipe\\MyPipe"), NMPWAIT_WAIT_FOREVER)){MessageBoxA(g_hWnd, "当前没有可利用的命名管道实例!", "f", MB_OK); return;}hPipe = CreateFile(TEXT("\\\\.\\pipe\\MyPipe"), GENERIC_READ | GENERIC_WRITE,0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);if (INVALID_HANDLE_VALUE == hPipe){MessageBoxA(g_hWnd, "打开命名管道失败!", "f", MB_OK); hPipe = NULL;return;}
【引用】
- 代码 https://github.com/thefistlei/os/tree/main/processCommunication/namedPipe
- VC++ 深入详解 孙鑫
进程间通信(5) 命名管道相关推荐
- python命名管道通讯_Python进程间通信的命名管道详解(Windows)
本文和大家分享的主要是windows系统下,python进程间通信的命名管道相关内容 ,一起来看看吧,希望对大家学习python有所帮助. 在 Windows 上的命名管道主要是通过调用win32 a ...
- 进程间通信之命名管道
命名管道(FIFO)是进程间通信的一种方式. API: int mkfifo(const char *pathname, mode_t mode); DEMO: // 写进程 int main(int ...
- 【Linux系统编程】进程间通信之命名管道
00. 目录 文章目录 00. 目录 01. 命名管道概述 02. 命名管道创建 03. 命名管道特性 04. 命名管道非阻塞 05. 附录 01. 命名管道概述 无名管道,由于没有名字,只能用于亲缘 ...
- Linux进程间通信——使用命名管道
在前一篇文章-- Linux进程间通信--使用匿名管道中,我们看到了如何使用匿名管道来在进程之间传递数据,同时也看到了这个方式的一个缺陷,就是这些进程都由一个共同的祖先进程启动,这给我们在不相关的的进 ...
- 【Linux】进程间通信 - 匿名/命名管道与System V共享内存
目录 前言 一.管道 0.什么是管道 1).管道的概念 2).管道的本质 3).管道指令: "|" 1.匿名管道 1).如何创建匿名管道 2).如何使用匿名管道进行通信 3).匿名 ...
- Linux系统编程——进程间通信:命名管道(FIFO)
命名管道的概述 无名管道,由于没有名字,只能用于亲缘关系的进程间通信(更多详情,请看<无名管道>).为了克服这个缺点,提出了命名管道(FIFO),也叫有名管道.FIFO 文件. 命名管道( ...
- python 命名管道_详解Python进程间通信之命名管道
管道是一种简单的FIFO通信信道,它是单向通信的. 通常启动进程创建一个管道,然后这个进程创建一个或者多个进程子进程接受管道信息,由于管道是单向通信,所以经常需要创建两个管道来实现双向通信. 命名管道 ...
- 管道实现进程间通信之命名管道
进程间通信管道篇之命名管道 文章目录 1.1命名管道 1.2命名管道的创建 1.3命名管道和匿名管道的区别 代码演示(用命名管道实现进程间通信) 2.1 通过进程间通信将客户端发送的字符串转化为命令让 ...
- linux进程间通信:命名管道FIFO
文章目录 FIFO 通信特点 系统调用接口 应用 拥有亲缘关系之间的进程通信 非亲缘关系进程之间的通信 总结 FIFO 通信特点 FIFO文件有文件名 可以像普通文件一样存储在文件系统之中 可以像普通 ...
- 进程间通信(5) 命名管道2 不同机器通信
不同机器的通信我一直没解决,现记录下来,以后再看,也欢迎指点! 看资料说是先connectipc一下. 结果我connectIpc错误. 执行cmd命令"net use \192.168.2 ...
最新文章
- mysql创建数据库选择_mysql创建、选择并使用数据库
- AngularJS基本知识点
- 数据可视化(一)-Matplotlib简易入门
- android 发送前台广播,使用IntentService与BroadcastReceiver实现后台服务(Android7.0可用)...
- os.walk 遍历目录下目录和文件
- 如何帮用户管好云账本?阿里云数据库助力收钱吧!
- 【Angular】启动过程
- Web安全实践(13)嗅探,arp欺骗,会话劫持与重放攻击(上)
- CF876 F 思维 枚举
- 通过adb和python直接传输Android截图到电脑(windows适用)
- Android 长按Menu键的监听
- JavaWeb项目监听数据表变化并通知前台(数据来源于自身)
- Android手机端编程实现TCPClient
- 【Unity 22】 Unity 力,扭矩,刚体,触发器的简单使用
- 第2章 C语言的赋值运算符、复合运算符与逗号运算符 (十一)
- JAVA图形化打字小游戏
- sendEmail发送邮件
- 后来者当仁不让 Android系统手机
- 自学2年java,简历包装成2年工作经验,面试全部失败
- 建一个微信群,如何选择管理员?如何管理管理员?
热门文章
- 语言 OJ 高低位逆转_C语言调动硬件的原理是什么?
- 蓝牙a2dp硬件卸载是什么意思_索尼这项音频黑科技 让蓝牙音质从此不输有线
- power计算机英语,十万火急求解计算机英语!AC power lineAND gateAND-OR circuitXOR gateunrel...
- 成功解决windows开机时,系统提示此windows副本不是正版
- SLAM:SLAM(即时定位与地图构建)的简介、发展、案例应用之详细攻略
- 成功解决Could not import the PyAudio C module ‘_portaudio‘.
- Python语言学习:基于python五种方法实现使用某函数名【func_01】的字符串格式('func_01')来调用该函数【func_01】执行功能
- ML之PLiR之LARS:利用LARS算法求解ElasticNet回归类型问题(实数值评分预测)
- ML之SVM:基于Js代码利用SVM算法的实现根据Kaggle数据集预测泰坦尼克号生存人员
- Paper之BigGAN:ICLR 2019最新论文《LARGE SCALE GAN TRAINING FOR HIGH FIDELITY NATURAL IMAGE SYNTHESIS》(未完待续)