开发者社区> jxy> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

进程通信系列-命名管道

简介:
+关注继续查看
命名管道作为一种通信方法,有其独特的优越性,这主要表现在它不完全依赖于某一种协议,而是适用于任何协议——只要能够实现通信。
  命名管道具有很好的使用灵活性,表现在:
  1) 既可用于本地,又可用于网络。
  2) 可以通过它的名称而被引用。
  3) 支持多客户机连接。
  4) 支持双向通信。

  5) 支持异步重叠I/O操作。

代码长度长

命名管道类

#include "stdafx.h"
#include "guandao.h"

guandao::guandao(void)
{
	hpipe=NULL;
	flag=0;
}


guandao::~guandao(void)
{
	if(hpipe)
		CloseHandle(hpipe);
}

int guandao::free()
{
	CloseHandle(hpipe);
	hpipe=NULL;
	return 1;
}

int guandao::have()
{
	if(!hpipe)return 0;
	char 	 szOutput[1024+10];
	DWORD 	 cntReadedChar=0;
	long a=PeekNamedPipe(hpipe, szOutput, 1, &cntReadedChar, NULL, 0);
	if(szOutput[0] ==-52)
		 return 0;
	return 1;
}


int guandao::create(CString sever,CString name )
{
	hpipe=CreateNamedPipe("\\\\"+sever+"\\pipe\\"+name,PIPE_ACCESS_DUPLEX|FILE_FLAG_OVERLAPPED,0,1,1024,1024,500,NULL);
	if(hpipe==INVALID_HANDLE_VALUE)
	{
		MessageBox(NULL,"创建命名管道"+name+"失败","error",MB_ICONERROR);
		hpipe=NULL;
		return 0;
	}
	//创建匿名人工重置对象
	HANDLE hevent;
	hevent=CreateEvent(NULL,true,false,NULL);
	if(!hevent)
	{
		MessageBox(NULL,"创建事件对象失败","error",MB_ICONERROR);
		CloseHandle(hpipe);
		hpipe=NULL;
		return 0;
	}
	OVERLAPPED ovlap;
	ZeroMemory(&ovlap,sizeof(OVERLAPPED));
	ovlap.hEvent=hevent;
	MessageBox(NULL,"等待客户端","ok",MB_ICONINFORMATION);
	if(!ConnectNamedPipe(hpipe,&ovlap))
	{
		if(ERROR_IO_PENDING!=GetLastError())
		{
			MessageBox(NULL,"等待客户端失败","error",MB_ICONERROR);
			CloseHandle(hpipe);
			CloseHandle(hevent);
			hpipe=NULL;
			return 0;
		}
	}
	if(WAIT_FAILED==WaitForSingleObject(hevent,INFINITE))
	{
			MessageBox(NULL,"等待对象失败","error",MB_ICONERROR);
			CloseHandle(hpipe);
			CloseHandle(hevent);
			hpipe=NULL;
			return 0;
	}
	CloseHandle(hevent);
	MessageBox(NULL,"创建完成","ok",MB_ICONINFORMATION);
	flag=1;
	return 1;
}
CString guandao::read()
{
	char s[200];
	DWORD d;
	if(!ReadFile(hpipe,s,200,&d,NULL))
	{
		MessageBox(NULL,"读取数据失败","error",MB_ICONERROR);
		return "";
	}
	return s;
}
int guandao::write(CString content)
{
	DWORD d;
	if(!WriteFile(hpipe,content,content.GetLength()+1,&d,NULL))
	{
		MessageBox(NULL,"写入数据失败","error",MB_ICONERROR);
		return 0;
	}
	return 1;
}
int guandao::connect(CString sever,CString name )
{
	if(flag)
	{
		MessageBox(NULL,"已创建管道","error",MB_ICONERROR);
		return 0;
	}
	CString nn="\\\\"+sever+"\\pipe\\"+name;
	if(!WaitNamedPipe(nn,500))
	{
		MessageBox(NULL,"无可用管道","error",MB_ICONERROR);
		return 0;
	}
	hpipe=CreateFile(nn,GENERIC_ALL,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
	if(hpipe==INVALID_HANDLE_VALUE)
	{
		MessageBox(NULL,"链接命名管道"+name+"失败","error",MB_ICONERROR);
		hpipe=NULL;
		return 0;
	}
	//MessageBox(NULL,"链接完成","ok",MB_ICONINFORMATION);
	return 1;
}


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
进程间通信
1.无名管道  int pipe(int pipefd[2]); 参数: @pipefd 获得操作管道的文件描述符  返回值: 成功返回0, 失败返回-1  特点: .
637 0
C#中使用命名管道进行进程通信的实例
原文: C#中使用命名管道进行进程通信的实例 1 新建解决方案NamedPipeExample 在解决方案下面新建两个项目:Client和Server,两者的输出类型均为“Windows 应用程序”。
1110 0
进程间通信
在用户应用程序在经常用到C库的进程间通信函数,实际上,这些进程间通信函数在内核中是通过系统调用好文件系统的机制实现的。 1 管道 管道是只用于连接读进程和写进程,以实现它们之间通信的共享文件。因而它又称共享文件。
834 0
进程间通信之管道
      管道是linux的一种通信方式,一种两个进程间进行单向通信的机制,它提供了简单的流控制机制,系统提供了pipe生成一个管道并返回两个描述符,一 个用来读管道,一个用来写管道,因此它们可以共享访问文件,这样每个管道就可以有很多个读进程和写进程,然而实际上进程不知道它正在读或写的是一个管道...
873 0
进程通信
  进程间通信就是在不同进程之间传播或交换信息,进程间控制信息的交换称为低级通信,进程间大批量数据的交换称为高级通信。 进程通信分为3种: 1.共享存储器系统:为了传送大量数据,在存储器中划出一块共享存储区,诸进程可通过对共享存储区进行读数据或写数据以实现通信。
659 0
进程及进程间通信
基础知识 1.进程:具有独立功能的程序在一个数据集合上一次动态的执行过程。通俗点讲就是“一个正在运行的程序” 2.程序:静态的程序以文件的形式保存在磁盘上。 3.操作系统的进程管理: 每一个正在运行的程序都对应着一个独立的进程,当这些程序装入内存开始执行时,操作系统会为每个进程创建好相关的数据结构。
1120 0
利用命名管道实现进程之间的通信 .........
  /*   命名管道不仅可以实现 本地进程之间的通信还可以实现网络进程的通信   与油槽不同的是 管道式基于面向连接的可靠的通信 只能一对一传输 数据   我们可以通过      CreateNamedPipe()创建一个管道 ,可以指定模式是双向 即客户端 和服务端都可以进...
729 0
+关注
jxy
176
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载