• 可以在本机上实现两个进程间的通信 支持跨网络进程间的通信。
  • 在创建管道时,可以指定具有访问权限的用户,而其他用户则不能访问这个管道。
  • 将命名管道作为一种网络编程方案时,它实际上建立了一个客户机/服务器通信体系,并在其中可靠地传输数据。
  • 采用“命名管道文件系统(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;}

【引用】

  1. 代码 https://github.com/thefistlei/os/tree/main/processCommunication/namedPipe
  2. VC++ 深入详解 孙鑫

进程间通信(5) 命名管道相关推荐

  1. python命名管道通讯_Python进程间通信的命名管道详解(Windows)

    本文和大家分享的主要是windows系统下,python进程间通信的命名管道相关内容 ,一起来看看吧,希望对大家学习python有所帮助. 在 Windows 上的命名管道主要是通过调用win32 a ...

  2. 进程间通信之命名管道

    命名管道(FIFO)是进程间通信的一种方式. API: int mkfifo(const char *pathname, mode_t mode); DEMO: // 写进程 int main(int ...

  3. 【Linux系统编程】进程间通信之命名管道

    00. 目录 文章目录 00. 目录 01. 命名管道概述 02. 命名管道创建 03. 命名管道特性 04. 命名管道非阻塞 05. 附录 01. 命名管道概述 无名管道,由于没有名字,只能用于亲缘 ...

  4. Linux进程间通信——使用命名管道

    在前一篇文章-- Linux进程间通信--使用匿名管道中,我们看到了如何使用匿名管道来在进程之间传递数据,同时也看到了这个方式的一个缺陷,就是这些进程都由一个共同的祖先进程启动,这给我们在不相关的的进 ...

  5. 【Linux】进程间通信 - 匿名/命名管道与System V共享内存

    目录 前言 一.管道 0.什么是管道 1).管道的概念 2).管道的本质 3).管道指令: "|" 1.匿名管道 1).如何创建匿名管道 2).如何使用匿名管道进行通信 3).匿名 ...

  6. Linux系统编程——进程间通信:命名管道(FIFO)

    命名管道的概述 无名管道,由于没有名字,只能用于亲缘关系的进程间通信(更多详情,请看<无名管道>).为了克服这个缺点,提出了命名管道(FIFO),也叫有名管道.FIFO 文件. 命名管道( ...

  7. python 命名管道_详解Python进程间通信之命名管道

    管道是一种简单的FIFO通信信道,它是单向通信的. 通常启动进程创建一个管道,然后这个进程创建一个或者多个进程子进程接受管道信息,由于管道是单向通信,所以经常需要创建两个管道来实现双向通信. 命名管道 ...

  8. 管道实现进程间通信之命名管道

    进程间通信管道篇之命名管道 文章目录 1.1命名管道 1.2命名管道的创建 1.3命名管道和匿名管道的区别 代码演示(用命名管道实现进程间通信) 2.1 通过进程间通信将客户端发送的字符串转化为命令让 ...

  9. linux进程间通信:命名管道FIFO

    文章目录 FIFO 通信特点 系统调用接口 应用 拥有亲缘关系之间的进程通信 非亲缘关系进程之间的通信 总结 FIFO 通信特点 FIFO文件有文件名 可以像普通文件一样存储在文件系统之中 可以像普通 ...

  10. 进程间通信(5) 命名管道2 不同机器通信

    不同机器的通信我一直没解决,现记录下来,以后再看,也欢迎指点! 看资料说是先connectipc一下. 结果我connectIpc错误. 执行cmd命令"net use \192.168.2 ...

最新文章

  1. mysql创建数据库选择_mysql创建、选择并使用数据库
  2. AngularJS基本知识点
  3. 数据可视化(一)-Matplotlib简易入门
  4. android 发送前台广播,使用IntentService与BroadcastReceiver实现后台服务(Android7.0可用)...
  5. os.walk 遍历目录下目录和文件
  6. 如何帮用户管好云账本?阿里云数据库助力收钱吧!
  7. 【Angular】启动过程
  8. Web安全实践(13)嗅探,arp欺骗,会话劫持与重放攻击(上)
  9. CF876 F 思维 枚举
  10. 通过adb和python直接传输Android截图到电脑(windows适用)
  11. Android 长按Menu键的监听
  12. JavaWeb项目监听数据表变化并通知前台(数据来源于自身)
  13. Android手机端编程实现TCPClient
  14. 【Unity 22】 Unity 力,扭矩,刚体,触发器的简单使用
  15. 第2章 C语言的赋值运算符、复合运算符与逗号运算符 (十一)
  16. JAVA图形化打字小游戏
  17. sendEmail发送邮件
  18. 后来者当仁不让 Android系统手机
  19. 自学2年java,简历包装成2年工作经验,面试全部失败
  20. 建一个微信群,如何选择管理员?如何管理管理员?

热门文章

  1. 语言 OJ 高低位逆转_C语言调动硬件的原理是什么?
  2. 蓝牙a2dp硬件卸载是什么意思_索尼这项音频黑科技 让蓝牙音质从此不输有线
  3. power计算机英语,十万火急求解计算机英语!AC power lineAND gateAND-OR circuitXOR gateunrel...
  4. 成功解决windows开机时,系统提示此windows副本不是正版
  5. SLAM:SLAM(即时定位与地图构建)的简介、发展、案例应用之详细攻略
  6. 成功解决Could not import the PyAudio C module ‘_portaudio‘.
  7. Python语言学习:基于python五种方法实现使用某函数名【func_01】的字符串格式('func_01')来调用该函数【func_01】执行功能
  8. ML之PLiR之LARS:利用LARS算法求解ElasticNet回归类型问题(实数值评分预测)
  9. ML之SVM:基于Js代码利用SVM算法的实现根据Kaggle数据集预测泰坦尼克号生存人员
  10. Paper之BigGAN:ICLR 2019最新论文《LARGE SCALE GAN TRAINING FOR HIGH FIDELITY NATURAL IMAGE SYNTHESIS》(未完待续)