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//安全属性指针 );
C++和C#进程间通过命名管道来通信(附源码)—上
www.firnow.com 时间 : 2009-01-27 作者:佚名 编辑:辉辉 点击: 2894 [ 评论 ]
-
-
其中几个主要参数如下:
lpName是管道的名称,命名管道的命名采用如下格式:
\\ServerName\Pipe\PipeName
其中,第一部分\\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,此处不一一讲解。
服务器调用该函数,如果在已定义超时值变为零以前,有一个实例管道可以使用,则创建成功并返回管道句柄,以此侦听来自客户机的连接请求。
客户机
实现一个命名管道客户机时,要求开发一个应用程序,令其建立与某个命名管道服务器的连接。注意客户机不可创建命名管道实例。然而,客户机可打开来自服务器的、现成的实例。下述步骤讲解了如何编写一个基本的客户机应用:
1)用API函数WaitNamedPipe,等候一个命名管道实例可供自己使用。
2)用API函数CreateFile,建立与命名管道的连接。
3)用API函数WriteFile和ReadFile,分别向服务器发送数据,或从中接收数据。
4)用API函数CloseHandle,关闭打开的命名管道会话。
建立一个连接之前,客户机需要用WaitNamedPipe函数,检查是否存在一个现成的命名管道实例。WaitNamedPipe成功完成后,客户机需要用CreateFile这个API函数,打开指向服务器命名管道实例的一个句柄。
简单说来,服务器调用CreateNamedPipe来创建管道,如果在已定义超时值变为零以前,有一个实例管道可以使用,则创建成功并返回管道句柄,以此侦听来自客户机的连接请求。另一方面,客户机通过函数WaitNamedPipe()使服务器进程等待来自客户的实例连接。如果在超时值变为零以前,有一个管道可供连接使用,则函数将成功返回,并通过调用CreateFile()或CallNamedPipe()来呼叫对服务器的连接。此时服务器将接受客户的连接请求,成功建立连接,服务器调用的等待客户机建立连接的ConnectNamedPipe()函数也将成功返回。然后,管道两端就可以进行通信了。
从调用时序上看,首先是客户机通过WaitNamedPipe()使服务器的CreateFile()在限时时间内创建实例成功,然后双方通过ConnectNamedPipe()和CreateFile()成功连接,在返回用以通信的文件句柄后,客户、服务双方即可进行通信。
在建立了连接后,客户机与服务器即可通过ReadFile()和WriteFile()并利用得到的管道句柄,以文件读写的形式彼此间进行信息交换。当客户与服务器的通信结束,或是由于某种原因一方需要断开时,由客户机调用CloseFile()函数关闭打开的管道句柄,服务器随即调用DisconnectNamedPipe()函数。当然,服务器也可以通过单方面调用DisconnectNamedPipe()来终止连接。在终止连接后调用函数CloseHandle()来关闭此管道。
下篇将给出的程序清单即是按照上述方法实现的命名管道服务器和客户机进行通信的程序实现代码:
文章出处:飞诺网(www.firnow.com):http://dev.firnow.com/course/4_webprogram/asp.net/netjs/2008619/126688_2.html
分享到:
相关推荐
在Windows系统中,命名管道被广泛用于不同进程间的通信,尤其是跨语言的通信场景,如C#和C++。 在C#中,命名管道的实现主要依赖于`System.IO.Pipes`命名空间,其中`NamedPipeServerStream`和`NamedPipeClientStream...
### C++和C#进程之间通过命名管道通信详解 #### 一、命名管道简介 **命名管道**(Named Pipe)是一种进程间通信(IPC)机制,允许不同进程间进行可靠的数据传输。它不仅可以在同一台计算机上的不同进程之间工作,...
只需确保C#端也支持命名管道通信,并且双方使用的管道名称一致。 QT与QT的通信同样可以利用命名管道,这在多进程QT应用中很有用,比如当需要将数据从一个进程传递到另一个进程,或者在不同线程之间同步时。通过创建...
以上代码展示了基本的命名管道通信过程,但实际应用中可能需要处理更多细节,如错误检查、多线程、数据格式转换等。在C++和C#之间使用命名管道进行通信,可以实现高效且低延迟的数据交换,尤其适用于在同一台计算机...
这些程序可能使用了诸如C++、C#或.NET Framework等编程语言编写,利用Windows API函数如CreateNamedPipe和ConnectNamedPipe等来实现命名管道的创建和连接。 在实际开发中,进程通讯和命名管道的运用能够帮助我们...
标题中的“多线程全双工命名管道实现进程通信”是指在编程中使用多线程技术结合命名管道来实现不同进程间的双向通信。这是一种高效、可靠的数据交换方式,尤其适用于在同一台计算机上运行的多个程序之间。 命名管道...
本资源提供了C#和C++两种编程语言实现的管道通信源码,包括命名管道和匿名管道的实例,所有代码都已经过测试,可以直接应用于实际项目。 1. **管道通信基础** - **管道定义**:管道是一种半双工通信方式,允许数据...
在C++和C#中,都可以通过API调用来创建和使用命名管道。 对于C++程序,我们可以利用Windows API中的`CreateNamedPipe`函数来创建管道,然后使用`ConnectNamedPipe`等待连接。一旦C#程序通过`CreateFile`函数连接到...
在C++和C#之间使用命名管道通信,可以创建跨语言的进程间通信解决方案。源码通常包含服务器端代码,负责创建和管理管道,以及客户端代码,用于连接管道并进行数据交互。这样的案例对于分布式系统、服务间通信或跨...
在这个实例中,我们将探讨如何使用VC++(Visual C++)作为服务器端,C#作为客户端,通过命名管道实现进程间的通信。首先,我们需要理解管道通信的基本概念。 管道是一种半双工通信机制,允许数据在一个方向上流动,...
总的来说,Windows平台上的命名管道和RPC提供了强大的进程间通信能力,它们不仅能够实现实时的数据传输,还能够支持复杂的跨进程功能调用。开发者可以根据实际需求,灵活选择和组合这两种技术,以构建高效、可靠的...
进程通信是多任务操作系统中不同进程...套接字适合跨网络的通信,内存映射适用于高效的数据共享,而命名管道则为无亲缘关系进程间的简单通信提供了便利。理解并熟练掌握这些技术对于开发高并发、分布式系统至关重要。
总之,C#提供了丰富的工具和技术来进行进程间通信,包括.NET Remoting、调用WinAPI函数以及管道通信。了解并熟练掌握这些技术,将有助于开发出更加健壮、高效的跨进程解决方案。在实际项目中,根据需求选择最适合的...
本例程"DemoConnectionPipe"很可能是提供了一个简单的命名管道通信的示例代码。在www.pudn.com.txt文件中,可能包含了更详细的代码解释和使用方法。这个文件可能包含了如何创建管道、如何连接管道、如何读写数据以及...
在给定的"C#进程间通信.pdf"中,主要介绍了通过C#的`Process`类结合Win32 API函数来实现实时的数据传输。 首先,我们要理解进程间通信的基本概念。每个进程都有自己的独立内存空间,无法直接访问其他进程的内存。...
- `CreatePipe`和`ReadFile`/`WriteFile`组合实现管道通信,允许数据在进程间传递。 - `CreateProcess`和`WaitForInputIdle`启动新的进程并等待其准备好接收消息。 - `WM_COPYDATA`消息通过`SendMessage`函数发送...
- 进程间通信有多种方式,如管道、命名管道、内存映射文件、套接字等,选择哪种方式取决于具体的需求和场景。 - 使用`SendMessage`进行进程间通信时,需要注意同步问题,因为发送的消息会被接收进程的窗口消息队列...
- **客户机/服务器模型**:命名管道通信通常基于客户机/服务器模型,服务器创建管道并接受连接请求,客户端连接到已存在的命名管道。 - **使用标准文件API**:可以通过使用标准的Win32文件系统API(如ReadFile和...
管道通信是一种在多进程或多线程环境中实现进程间通信(IPC, Inter-Process Communication)的有效方式。在操作系统中,管道通常用于连接不同进程的数据流,使得数据可以在它们之间传递。这种通信机制允许一个进程的...
命名管道是Windows操作系统提供的一种进程间通信(IPC,Inter-Process Communication)机制,适用于在同一台计算机上的不同进程之间交换数据。在WCF中,命名管道传输方式是一种高效且可靠的通信机制,尤其适用于同一...