进程通信系列-命名管道

简介:
+关注继续查看
命名管道作为一种通信方法,有其独特的优越性,这主要表现在它不完全依赖于某一种协议,而是适用于任何协议——只要能够实现通信。
  命名管道具有很好的使用灵活性,表现在:
  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月前
|
Linux
【进程间通信:管道】(二)
【进程间通信:管道】(二)
27 0
|
1月前
|
消息中间件 Unix Linux
【进程间通信:管道】(一)
【进程间通信:管道】(一)
21 0
|
2月前
|
消息中间件 Unix Linux
Linux进程间通信【匿名管道和命名管道】
Linux进程间通信,包括匿名管道和命名管道的原理、操作及实现,两种管道实现进程池等丰富内容,详细讲解,干货满满!
67 2
Linux进程间通信【匿名管道和命名管道】
|
4月前
|
消息中间件 Unix Linux
进程间通信之管道(匿名管道与命名管道)
首先我们先提出一个问题:进程之间为什么无法直接通信,而需要操作系统提供通信方式: 经过我们上一个博客学习我们可以知道,每个进程都有独立的虚拟地址空间,一个进程在访问一个数据的时候都是通过地址来进行访问的,进过页表映射在之后访问物理内存,因此如果想要给另一个进程传递一个数据,就要把它的地址空间传递给其他进程,因为a进程的是虚拟地址,所以b进程经过页表映射也访问不了。(这个设计的初衷是:独立虚拟空间可以更稳定)
46 0
|
7月前
|
Linux Shell
【Linux进程间通信】三、FIFO命名管道
【Linux进程间通信】三、FIFO命名管道
68 0
【Linux进程间通信】三、FIFO命名管道
进程间通信:命名管道
一、命名管道(FIFO) 匿名管道应用的一个限制就是只能在具有共同祖先(具有亲缘关系)的进程间通信。如果我们想在不相关的进程之间交换数据,可以使用FIFO文件来做这项工作,它经常被称为命名管道。 命名管道可以从命令行上创建,命令行方法是使用下面这个命令:$ mkfifo filename命名管道也可以从程序里创建,相关函数有:int mkfifo(const char *filename,mode_t mode);   二、命名管道和匿名管道 匿名管道由pipe函数创建并打开。
952 0
|
C# Windows
C#中使用命名管道进行进程通信的实例
原文: C#中使用命名管道进行进程通信的实例 1 新建解决方案NamedPipeExample 在解决方案下面新建两个项目:Client和Server,两者的输出类型均为“Windows 应用程序”。
1220 0
相关产品
机器翻译
推荐文章
更多