Windows下的IPC(C++ & C#)

10 篇文章 0 订阅

CCW And RCW

    MSDN官网: Interprocess Communications - Win32 apps | Microsoft Docs

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++通信--命名管道通信 - 愤怒的企鹅 - 博客园

  • 0
    点赞
  • 4
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论

打赏作者

gmf532196

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值