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

9、进程通信之命名管道

简介: 命名管道是通过网络来完成进程间的通信,它屏蔽了底层的网络协议细节。我们在不了解网络协议的情况下,也可以利用命名管道来实现进程间的通信。 命名管道充分利用了Windows NT和Windows 2000内建的安全机制。
+关注继续查看

命名管道是通过网络来完成进程间的通信,它屏蔽了底层的网络协议细节。我们在不了解网络协议的情况下,也可以利用命名管道来实现进程间的通信。<?xml:namespace prefix = o />

命名管道充分利用了Windows NTWindows 2000内建的安全机制。

将命名管道作为一种网络编程方案时,它实际上建立了一个客户机/服务器通信体系,并在其中可靠地传输数据。

命名管道是围绕Windows文件系统设计的一种机制,采用命名管道文件系统(Named Pipe File SystemNPFS)”接口,因此,客户机和服务器可利用标准的Win32文件系统函数(例如:ReadFileWriteFile)来进行数据的收发。

命名管道服务器和客户机的区别在于:服务器是唯一一个有权创建命名管道的进程,也只有它才能接受管道客户机的连接请求。而客户机只能同一个现成的命名管道服务器建立连接。

命名管道服务器只能在Windows NTWindows 2000上创建。

命名管道提供了两种基本通信模式:字节模式和消息模式。在字节模式中,数据以一个连续的字节流的形式,在客户机和服务器之间流动。而在消息模式中,客户机和服务器则通过一系列不连续的数据单位,进行数据的收发,每次在管道上发出了一条消息后,它必须作为一条完整的消息读入。

HANDLE CreateNamedPipe()

CreateNamedPipe,创建命名管道,其中第一个参数管道的名称是格式为"\\.\pipe\pipename", VC中使用的时候,因涉及到转义符,作为字符串,应使用"\\\\.\\pipe\\pipename",其中pipe不能更改,大小写没有区分

hPipe=CreateNamedPipe("\\\\.\\pipe\\MyPipe",PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED,0,1,1024,1024,0,NULL);

if(INVALID_HANDLE_VALUE==hPipe)

{

MessageBox("创建命名管道失败!");

CloseHandle(hPipe);

hPipe=NULL;

return;

}

HANDLE hEvent;

hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);

if(!hEvent) 

{

MessageBox("创建事件对象失败!");

CloseHandle(hPipe);

hPipe=NULL;

return;

}

OVERLAPPED ovlap;

//这里调用ZeroMemory和上一章的意义是一样的,为了避免ConnectNamedPipe在调用该结构中使用的是一些不可欲知的参数值,防止有影响

ZeroMemory(&ovlap,sizeof(OVERLAPPED));

ovlap.hEvent=hEvent;

说明:等待客户端连接到一个命名管道实例。If hNamedPipe was created with FILE_FLAG_OVERLAPPED and lpOverlapped is not NULL, the OVERLAPPED structure

pointed to by lpOverlapped must contain a handle to a manual-reset event object (which the server can create by using the CreateEvent function).

这是为什么上面需要申明一个自动的事件的对象。

The ConnectNamedPipe function enables a named pipe server process to wait for

a client process to connect to an instance of a named pipe.

if(!ConnectNamedPipe(hPipe,&ovlap))

{

if(ERROR_IO_PENDING!=GetLastError())

{

MessageBox("等待客户端的连接失败!");

CloseHandle(hPipe);

CloseHandle(hEvent);

hPipe=NULL;

}

}

//等待事件状态有效,如果当前无效,INFINITE参数表明则一直等待下去

if(WAIT_FAILED==WaitForSingleObject(hEvent,INFINITE))

{

MessageBox("等待对象失败!");

CloseHandle(hPipe);

CloseHandle(hEvent);

hPipe=NULL;

}

CloseHandle(hEvent); //说明已经有客户端连接到了

命名管道的读写和上一章是类似的,这里就省略掉了

命名管道的客户端实现(核心为命名管道的连接):

//WaitNamePipe的参数NMPWAIT_WAIT_FOREVER一直等待下去,直到等待到可用的连接,当然也可以设置超时的时间,但前提是所有的程序里所有的命名管道的超时时间必须一样

if(!WaitNamedPipe("\\\\.\\pipe\\MyPipe",NMPWAIT_WAIT_FOREVER))

{

MessageBox("当前没有可用的命名管道实例");

return;

}

//打开命名管道,建立连接

hPipe=CreateFile("\\\\127.0.0.1\\pipe\\MyPipe",GENERIC_READ|GENERIC_WRITE, 0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);

if(INVALID_HANDLE_VALUE==hPipe)

{

MessageBox("打开命名管道失败!");

hPipe=NULL;

}

注意:程序的运行方式为先点击服务端的创建命名管道,然后点击客户端的连接管道,再点击服务端的发送数据,再在客户端点击接收数据。

参考

1MSDN

2]《VC++ 深入》

3http://blog.csdn.net/liufei_learning/archive/2009/12/17/5026410.aspx

 

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

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