windows pipe
管道分为 匿名管道 和 命名管道 。
1.匿名管道只能在父子进程间进行通信,不能在网络间通信,而且数据传输是单向的,只能一端写,另一端读。
2.命令管道可以在任意进程间通信,通信是双向的,任意一端都可读可写,但是在同一时间只能有一端读、一端写。
每一个 命名管道 都有一个唯一的名字以区分于存在于系统的命名对象列表中的其他命名管道。管道服务器在调用CreateNamedPipe()函数创建命名管道的一个或多个实例时为其指定了名称。对于管道客户机,则是在调用CreateFile()或CallNamedPipe()函数以连接一个命名管道实例时对管道名进行指定。命名管道的命名规范与邮槽有些类似,对其标识也是采用的UNC格式:
\\Server\Pipe\[Path]Name
其中,第一部分\Server指定了服务器的名字,命名管道服务即在此服务器创建,其字串部分可表示为一个小数点(表示本机)、星号(当前网络字段)、域名或是一个真正的服务;第二部分\Pipe与邮槽的\Mailslot一样是一个不可变化的硬编码字串,以指出该文件是从属于NPFS;第三部分[Path]Name则使应用程序可以唯一定义及标识一个命名管道的名字,而且可以设置多级目录。
服务端使用函数:
CreateNamedPipe(); // 创建管道
ConnectNamedPipe(); // 阻塞,等待客户端连接
客户端使用函数:
CreateFile(); // 打开(连接)管道
双方共用函数
WriteFile();
ReadFile(); // 阻塞,使用方便
CloseHandle(); // 关闭管道,断开连接
服务器端代码示例:
#include <stdio.h>
#include <windows.h> #define PIPE_NAME L"\\\\.\\Pipe\\test" HANDLE g_hPipe = INVALID_HANDLE_VALUE; int main()
{ char buffer[1024]; DWORD WriteNum; printf("test server.\n"); g_hPipe = CreateNamedPipe(PIPE_NAME, PIPE_ACCESS_DUPLEX, \ PIPE_TYPE_BYTE|PIPE_READMODE_BYTE , 1, 0, 0, 1000, NULL); if(g_hPipe == INVALID_HANDLE_VALUE) { printf("Create name pipe failed!\n"); goto out; } printf("Wait for connect...\n"); if(ConnectNamedPipe(g_hPipe, NULL) == FALSE) { printf("Connect failed!\n"); goto out; } printf("Connected.\n"); while(1) { scanf("%s", &buffer); if(WriteFile(g_hPipe, buffer, (DWORD)strlen(buffer), &WriteNum, NULL) == FALSE) { printf("Write failed!\n"); break; } } out: printf("Close pipe.\n"); CloseHandle(g_hPipe); system("pause"); return 0;
}
客户端代码示例:
#include <stdio.h>
#include <windows.h> #define PIPE_NAME L"\\\\.\\Pipe\\test" HANDLE g_hPipe = INVALID_HANDLE_VALUE; int main()
{ char buffer[1024]; DWORD ReadNum; printf("test client.\n"); g_hPipe = CreateFile(PIPE_NAME, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (g_hPipe == INVALID_HANDLE_VALUE) { printf("Connect pipe failed!\n"); goto out; } printf("Connected.\n"); while(1) { if(ReadFile(g_hPipe, buffer, sizeof(buffer), &ReadNum, NULL) == FALSE) { break; } buffer[ReadNum] = 0; printf("%s\n", buffer); }
out: printf("Close pipe.\n"); CloseHandle(g_hPipe); system("pause"); return 0;
}
windows pipe相关推荐
- .NET Core/.NET之Stream简介
之前写了一篇C#装饰模式的文章用.NET Core实现装饰模式和.NET Core的Stream简介 提到了.NET Core的Stream, 所以这里尽量把Stream介绍全点. (都是书上的内容) ...
- 用.NET Core实现装饰模式和.NET Core的Stream简介
该文章综合了几本书的内容. 某咖啡店项目的解决方案 某咖啡店供应咖啡, 客户买咖啡的时候可以添加若干调味料, 最后要求算出总价钱. Beverage是所有咖啡饮料的抽象类, 里面的cost方法是抽象的 ...
- 使用C# (.NET Core) 实现装饰模式 (Decorator Pattern) 并介绍 .NET/Core的Stream
该文章综合了几本书的内容. 某咖啡店项目的解决方案 某咖啡店供应咖啡, 客户买咖啡的时候可以添加若干调味料, 最后要求算出总价钱. Beverage是所有咖啡饮料的抽象类, 里面的cost方法是抽象的 ...
- 安装最新mysql 8.0.22在windows10
在windows10下安装最新mysql 8.0.22 若重装 mysql可以看简捷版https://blog.csdn.net/ahmcwt/article/details/109859805 一. ...
- Windows API 进程间通信,管道(Pipe)
2019独角兽企业重金招聘Python工程师标准>>> 转载自:Windows API 进程间通信,管道(Pipe) 管道是一种用于在进程间共享数据的机制,其实质是一段共享内存.Wi ...
- 浅析Windows命名管道Named Pipe
目录 管道 命名管道Names Pipes 查看管道列表 命名管道的创建与访问 命名管道的利用 绕过防火墙 模拟令牌(System权限) C2 信道 MS17010和Named Pipe 管道 讲命令 ...
- docker-compose up之Windows named pipe error:(code: 2)
当我们执行docker-compose up启动项目时,报如下错误: Windows named pipe error: ϵͳŐҲ»µ˝Ö¸¶¨µÄÎÄĽţˇŁ (code: 2) 解决方案: ...
- EEROR:Windows named pipe error: The system cannot find the file specified. (code:2)
执行docker-compose.exe up -d 命令报以下错误: ERROR: Windows named pipe error: The system cannot find the file ...
- windows c语言 pipe,pipe 函数 (C语言)
pipe我们用中文叫做管道. 以下讲解均是基于Linux为环境: 函数简介 所需头文件 #include 函数原型 int pipe(int fd[2]) 函数传入值 fd[2]:管道的两个文件描述符 ...
最新文章
- 是否注意过 isEmpty 和 isBlank 区别?
- ios证书导出不了p12文件_IOS苹果证书无法生成.P12文件解决方法
- HDU_oj_2021 发工资喽
- Mycat高可用集群搭建
- java不抛出方法异常,java – 重写方法不会抛出异常
- golang 日志分析_容器日志采集利器:Filebeat深度剖析与实践
- jQuery LigerUI 使用教程入门篇
- java write to files_Java 8 write to file example
- iOS应用性能调优建议
- Myeclipse学习总结(3)——Myeclipse中的代码格式化、注释模板及保存时自动格式化
- pat编程语言_浙江大学在线pat题库集合
- samba (centos6.5)服务
- 【BZOJ 1491】 [NOI2007]社交网络
- [BZOJ1934/Luogu2057][SHOI2007]Vote 善意的投票 题解
- erlang的又一力作——英雄联盟聊天服务器
- buuctf-misc部分wp(更新一下)
- 悬浮窗java_Android悬浮窗示例(floatingwindow)
- 什么方法可以将pdf压缩到最小
- 【linux】循序渐进学运维-基础篇-linux运维级别
- 第四范式上市更进一步:再募资7亿美元,AI独角兽们陷亏损泥潭
热门文章
- 如何在MySQL中创建新的数据库(windows下)
- @Primary 和 @Qualifier
- STM32F429第二十五篇之MCU屏实验详解
- 央企建筑施工企业职工教育培训数字化解决方案
- Memory Hierarchy-计算机各级存储器速度对比
- 【RSA原理1】浅谈--什么是非对称加密?(加密通信的原理)
- Simpson积分方法计算NURBS曲线弧长,详细原理+代码实现
- 第一单元 Java基础
- 集音频和视频播放功能于一身的简易播放器
- .NET基础-11-ArrayList|Hashtable|File文件操作|Dircetioy文件夹操作|Path路径操作