admin 管理员组文章数量: 1086019
2024年3月13日发(作者:bat各种代码自己玩的)
C++与C#进程通信案例[附源码]
最新C++与C#进程通信案例源码,欢迎在线学习c++ 教程.“命名管道”是一
种简单的进程间通信(IPC)机制。命名管道可在同一台计算机的不同进程之间,
或在跨越一个网络的不同计算机的不同进程之间,支持可靠的、单向或双向的数
据通信。用命名管道来设计应用程序实际非常简单,并不需要事先深入掌握基层
网络传送协议(如TCP/IP或IPX)的知识。因为命名管道利用了微软网络提供
者(MSNP)重定向器,通过一个网络,在各进程间建立通信。这样一来,应用程
序便不必关心网络协议的细节。
命令管道是围绕Windows文件系统设计的一种机制,采用“命名管道文件系
统”(NamedPipeFileSystem,NPFS)接口。因此,客户机和服务器应用可利用标
准的Win32文件系统API函数(如ReadFile和WriteFile)来进行数据的收发。
通过这些API函数,应用程序便可直接利用Win32文件系统命名规范,以及
WindowsNT/Windows2000文件系统的安全机制。NPFS依赖于MSNP重定向器在网
上进行命名管道数据的发送和接收。这样一来,便可实现接口的“与协议无关”
特性:若在自己开发的应用程序中使用命名管道在网上不同的进程间建立通信,
程序员不必关心基层网络传送协议(如TCP和IPX等等)的细节。
客户机和服务器
命名管道最大的特点便是建立一个简单的客户机/服务器程序设计体系。在
这个体系结构中,在客户机与服务器之间,数据既可单向传递,亦可双向流动。
对命名管道 服务器和客户机来说,两者的区别在于:服务器是唯一一个有权创
建命名管道的进程,也只有它才能接受管道客户机的连接请求。对一个客户机应
用来说,它只能同 一个现成的命名管道服务器建立连接。在客户机应用和服务
器应用之间,一旦建好连接,两个进程都能对标准的Win32函数,在管道上进行
数据的读取与写入。这些函数包括ReadFile和WriteFile等等。
服务器
要想实现一个命名管道服务器,要求必须开发一个应用程序,通过它创建命
名管道的一个或多个“实例”,再由客户机进行访问。对服务器来说,管道实例
实际就是一个句柄,用于从本地或远程客户机应用接受一个连接请求。按下述步
骤行事,便可写出一个最基本的服务器应用:
1)使用API函数CreateNamedPipe,创建一个命名管道实例句柄。
2)使用API函数ConnectNamedPipe,在命名管道实例上监听客户机连接请
求。
3)使用API函数ReadFile,从客户机接收数据;使用API函数WriteFile,
将数据发给客户机。
4)使用API函数DisconnectNamedPipe,关闭命名管道连接。
5)使用API函数CloseHandle,关闭命名管道实例句柄。
首先,我们的服务器进程需要使用CreateNamedPipe这个API调用,创建一
个命名管道实例。
下面给出CreateNamedPipe()的函数原型:
HANDLE CreateNamedPipe(LPCTSTR lpName, //指向管道名称的指针
DWORD dwOpenMode, //管道打开模式
DWORD dwPipeMode, //管道模式
DWORD nMaxInstances, //最大实例数
DWORD nOutBufferSize, //输出缓存大小
DWORD nInBufferSize, //输入缓存大小
DWORD nDefaultTimeOut,//超时设置
LPSECURITY_ATTRIBUTES lpSecurityAttributes
//安全属性指针 );
其中几个主要参数如下:
lpName是管道的名称,命名管道的命名采用如下格式:
ServerNamePipePipeName
其中,第一部分ServerName指定了服务器的名字,命名管道服务即在此
服务器创建,而且要由它对进入的连接请求进行“监听”,其字串部分可表示为
一个小数点”.”(表示本机)、星号(当前网络字段)、域名或是一个真正的
服务;第二部分Pipe是一个不可变化的硬编码字串,以指出该文件是从属于
NPFS,不区分大小写;第三部分PipeName则是应用程序可以唯一定义及标识一
个命名管道的名字,而且可以设置多级目录。
dwOpenMode参数用于指示一个管道创建好之后,它的传输方向、I/O控制以
及安全模式。PIPE_ACCESS_标志决定了在客户机与服务器之间,数据在管道上的
流动方向。可用PIPE _ACCESS_DUPLEX标志以双向传输方式打开一个管道。也就
是说,在客户机与服务器之间,数据可以双向传输。除此以外,亦可使用
PIPE_ACCESS_INBOUND或者PIPE_ACCESS_OUTBOUND标志,以单向传输方式打开
一个管道。也就是说,数据只能从客户机传向服务器,或从服务器传向客户机。
dwPipeMod命名管道提供了两种基本的通信模式:字节模式
(PIPE_TYPE_BYTE)和消息模式(PIPE_TYPE_MESSAGE)。 在字节模式中,信息
以连续字节流的形式在客户与服务器之间流动,这也就意味着,对于客户机应用
和服务器应用,在任何一个特定的时间段内,都无法准确知道有 多少字节从管
道中读出或写入。在这种通信模式中,一方在向管道写入某个数量的字节后,并
不能保证管道另一方能读出等量的字节。对于消息模式,客户机和服务 器则是
通过一系列不连续的数据包进行数据的收发。从管道发出的每一条消息都必须作
为一条完整的消息读入。
其他的函数及其参数含义详见msdn,此处不一一讲解。
服务器调用该函数,如果在已定义超时值变为零以前,有一个实例管道可以
使用,则创建成功并返回管道句柄,以此侦听来自客户机的连接请求。
客户机
版权声明:本文标题:C++与C#进程通信案例[附源码] 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://roclinux.cn/p/1710260143a564890.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论