【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) 来实现网站的负载均衡,并且通过压力测试演示了它的效 ...
随机推荐
- 次小生成树(lca)
题目描述 原题来自:BeiJing 2010 组队赛 给定一张 N 个点 M 条边的无向图,求无向图的严格次小生成树. 设最小生成树的边权之和为 sum,严格次小生成树就是指边权之和大于 sum 的生 ...
- less-3
首先来了解语句构造方法: 我们输入id=1可以看到未报错,输入id=1’报错,输入id=1’’未报错. 再对比下之前我们在less-1中的报错信息(如下图),可以看到,在less-3中报错信息中“1” ...
- Centos7.6安装docker-compose
官网地址:https://docs.docker.com/compose/install/ 运行此命令以下载Docker Compose的当前稳定版本 sudo curl -L "https ...
- CentOS7.6使用Virt-manager创建虚拟机报错
Virt-manager创建虚拟机遇到的一个问题解决 环境:centos7.6 系统内核:3.10.0-957.el7.x86_64 virsh version 根据库编译:libvirt 4.5.0 ...
- 学习Spring-Data-Jpa(十二)---投影Projections-对查询结果的扩展
Spring-Data数据查询方法的返回通常的是Repository管理的聚合根的一个或多个实例.但是,有时候我们只需要返回某些特定的属性,不需要全部返回,或者只返回一些复合型的字段.Spring-D ...
- LeetCode 919. Complete Binary Tree Inserter
原题链接在这里:https://leetcode.com/problems/complete-binary-tree-inserter/ 题目: A complete binary tree is a ...
- 详解如何在CentOS7中使用Nginx和PHP7-FPM安装Nextcloud
转载地址:https://www.jb51.net/article/109382.htm 这篇文章主要介绍了详解如何在CentOS7中使用Nginx和PHP7-FPM安装Nextcloud,会通过 N ...
- Cogs 727. [网络流24题] 太空飞行计划(最大权闭合子图)
[网络流24题] 太空飞行计划 ★★☆ 输入文件:shuttle.in 输出文件:shuttle.out 简单对比 时间限制:1 s 内存限制:128 MB [问题描述] W 教授正在为国家航天中心计 ...
- C#程序发送POST请求数据中+号丢失解决方案
C#程序把RSA加密后的密码发送到后台总是校验失败,用wireshark抓包检查发现POST发出的密码中的+号都变成了空格.为了正确的发送数据,要用URL转码协议进行转码. 有两个方法进行URL转码 ...
- Idea 编译项目异常 Error:java: Compilation failed: internal java compiler error