【VS开发】 Windows平台下管道的使用
转载地址:
管道分类:
1. 匿名管道:
只能用于相关进程(如父子进程,兄弟进程),并在他们之间建立内存区域,进程终止后,匿名管道也就消失了。
通常用于:重定向子进程的标准输入输出,以便和父进程交换数据。要双向交换数据必须创建两个匿名管道。不能用于网络环境,也不能用于非关联进程。
2. 命名管道:
是在管道服务器和一台或多台管理客户机之间进行单向或双向通信的一种命名管道。一个管道共享一个管道名,但是每个实例拥有独立的缓存和句柄,并为客户-------服务通信提供一个分离的管道。
命名格式采用UNC格式:\\server\pipe\[path]name
3. 命名管道的实现:
服务端:
1.使用API函数WaitNamedPipe等待一个命名管道实例供自已使用。
2.使用API函数CreateFile建立与命名管道的连接。
3.使用API函数WriteFile和ReadFile分别向服务器发送数据或从中接收数据。
4.使用API函数CloseHandle关闭打开的命名管道会话。
客户端:
1.使用API函数WaitNamedPipe等待一个命名管道实例供自已使用。
2.使用API函数CreateFile建立与命名管道的连接。
3.使用API函数WriteFile和ReadFile分别向服务器发送数据或从中接收数据。
4.使用API函数CloseHandle关闭打开的命名管道会话。
一、匿名管道
点击(此处)折叠或打开
- //父进程
 - #include <windows.h>
 - #include <stdio.h>
 - #define CREATE_PIPE_FAILED 1
 - #define GET_STDOUTPUT_FAILED 2
 - #define SET_STDOUTPUT_TOPIPE_FAILED 3
 - #define CREATE_PROCESS_FAILED 4
 - int main(int argc, char *argv[])
 - {
 - HANDLE hRead;
 - HANDLE hWrite;
 - STARTUPINFO si;
 - PROCESS_INFORMATION pi;
 - char szReadBuf[100];
 - DWORD nReadNum;
 - BOOL bRet;
 - SECURITY_ATTRIBUTES sa;
 - sa.bInheritHandle = TRUE; //必须为TRUE,父进程的读写句柄可以被子进程继承
 - sa.lpSecurityDescriptor = NULL;
 - sa.nLength = sizeof(SECURITY_ATTRIBUTES);
 - //创建匿名管道
 - bRet = CreatePipe( &hRead, &hWrite, &sa, 0);
 - if ( bRet )
 - {
 - printf("成功创建匿名管道!\n");
 - }
 - else
 - {
 - printf( "创建匿名管道失败!错误码:[%d]\n", GetLastError() );
 - return CREATE_PIPE_FAILED;
 - }
 - //获取本进程标准输出
 - //GetStdHandle返回INVALID_HANDLE_VALUE表示失败
 - HANDLE hTemp = GetStdHandle( STD_OUTPUT_HANDLE );
 - if ( INVALID_HANDLE_VALUE == hTemp )
 - {
 - printf( "获取本进程标准输出句柄失败!错误码:[%d]\n", GetLastError() );
 - return GET_STDOUTPUT_FAILED;
 - }
 - //设置标准输出到管道
 - //SetStdHandle设置标准输出到指定设备,返回值非0表示成功,返回0失败
 - if ( !SetStdHandle( STD_OUTPUT_HANDLE, hWrite) )
 - {
 - printf( "设置标准输出到管道失败!错误码:[%d]\n", GetLastError() );
 - return SET_STDOUTPUT_TOPIPE_FAILED;
 - }
 - //获取STARTUPINFO结构体信息
 - GetStartupInfo( &si );
 - //设置STARTUPINFO的标准输出到管道入口,要使标准输入输出有效,必须指定STARTF_USESTDHANDLES
 - si.dwFlags = STARTF_USESTDHANDLES;
 - si.hStdOutput = hWrite;
 - si.hStdError = hWrite;
 - //创建子进程
 - bRet = CreateProcess( NULL, "client.exe", NULL, NULL, TRUE, NULL, NULL, NULL, &si, &pi);
 - //恢复标准输出
 - SetStdHandle( STD_OUTPUT_HANDLE, hTemp );
 - if ( !bRet )
 - {
 - printf( "创建子进程失败!错误码:[%d]\n", GetLastError() );
 - return CREATE_PROCESS_FAILED;
 - }
 - else
 - {
 - printf( "成功创建子进程\n" );
 - }
 - CloseHandle( hWrite );
 - //读取管道中的数据
 - while ( ReadFile( hRead, szReadBuf, 100, &nReadNum, NULL) )
 - {
 - szReadBuf[nReadNum] = '\0';
 - printf( "从管道读取%d个字节数:\n%s", nReadNum, szReadBuf);
 - }
 - //ERROR_BROKEN_PIPE错误码标志着子进程被关闭
 - if ( GetLastError() == ERROR_BROKEN_PIPE)
 - {
 - printf( "管道被子进程关闭!\n");
 - }
 - else
 - {
 - printf( "读取数据错误,错误代码[%d]\n", GetLastError() );
 - }
 - //释放创建子进程的资源
 - CloseHandle( pi.hThread );
 - CloseHandle( pi.hProcess );
 - return 0;
 - }
 - //子进程
 - #include <stdio.h>
 - #include <windows.h>
 - #include <iostream.h>
 - void main()
 - {
 - for (int i = 0; i < 100; i++)
 - {
 - cout<<"---------------"<<endl;
 - cout<<"标准输出:"<< i <<endl ;
 - cerr<<"标准错误:"<< i <<endl;
 - Sleep(100);
 - cout<<"---------------"<<endl;
 - }
 - }
 
二、命名管道
服务端:
点击(此处)折叠或打开
- #include <windows.h>
 - #include <stdio.h>
 - /*
 - ** ==========命名管道客户端写法===========
 - ** 1.使用API函数WaitNamedPipe等待一个命名管
 - ** 道实例供自已使用。
 - ** 2.使用API函数CreateFile建立与命名管道的连
 - ** 接。
 - ** 3.使用API函数WriteFile和ReadFile分别向服
 - ** 务器发送数据或从中接收数据。
 - ** 4.使用API函数CloseHandle关闭打开的命名管
 - ** 道会话。
 - ** ========================================
 - */
 - int main(int argc, char *argv[])
 - {
 - HANDLE hClient;
 - BOOL bRet;
 - //WaitNamedPipe等待一个命名管道实例供自己使用
 - bRet = WaitNamedPipe( "\\\\.\\pipe\\mynamedpipe", NMPWAIT_USE_DEFAULT_WAIT );
 - if ( bRet == 0 )
 - {
 - printf( "wait named pipe failed ! \n");
 - return 1;
 - }
 - //CreateFile与服务端建立连接
 - hClient = CreateFile("\\\\.\\pipe\\mynamedpipe",GENERIC_READ|GENERIC_WRITE,
 - 0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
 - if (INVALID_HANDLE_VALUE == hClient)
 - {
 - hClient = NULL;
 - return 2;
 - }
 - char szBuf[256];
 - DWORD nLen;
 - //从管道读取信息
 - ReadFile( hClient, szBuf, 256, &nLen, NULL );
 - szBuf[nLen] = '\0';
 - printf( "%s", szBuf);
 - CloseHandle( hClient );
 - return 0;
 - }
 
客户端:
点击(此处)折叠或打开
- #include <windows.h>
 - #include <stdio.h>
 - /*
 - ** ==========命名管道客户端写法===========
 - ** 1.使用API函数WaitNamedPipe等待一个命名管
 - ** 道实例供自已使用。
 - ** 2.使用API函数CreateFile建立与命名管道的连
 - ** 接。
 - ** 3.使用API函数WriteFile和ReadFile分别向服
 - ** 务器发送数据或从中接收数据。
 - ** 4.使用API函数CloseHandle关闭打开的命名管
 - ** 道会话。
 - ** ========================================
 - */
 - int main(int argc, char *argv[])
 - {
 - HANDLE hClient;
 - BOOL bRet;
 - //WaitNamedPipe等待一个命名管道实例供自己使用
 - bRet = WaitNamedPipe( "\\\\.\\pipe\\mynamedpipe", NMPWAIT_USE_DEFAULT_WAIT );
 - if ( bRet == 0 )
 - {
 - printf( "wait named pipe failed ! \n");
 - return 1;
 - }
 - //CreateFile与服务端建立连接
 - hClient = CreateFile("\\\\.\\pipe\\mynamedpipe",GENERIC_READ|GENERIC_WRITE,
 - 0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
 - if (INVALID_HANDLE_VALUE == hClient)
 - {
 - hClient = NULL;
 - return 2;
 - }
 - char szBuf[256];
 - DWORD nLen;
 - //从管道读取信息
 - ReadFile( hClient, szBuf, 256, &nLen, NULL );
 - szBuf[nLen] = '\0';
 - printf( "%s", szBuf);
 - CloseHandle( hClient );
 - return 0;
 - }
 
【VS开发】 Windows平台下管道的使用的更多相关文章
- Arduino可穿戴开发入门教程Windows平台下安装Arduino IDE
		
Arduino可穿戴开发入门教程Windows平台下安装Arduino IDE Windows平台下安装Arduino IDE Windows操作系统下可以使用安装向导和压缩包形式安装.下面详细讲解这 ...
 - Windows平台下使用pthreads开发多线程应用
		
pthreads简介 POSIX 1003.1-2001标准定义了编写多线程应用程序的API(应用程序编程接口),这个接口通常被称为pthreads.在常见的操作系统中,例如Unix.Linux.Ma ...
 - Windows平台下利用APM来做负载均衡方案 - 负载均衡(下)
		
概述 我们在上一篇Windows平台分布式架构实践 - 负载均衡中讨论了Windows平台下通过NLB(Network Load Balancer) 来实现网站的负载均衡,并且通过压力测试演示了它的效 ...
 - windows平台下基于VisualStudio的Clang安装和配置
		
LLVM 是一个开源的编译器架构,它已经被成功应用到多个应用领域.Clang是 LLVM 的一个编译器前端,它目前支持 C, C++, Objective-C 以及 Objective-C++ 等编程 ...
 - Windows平台下搭建Git服务器的图文教程
		
Git没有客户端服务器端的概念,但是要共享Git仓库,就需要用到SSH协议(FTP , HTTPS , SFTP等协议也能实现Git共享,此文档不讨论),但是SSH有客户端服务器端,所以在window ...
 - 在Windows平台下安装与配置Memcached及C#使用方法
		
1.在Windows下安装Memcached 资料来源:http://www.jb51.net/article/30334.htm 在Windows平台下安装与配置Memcached的方法,Memca ...
 - Windows平台下源码分析工具
		
最近这段时间在阅读 RTKLIB的源代码,目前是将 pntpos.c文件的部分看完了,准备写一份文档记录下这些代码的用处.处理过程.理论公式来源.注意事项,自己还没有弄明白的地方.目前的想法是把每一个 ...
 - Windows平台下搭建Git服务器的图文教程(转发)
		
Git没有客户端服务器端的概念,但是要共享Git仓库,就需要用到SSH协议(FTP , HTTPS , SFTP等协议也能实现Git共享,此文档不讨论),但是SSH有客户端服务器端,所以在window ...
 - 【转载】Windows平台下利用APM来做负载均衡方案 - 负载均衡(下)
		
概述 我们在上一篇Windows平台分布式架构实践 - 负载均衡中讨论了Windows平台下通过NLB(Network Load Balancer) 来实现网站的负载均衡,并且通过压力测试演示了它的效 ...
 
随机推荐
- springmvc接收List型参数长度
			
springmvc默认接收list参数长度为256,过长则报越界异常,添加 @InitBinder public void initBinder(WebDataBinder binder) { // ...
 - 《exception》第九次团队作业:Beta冲刺与验收准备(第三天)
			
一.项目基本介绍 项目 内容 这个作业属于哪个课程 任课教师博客主页链接 这个作业的要求在哪里 作业链接地址 团队名称 Exception 作业学习目标 1.掌握软件黑盒测试技术:2.学会编制软件项目 ...
 - Markdown 设置字体大小颜色及背景色
			
一.更改字体.大小.颜色 <font face="黑体">我是黑体字</font><font face="微软雅黑">我是微 ...
 - hdu6172&&hdu6185&&P5487——BM算法
			
hdu6172 模板的简单应用 先根据题中的表达式求出前几项,再上BM,注意一下n的大小关系. #include <bits/stdc++.h> using namespace std; ...
 - 五.python小数据池,代码块的最详细、深入剖析
			
一,id,is,== 在Python中,id是什么?id是内存地址,那就有人问了,什么是内存地址呢? 你只要创建一个数据(对象)那么都会在内存中开辟一个空间,将这个数据临时加在到内存中,那么这个空间是 ...
 - js解决大文件断点续传
			
最近遇见一个需要上传百兆大文件的需求,调研了七牛和腾讯云的切片分段上传功能,因此在此整理前端大文件上传相关功能的实现. 在某些业务中,大文件上传是一个比较重要的交互场景,如上传入库比较大的Excel表 ...
 - BZOJ 5082: 弗拉格 矩阵乘法
			
如果单点而不是求 sigma 的话还是比较好办的. 遇到这种前缀和相减的矩阵乘法可以增设一个 0 使得后面的能先加到前面,然后再算. 这样的话可以使的最后算出的是前缀和相加的形式. code: #in ...
 - BZOJ 3672: [Noi2014]购票 树上CDQ分治
			
做这道题真的是涨姿势了,一般的CDQ分治都是在序列上进行的,这次是把CDQ分治放树上跑了~ 考虑一半的 CDQ 分治怎么进行: 递归处理左区间,处理左区间对右区间的影响,然后再递归处理右区间. 所以, ...
 - 洛谷 P3197 [HNOI2008]越狱 题解
			
P3197 [HNOI2008]越狱 题目描述 监狱有连续编号为 \(1-N\) 的 \(N\) 个房间,每个房间关押一个犯人,有 \(M\) 种宗教,每个犯人可能信仰其中一种.如果相邻房间的犯人的宗 ...
 - 守护进程daemon.c
			
它的特点是:•不占用控制终端(后台运行)•独立于控制终端•周期性运行 #include<stdio.h>#include<unistd.h>#include<fcntl. ...