mark:命名管道学习笔记
一、简介
命名管道(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:命名管道学习笔记相关推荐
- 命名管道学习(简单例程)----Windows进程间通信
管道(Pipe)实际是用于进程间通信的一段共享内存,创建管道的进程称为管道服务器,连接到一个管道的进程为管道客户机.通常我们把管道分为匿名管道和命名管道.但对于匿名管道的话,只能在本机上进程之间通信, ...
- linux给数据库重命名,Linux学习笔记:mv移动或文件重命名
mv命令是move的缩写,可以用来移动文件或者将文件改名(move (rename) files),是Linux系统下常用的命令,经常用来备份文件或者目录. 语法:mv 源文件 目标文件 视mv命令中 ...
- mysql 的命名管道_笔记27-徐 SQLSERVER命名管道工作原理
1 --SQLSERVER命名管道工作原理 2 --SQL首先在服务器上创建一个命名管道并监听之,然后客户端即连接到这个命名 3 --管道上来进行对话.对每一个客户端命名管道连接请求SQL都会创建一个 ...
- linux pipe 命名管道,linux 进程学习笔记-named pipe (FIFO)命名管道
与"无名管道"不同的是,FIFO拥有一个名称来标志它,所谓的名称实际上就是一个路径,比如"/tmp/my_fifo",其对应到磁盘上的一个管道文件,如果我们用f ...
- 【学习笔记5】管道通信:命名管道
目录 一.前言 二.基本概念 三.命名管道的创建和使用 3.1 函数原型 3.1.1 CreateNamedPipe 3.1.2 ConnectNamedPipe 3.1.3 WaitNamedPip ...
- Linux学习笔记-匿名和命名管道读写的相同点及不同点
目录 理论 例子 理论 匿名和命名管道读写的相同性 1.默认都是阻塞性读写: 2.都适用于socket的网络通信: 3.阻塞不完整管道(有一段关闭) a.单纯读时,在所有数据被读取后,read返回0, ...
- Linux学习笔记-命名管道(FIFO)
目录 理论 例子 理论 在int mkfifo(const char *pathname, mode_t mode) 成功返回o,出错返回-1 他包含在头文件: #include <sys/ty ...
- 学习笔记——进程间通信之管道详解
重要概念!!! 进程间通信(IPC,InterProcess Communication)是指在不同进程之间传播或交换信息. IPC的方式通常有管道(包括无名管道和命名管道).消息队列.信号量.共享存 ...
- Linux学习笔记-无名管道,有名管道,消息队列
Linux学习笔记-无名管道,命名管道,消息队列 无名管道 特点 创建无名管道的函数 demo 命名管道 特点 创建命名管道的函数 demo 消息队列 特点 创建消息队列涉及到的函数 demo 无名管 ...
最新文章
- python pprint用法_Python中使用pprint函数进行格式化输出的教程
- javascript 检测 header下载文件--插件
- 人少,登录速度就是快.
- bootstrap 之下拉多选
- 命令 启动顺序_笔记一: 启动选项与系统变量
- 这个保守的 RNA motif是病毒侵染的关键
- 详解 BP 神经网络基本原理及 C 语言实现
- 总结ubuntu 在命令界面login incorrect的问题
- 如何在Unity项目中添加语音识别?
- 删缓存,数据库更新谁先执行,及延时双删
- layui 动态添加的表单元素--select
- nginx1.6.2编译安装
- C语言:梯形面积的求解公式为 S = (a + b) * h / 2。从键盘读入一个梯形的上底a、下底b和高h,请计算表梯形的面积。(结果保留1位小数)
- git commit 提交信息写错,怎么更改?
- VirtualBox 打开虚拟机后,上面的那栏菜单栏不见了的解决办法
- Avoid passing null as the view root (needed to resolve layout parameters on the inflated layout's ro
- 每日一练——回文链表
- Idea内存占用过高解决方法
- 电解电容使用久了电容量真的会下降吗?
- java计算机毕业设计至臻阁古董拍卖网源码+数据库+系统+部署+lw文档
热门文章
- 围棋协会盛赞柯洁展强者风范 完胜韩国新领军人
- 甘道夫,一种用于安全部署的端到端分析服务 Gandalf, an end-to-end analytics service for safe deployment
- 行测-判断推理-图形推理-样式规律-空间重构-六面体
- WSO2部署+集成MySQL+集成Analytics分析工具
- 上海wmc大会华为鸿蒙,2021 MWC上海推出线上平台
- Pandas-数据结构-Series(二):Series的索引【下标索引、标签索引、切片索引、布尔型索引】
- RPI-Wireless-Hotspot
- 据说是比尔盖茨的十句话
- Python在ACM输入模式下用Map代替For
- asp.net中DataGrid利用RenderControl导出Excel的问题