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

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

client代码演示样例:

#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的更多相关文章

  1. .NET Core装饰模式和.NET Core的Stream

    该文章综合了几本书的内容. 某咖啡店项目的解决方案 某咖啡店供应咖啡, 客户买咖啡的时候可以添加若干调味料, 最后要求算出总价钱. Beverage是所有咖啡饮料的抽象类, 里面的cost方法是抽象的 ...

  2. .NET Core/.NET之Stream简介

    之前写了一篇C#装饰模式的文章提到了.NET Core的Stream, 所以这里尽量把Stream介绍全点. (都是书上的内容) .NET Core/.NET的Streams 首先需要知道, Syst ...

  3. .NET Core/.NET之Stream简介 Rx.NET 简介

    .NET Core/.NET之Stream简介   之前写了一篇C#装饰模式的文章提到了.NET Core的Stream, 所以这里尽量把Stream介绍全点. (都是书上的内容) .NET Core ...

  4. 使用C# (.NET Core) 实现装饰模式 (Decorator Pattern) 并介绍 .NET/Core的Stream

    该文章综合了几本书的内容. 某咖啡店项目的解决方案 某咖啡店供应咖啡, 客户买咖啡的时候可以添加若干调味料, 最后要求算出总价钱. Beverage是所有咖啡饮料的抽象类, 里面的cost方法是抽象的 ...

  5. (转)Windows管道(Pipe)重定向stdout,stderr,stdin

    参考: http://qiusuoge.com/11496.html http://www.cnblogs.com/BoyXiao/archive/2011/01/01/1923828.html st ...

  6. windows named pipe 客户端 服务器

    可以实现多客户端对一服务端,服务端为客户端提供服务. 其实一服务端对应每一个client pipe都新建立了一个pipe.windows允许建立多个同名pipe 效果: 服务端代码: #define ...

  7. docker-compose up Windows named pipe error:(code: 2)

    执行docker-compose up启动项目时,报如下错误: ERRORERROR: Windows named pipe error: 膸碌脥艂艕艊藳禄碌藵脰赂露篓碌脛脦脛慕牛藝艁 (code: ...

  8. Windows进程间通信—命名管道

    命名管道是通过网络来完成进程间的通信,它屏蔽了底层的网络协议细节.我们在不了解网络协议的情况下,也可以利用命名管道来实现进程间的通信.与Socket网络通信相比,命名管道不再需要编写身份验证的代码.将 ...

  9. windows配置xhprof,PHP性能分析工具

    本来以为配置这么一个工具不会费很大的力气,后面发现完全不是. 一.小插曲 早上显示电脑不能显示虚拟目录下的所有域名,但是能打开localhost,数据库连接也不行了.这个问题纠缠了我一个上午.对了还有 ...

随机推荐

  1. 【mysql优化 3】嵌套循环连接算法

    原文地址:Nested-Loop Join Algorithms mysql在表之间执行连接操作,包括了使用循环嵌套算法或者其他在此基础上的变形. 循环嵌套连接算法: 一个简单的嵌套循环连接(NLJ: ...

  2. HashSet源码分析 jdk1.6

    Set的特点:Set元素无顺序,且元素不可以重复. 1.定义 public class HashSet<E> extends AbstractSet<E> implements ...

  3. 漫谈DNS

    文章作者:luxianghao 文章来源:http://www.cnblogs.com/luxianghao/p/6189633.html  转载请注明,谢谢合作. 免责声明:文章内容仅代表个人观点, ...

  4. HDU4548 美素数

    Problem Description 小明对数的研究比较热爱,一谈到数,脑子里就涌现出好多数的问题,今天,小明想考考你对素数的认识. 问题是这样的:一个十进制数,如果是素数,而且它的各位数字和也是素 ...

  5. kb-09-线段树--区间合并比较繁

    /* hdu-1540 题意:一个线段,长度为n,三种操作,Dx,挖掉某个点:R,恢复最近被挖掉的点:Qx查询该点所在的连续区间的长度: 树的节点维护三个变量,该节点左边界开始连续的个数ll,右边界开 ...

  6. Installing Metasploit Framework on Ubuntu 14.04 LTS and Debian 7

    原文链接:http://www.darkoperator.com/installing-metasploit-in-ubunt/ This Guide covers the installation ...

  7. linux监控平台搭建-cpu

    linux监控平台搭建-cpu 目前服务器的主流CPU是intel或者AMD.到底主频是什么.多核.多线程.并发.并行.超频.一级缓存.二级缓存.三级缓存.i386.x86 cpu:含有算术逻辑.控制 ...

  8. Intellij IDE使用 ideavim,不能复制文档到系统粘贴板

    vim的yank命令默认不会复制到系统粘贴板,而是粘贴到寄存器.你可以使用* 或 +寄存器来访问系统粘贴板. 在~/.ideavimrc (如果不存在就创建) 中添加下列选项 set clipboar ...

  9. UVA 116 Unidirectional TSP(DP最短路字典序)

    Description    Unidirectional TSP  Background Problems that require minimum paths through some domai ...

  10. codeforces练习

    DZY Loves Colors Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u S ...