MSDN官网: Interprocess Communications - Win32 apps | Microsoft Docs
- Clipboard
- COM
- Data Copy: 使用WM_COPYDATA消息(基于Windows的消息相关功能:SendMessage、FindWindowA等 ),枚举找到窗囗…………基于Windows的消息机制,快速发送消息给另外一个应用 SendMessage只是调用我们的消息处理函数(即WndProc函数),处理函数处理完后SendMessage才返回;而PostMessage只是将消息放到消息队列中,然后立刻返回,至于消息何时被处理,PostMessage完全不知道。 详细代码参考
- DDE : 是Clipboard的扩展,数据格式和Clipboard一样的,基于消息的协议;不如新技术高效;提供同一电脑或同一网络的不同电脑的应用间通信.
- File Mapping :内存共享(C# 进程间共享内存通信方式),是在同一电脑上提供在两个或多个进程间高效共享数据的方式,但要自己控制同步。适用于共享大量数据。代码参考样例
- Mailslots : one-way单向的,提供一种简单的方式让应用程序间发送或接收消息。可发送消息到指定电脑或广播消息到网络域上的所有电脑,但是基于 datagram 的,不能保证接收方能接收到。
缺点:只允许从客户机到服务器,建立一种不可靠的单向数据通信。不提供数据可靠性传播的保障。
邮件槽是围绕Windows文件系统接口设计出来的。客户机和服务器应用需要使用标准的Win32文件系统I/O函数,如ReadFile和WriteFile等,以便在邮件槽上收发数据,同时利用Win32文件系统的命名规则。
- Pipes:管道分为普通管道(windows下叫'匿名管道') 和 命名管道(双向的)
- RPC :windows下叫.NET Remoting
- Windows Sockets
RPC调用:采用Remoting对象以RPC管道形式对各种应用程序之间实现跨进程调用。在实际系统中,跨进程调用其另一程序的某一函数,经常有遇到,特别是在给某一系统添加外部辅助程序和引入第三方程序时会用到。 RPC调用分为异步和同步。
RPC(.NET Remoting) :远程过程调用,利用Windows底层的IPC系统传送消息(有序列化/解序列化过程),通过通道(Channel)传输;
实现原理 :建立一个公用的对象,该对象在服务端声明并共享出去,各个进程可以取到这个公共的对象,并修改该对象。如希望实现一个进程调用另一个进程,那么使用代理来实现该目的。 基本特点:跨平台、跨语言、穿透企业防火墙。
当在同一主机上不同应用(域)之间的传输时,比 TCP 或 HTTP channels要快得多。
默认使用binary二进制来传输;还有soap(基于xml)和json.
Remoting的通道主要有两种:Tcp和Http。以及不常用的IPC通道。
主要的类有IpcServerChannel 和 IpcClientChannel两个类:
///两边传输的对象,可build成dll,两边直接引用
public class RemoteObject : MarshalByRefObject
{
public RemoteObject()
{
Console.WriteLine("Constructor called");
}
public string Greeting(string name)
{
Console.WriteLine("Greeting called");
return "Hello," + name;
}
}
///Server端
static void Main(string[] args)
{
//Instantiate our server channel.
IpcServerChannel channel = new IpcServerChannel("ServerChannel");
//Register the server channel.
ChannelServices.RegisterChannel(channel, false);
//Register this service type.
RemotingConfiguration.RegisterWellKnownServiceType(typeof(RemoteObject), "RemoteObject", WellKnownObjectMode.SingleCall);
Console.WriteLine("press return to exit");
Console.ReadLine();
}
///Client端
static void Main(string[] args)
{
//Create an IPC client channel.
IpcClientChannel channel = new IpcClientChannel();
//Register the channel with ChannelServices.
ChannelServices.RegisterChannel(channel, false);
RemoteObject obj = (RemoteObject)Activator.GetObject(typeof(RemoteObject), "ipc://ServerChannel/RemoteObject");
if (obj == null)
{
Console.WriteLine("could not locate server");
return;
}
for (int i = 1; i < 5; i++)
{
Console.WriteLine(obj.Greeting("mmpire"));
}
}
匿名管道:只能用在父子进程之间;命名管道可以用在两个进程甚至跨服务器通信。
Unix中叫做普通管道,使用pipe()和fork()等相关API。 Windows下叫作匿名管道
命名管道:Windows C++版是wind32的API ; .NET版需要.NET 3.5才支持NamedPipeServerStream 和 NamedPipeClientStream。
实际是基于TCP/IP 来连接. 且端口为 445
应用:实现局域网上两台主机间文件拷贝。可用在同一台计算机不同进程间,也可用在不同计算机的不同进程间,可以是单向的,也可以是双向的,Windows NT/ 2000/ 95/ 98均提供了对它的支持,而且在Unix下也有类似的概念。它是在Microsoft LAN管理器和IBMLAN服务器网络操作系统上实现的。
命名管道使用了MSNP(微软网络提供者)重定向器,这样应用程序便可以不用了解网络协议的细节而利用该机制实现网络上的数据传输。它采用“命名管道文件系统”(Named Pipe File System)接口,其命名是采用UNC(通用命名规范)格式的:
\\ServerName\Pipe\[pipename]
\\ServerName
命令管道是围绕Windows文件系统而设计的一种机制,采用的是命名管道文件系统(NamedPipe File System,NPFS)接口。对数据的收发也采用文件读写函数ReadFile()和WriteFile()来完成。在设计上,由于命名管道也利用了微软网络提供者(MSNP)重定向器,因此无需涉及底层的通信协议细节
写操作中一次最大只能写64K字节的数据
命名管道有两种基本通信模式:字节模式和消息模式。在字节模式中,数据是以字节流的形式在管道种传输,数据之间没有边界,在管道写入和读出操作中是以 字节流即数据块为基本单位操作的,这适合传输大容量数据(不能保证管道另一方能读出等量的字节)。在消息模式中,数据是以一条条不连续的消息为基本传输单元,消息和消息之间有边界,在管道写入和 读出操作中也是以(一条完整的)消息为单位进行操作的,这种方式适合传输量小的数据。因为现在的文件大小常常有几百K甚至更大,所以程序中选择使用字节模式.
HANDLE CreateNamedPipe(
LPCTSTR lpName, // pointer to pipe name
DWORD dwOpenMode, // pipe open mode
DWORD dwPipeMode, // pipe-specific modes
DWORD nMaxInstances, // maximum number of instances
DWORD nOutBufferSize, // output buffer size, in bytes
DWORD nInBufferSize, // input buffer size, in bytes
DWORD nDefaultTimeOut, // time-out time, in milliseconds
LPSECURITY_ATTRIBUTES lpSecurityAttributes // pointer to security attributes
); //详见:命名管道编程的原理及实现(3)_king_新浪博客
服务端(C++)的步骤:
1)使用API函数CreateNamedPipe,创建一个命名管道实例句柄。
2)使用API函数ConnectNamedPipe,在命名管道实例上监听客户机连接请求。
3)使用API函数ReadFile,从客户机接收数据;使用API函数WriteFile,将数据发给客户机。
4)使用API函数DisconnectNamedPipe,关闭命名管道连接。
5)使用API函数CloseHandle,关闭命名管道实例句柄。
客户端(C++)的步骤:
注意客户机不可创建命名管道实例。然而,客户机可打开来自服务器的、现成的实例。下述步骤讲解如何编写一个基本的客户机应用:
1)用API函数WaitNamedPipe,等候一个命名管道实例可供自己使用。
2)用API函数CreateFile,建立与命名管道的连接。
3)用API函数WriteFile和ReadFile,分别向服务器发送数据,或从中接收数据。
4)用API函数CloseHandle,关闭打开的命名管道会话。
//详见:https://blog.csdn.net/qtycr/article/details/8612649
通过传统的Win32API函数在机器间通信有两种方法。一种是mailslot,一个机器可以广播一个信息,网络中的其它所有机器都可以接收到。使用命名管道的话,一部机器选择另一部进行通信,并且与它建立一个特别的连接。命名管道的好处是连接可靠。如果连接打断的话,例如一块网卡或者网线出现故障,连接的两端都可以马上接收到连接断开的信息。mailslots是不可靠的,因为发送者无法确认接收者是否已经收到了信息。mailslot的好处是它可以很容易地同时给许多机器发信息。
C++和C# IPC通信 : c# c++通信--命名管道通信 - 愤怒的企鹅 - 博客园