博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
windows pipe
阅读量:5807 次
发布时间:2019-06-18

本文共 2580 字,大约阅读时间需要 8 分钟。

管道分为 匿名管道命名管道

1.匿名管道仅仅能在父子进程间进行通信。不能在网络间通信,并且传输数据是单向的。仅仅能一端写,还有一端读。

2.命令管道能够在随意进程间通信。通信是双向的,随意一端都可读可写,可是在同一时间仅仅能有一端读、一端写。

每个 命名管道 都有一个唯一的名字以区分于存在于系统的命名对象列表中的其它命名管道。管道server在调用CreateNamedPipe()函数创建命名管道的一个或多个实例时为其指定了名称。

对于管道客户机。则是在调用CreateFile()或CallNamedPipe()函数以连接一个命名管道实例时对管道名进行指定。

命名管道的命名规范与邮槽有些相似。对其标识也是採用的UNC格式:

\\Server\Pipe\[Path]Name

当中。第一部分\Server指定了server的名字,命名管道服务即在此server创建。其字串部分可表示为一个小数点(表示本机)、星号(当前网络字段)、域名或是一个真正的服务;第二部分\Pipe与邮槽的\Mailslot一样是一个不可变化的硬编码字串,以指出该文件是从属于NPFS;第三部分[Path]Name则使应用程序能够唯一定义及标识一个命名管道的名字。并且能够设置多级文件夹。

服务端使用函数:

CreateNamedPipe(); // 创建管道  ConnectNamedPipe(); // 堵塞。等待client连接

client使用函数:

CreateFile(); // 打开(连接)管道

两方共用函数

WriteFile();  ReadFile(); // 堵塞,使用方便  CloseHandle(); // 关闭管道,断开连接

server端代码演示样例:

#include 
#include
#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; }

client代码演示样例:

#include 
#include
#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; }

转载地址:http://mdubx.baihongyu.com/

你可能感兴趣的文章
2019届高二(下)半期考试题(文科)
查看>>
【REDO】删除REDO LOG重做日志组后需要手工删除对应的日志文件(转)
查看>>
nginx 301跳转到带www域名方法rewrite(转)
查看>>
AIX 配置vncserver
查看>>
windows下Python 3.x图形图像处理库PIL的安装
查看>>
【IL】IL生成exe的方法
查看>>
network
查看>>
SettingsNotePad++
查看>>
centos7安装cacti-1.0
查看>>
3个概念,入门 Vue 组件开发
查看>>
没有JS的前端:体积更小、速度更快!
查看>>
数据指标/表现度量系统(Performance Measurement System)综述
查看>>
GitHub宣布推出Electron 1.0和Devtron,并将提供无限制的私有代码库
查看>>
Angular2, NativeScript 和 React Native比较[翻译]
查看>>
论模式在领域驱动设计中的重要性
查看>>
国内首例:飞步无人卡车携手中国邮政、德邦投入日常运营
查看>>
微软将停止对 IE 8、9和10的支持
查看>>
微服务架构会和分布式单体架构高度重合吗
查看>>
如何测试ASP.NET Core Web API
查看>>
《The Age of Surge》作者访谈
查看>>