一、简介

命名管道(NamedPipe)是服务器进程和一个或多个客户进程之间通信的单向或双向管道。不同于匿名管道的是:命名管道可以在不相关的进程之间和不同计算机之间使用,服务器建立命名管道时给它指定一个名字,任何进程都可以通过该名字打开管道的另一端,根据给定的权限和服务器进程通信。

二、接口函数介绍

服务端使用函数
创建命名管道
CreateNamedPipe 创建命名管道
ConnectNamedPipe 服务器端等待客户端连接命名管道。若调用此函数之前,客户端已经调用CreateFile连接到了此实例,ConnectNamedPipe返回FALSE,并且GetLastError()返回ERROR_PIPE_CONNECTED,这是一个正常的连接,虽然函数返回了FALSE
WriteFile/ReadFile
DisconnectNamedPipe 断开一个客户与一个命名管道的连接,服务器端强制关闭命名管道的客户端;客户进程仍然需要调用CloseHandle。服务器端可以进一步再与其他客户端连接
CloseHandle 关闭命名管道
客户端使用函数
连接到命名管道某个实例
WaitNamedPipe 如果指定的命名管道没有实例存在,即没有服务端创建该命名管道,函数无视超时等待时间直接返回0。如果函数执行成功返回TRUE,表示至少有一个命名管道的实例有效
CreateFile 使用CreateFile函数打开命名管道的一个句柄,CreateFile可能会打开管道失败,因为该实例有可能被服务端关闭或被已经被其他客户端打开
WriteFile/ReadFile
CloseHandle

ConnectNamedPipe参数简介:

备注:实际应用中,我们用管道传输音视频帧数据,需要配置PipeMode为PIPE_TYPE_MESSAGE、PIPE_READMODE_MESSAGE。

三、示例

客户端代码示例:

#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#include <string>/*client demo code*/
int main( ) {HANDLE PipeHandle;DWORD BytesWritten;const char* message = "hello world";std::string name = "\\\\.\\pipe\\test";TCHAR pipename[MAX_PATH] = { 0 };#ifdef UNICODE _stprintf_s(pipename, MAX_PATH, _T("%S"), name.c_str());//%S宽字符
#else _stprintf_s(pipename, MAX_PATH, _T("%s"), name.c_str());//%s单字符
#endifif (WaitNamedPipe(pipename, NMPWAIT_WAIT_FOREVER) == 0){printf("WaitNamedPipe failed with error %d\n",GetLastError());return -1;}// Open the named pipe file handle  if ((PipeHandle = CreateFile(pipename,GENERIC_READ | GENERIC_WRITE, 0,(LPSECURITY_ATTRIBUTES)NULL, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,(HANDLE)NULL)) == INVALID_HANDLE_VALUE){printf("CreateFile failed with error %d\n", GetLastError());return -1;}if (WriteFile(PipeHandle, message, strlen(message), &BytesWritten, NULL) == 0){printf("WriteFile failed with error %d\n", GetLastError());CloseHandle(PipeHandle);return -1;}printf("Wrote %d bytes", BytesWritten);CloseHandle(PipeHandle);return 0;
}

服务端代码示例:

#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#include <string> /*server demo code*/
int main(void)
{HANDLE PipeHandle;DWORD BytesRead;CHAR buffer[256];std::string name = "\\\\.\\pipe\\test";TCHAR pipename[MAX_PATH] = { 0 };#ifdef UNICODE _stprintf_s(pipename, MAX_PATH, _T("%S"), name.c_str());//%S宽字符
#else _stprintf_s(pipename, MAX_PATH, _T("%s"), name.c_str());//%s单字符
#endifif ((PipeHandle = CreateNamedPipe(pipename,PIPE_ACCESS_DUPLEX, //open mode  PIPE_TYPE_BYTE | PIPE_READMODE_BYTE, //  pipe mode 1,//Num. of MaxInstances: between 1 and PIPE_UNLIMITED_INSTANCES  0, // out buffer size  0, // in buffer size  1000, //timeout  NULL //Security descriptor  )) == INVALID_HANDLE_VALUE){printf("CreateNamedPipe failed with error %d\n",GetLastError());return 0;}printf("Server is now running\n");if (ConnectNamedPipe(PipeHandle, NULL) == 0){printf("ConnectNamedPipe failed with error %d\n", GetLastError());CloseHandle(PipeHandle);return 0;}if (ReadFile(PipeHandle, buffer, sizeof(buffer), &BytesRead, NULL) <= 0){printf("ReadFile failed with error %d\n", GetLastError());CloseHandle(PipeHandle);return 0;}printf("%.*s\n", BytesRead, buffer);if (DisconnectNamedPipe(PipeHandle) == 0){printf("DisconnectNamedPipe failed with error %d\n",GetLastError());return 0;}CloseHandle(PipeHandle);return 0;
}

注意示例中先执行服务端,后执行客户端。

四、管道状态查询两种办法

1)PowerShell

命令行:[System.IO.Directory]::GetFiles("\\.\\pipe\\")

2)Google Chrome浏览器

命令行:file://.//pipe//

五、参考

1、命名管道服务端使用说明 https://docs.microsoft.com/en-us/windows/win32/ipc/multithreaded-pipe-serverhttps://docs.microsoft.com/en-us/windows/win32/ipc/multithreaded-pipe-server

2、命名管道客户端使用说明

https://docs.microsoft.com/en-us/windows/win32/ipc/named-pipe-clienthttps://docs.microsoft.com/en-us/windows/win32/ipc/named-pipe-client

3、函数列表

https://docs.microsoft.com/en-us/windows/win32/ipc/pipe-functionshttps://docs.microsoft.com/en-us/windows/win32/ipc/pipe-functions

4、创建命名管道参数详解

进程通信之二 管道技术第三篇 命名管道_MoreWindows Blog-CSDN博客上一篇《进程通信之二管道技术第二篇匿名管道》中讲解了匿名管道,匿名管道有读取端和写入端,在创建匿名管道(CreatePipe)后就可以像读写文件一样的对管道中进行读写(ReadFile与WriteFile,注意读写顺序)。在关闭匿名管道两端后会由系统负责销毁并回收资源。文章中还示范了父进程如何使用匿名管道来改变子进程的输入输出。 本篇将讲解管道技术中的命名管道(Named Pipes),顾名思义,https://blog.csdn.net/MoreWindows/article/details/8260087?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase

5、关于模式PIPE_TYPE_MESSAGE模式

关于命名管道应用 及其中的使用方式:消息模式(PIPE_TYPE_MESSAGE)_firfor_新浪博客关于命名管道应用 及其中的使用方式:消息模式(PIPE_TYPE_MESSAGE)_firfor_新浪博客,firfor,http://blog.sina.com.cn/s/blog_71b3a9690100usem.html

mark:命名管道学习笔记相关推荐

  1. 命名管道学习(简单例程)----Windows进程间通信

    管道(Pipe)实际是用于进程间通信的一段共享内存,创建管道的进程称为管道服务器,连接到一个管道的进程为管道客户机.通常我们把管道分为匿名管道和命名管道.但对于匿名管道的话,只能在本机上进程之间通信, ...

  2. linux给数据库重命名,Linux学习笔记:mv移动或文件重命名

    mv命令是move的缩写,可以用来移动文件或者将文件改名(move (rename) files),是Linux系统下常用的命令,经常用来备份文件或者目录. 语法:mv 源文件 目标文件 视mv命令中 ...

  3. mysql 的命名管道_笔记27-徐 SQLSERVER命名管道工作原理

    1 --SQLSERVER命名管道工作原理 2 --SQL首先在服务器上创建一个命名管道并监听之,然后客户端即连接到这个命名 3 --管道上来进行对话.对每一个客户端命名管道连接请求SQL都会创建一个 ...

  4. linux pipe 命名管道,linux 进程学习笔记-named pipe (FIFO)命名管道

    与"无名管道"不同的是,FIFO拥有一个名称来标志它,所谓的名称实际上就是一个路径,比如"/tmp/my_fifo",其对应到磁盘上的一个管道文件,如果我们用f ...

  5. 【学习笔记5】管道通信:命名管道

    目录 一.前言 二.基本概念 三.命名管道的创建和使用 3.1 函数原型 3.1.1 CreateNamedPipe 3.1.2 ConnectNamedPipe 3.1.3 WaitNamedPip ...

  6. Linux学习笔记-匿名和命名管道读写的相同点及不同点

    目录 理论 例子 理论 匿名和命名管道读写的相同性 1.默认都是阻塞性读写: 2.都适用于socket的网络通信: 3.阻塞不完整管道(有一段关闭) a.单纯读时,在所有数据被读取后,read返回0, ...

  7. Linux学习笔记-命名管道(FIFO)

    目录 理论 例子 理论 在int mkfifo(const char *pathname, mode_t mode) 成功返回o,出错返回-1 他包含在头文件: #include <sys/ty ...

  8. 学习笔记——进程间通信之管道详解

    重要概念!!! 进程间通信(IPC,InterProcess Communication)是指在不同进程之间传播或交换信息. IPC的方式通常有管道(包括无名管道和命名管道).消息队列.信号量.共享存 ...

  9. Linux学习笔记-无名管道,有名管道,消息队列

    Linux学习笔记-无名管道,命名管道,消息队列 无名管道 特点 创建无名管道的函数 demo 命名管道 特点 创建命名管道的函数 demo 消息队列 特点 创建消息队列涉及到的函数 demo 无名管 ...

最新文章

  1. python pprint用法_Python中使用pprint函数进行格式化输出的教程
  2. javascript 检测 header下载文件--插件
  3. 人少,登录速度就是快.
  4. bootstrap 之下拉多选
  5. 命令 启动顺序_笔记一: 启动选项与系统变量
  6. 这个保守的 RNA motif是病毒侵染的关键
  7. 详解 BP 神经网络基本原理及 C 语言实现
  8. 总结ubuntu 在命令界面login incorrect的问题
  9. 如何在Unity项目中添加语音识别?
  10. 删缓存,数据库更新谁先执行,及延时双删
  11. layui 动态添加的表单元素--select
  12. nginx1.6.2编译安装
  13. C语言:梯形面积的求解公式为 S = (a + b) * h / 2。从键盘读入一个梯形的上底a、下底b和高h,请计算表梯形的面积。(结果保留1位小数)
  14. git commit 提交信息写错,怎么更改?
  15. VirtualBox 打开虚拟机后,上面的那栏菜单栏不见了的解决办法
  16. Avoid passing null as the view root (needed to resolve layout parameters on the inflated layout's ro
  17. 每日一练——回文链表
  18. Idea内存占用过高解决方法
  19. 电解电容使用久了电容量真的会下降吗?
  20. java计算机毕业设计至臻阁古董拍卖网源码+数据库+系统+部署+lw文档

热门文章

  1. 围棋协会盛赞柯洁展强者风范 完胜韩国新领军人
  2. 甘道夫,一种用于安全部署的端到端分析服务 Gandalf, an end-to-end analytics service for safe deployment
  3. 行测-判断推理-图形推理-样式规律-空间重构-六面体
  4. WSO2部署+集成MySQL+集成Analytics分析工具
  5. 上海wmc大会华为鸿蒙,2021 MWC上海推出线上平台
  6. Pandas-数据结构-Series(二):Series的索引【下标索引、标签索引、切片索引、布尔型索引】
  7. RPI-Wireless-Hotspot
  8. 据说是比尔盖茨的十句话
  9. Python在ACM输入模式下用Map代替For
  10. asp.net中DataGrid利用RenderControl导出Excel的问题