C# 程序间通信的各种途径及解析
(2012-08-15 09:36:28)
标签:
杂谈 |
二、各种通信途径及实现
首先,程序间相互独立,它的运行环境不为别的进程所改变。
I.[socket]
SOCKET编程是一种典型的会话编程方式,类似于老师家访,敲门----有人开门----进去----交流----出门。它适用于client/server通信方式,也适用于点对点通信方式。
下面分别介绍服务端和客户端的具体任务。
-
WSADATA
wsaData; - WORD
version = MAKEWORD(2, 0); - int
ret = WSAStartup(version, &wsaData); - if(ret
!= 0) - TRACE("Initilize
Error!/n" ); -
m_hSocket
= socket(AF_INET, SOCK_STREAM,0); -
m_addr.sin_family
= AF_INET; -
m_addr.sin_addr.S_un.S_addr
= INADDR_ANY; -
m_addr.sin_port
= htons(m_nPort); - int
ret = 0; - int
error = 0; -
ret
= sizeof(m_addr));bind(m_hSocket, (LPSOCKADDR)&m_addr, - if(ret
== SOCKET_ERROR){ -
TRACE( Error: ,%d /n" (error = WSAGetLastError())); -
; - }
-
ret
= listen(m_hSocket, 2); - if(ret
== SOCKET_ERROR){ -
TRACE( Error: ,%d /n" (error = WSAGetLastError())); -
; -
}
-
SOCKET
s = accept(m_hSocket, NULL, NULL); - if(s
== SOCKET_ERROR){ -
TRACE( Error: ,%d /n" (error = WSAGetLastError())); -
; - }
- char
buff[256]; -
ret
= recv(s, buff, 256, 0); - if(ret
== 0 || ret == SOCKET_ERROR ){ -
TRACE( data ,error: %d/n" WSAGetLastError()); -
; - }
-
buf[]= "hello"; -
send(s,
buf, str.GetLength(), 0);
II.[file]
这种方法很原始,使用率也很少,而且占用磁盘空间。利用文件作为程序间通信的通道,程序A向一文件写入数据,程序B通过读取这个文件中的数据从而与程序A进行通信,同时这一过程也可以是反向的。这种方法使用的前提是运行程序的用户需要具有对磁盘读/写的权限。
|A.WriteFile------>fileA<------B.ReadFile(check every <time>)
|A.ReadFile(check every <time>)----->fileB<-----B.WriteFile
|A.WriteFile------>fileA<------B.ReadFile(check every <time>)
|A.ReadFile(check every <time>)----->fileB<-----B.WriteFile
- //A
- int
buff=0; -
ofstream
Table; - Table.open("c://temp.txt");
-
Table<<buff<<endl;
-
Table.close();
- //B
- int
buff=1; - for(;;)
- {
-
ifstream
Table; - Table.open("c://temp.txt");
-
Table>>buff;
-
Table.close();
- if(buff==0){
- printf("Operation
code );equal 0" - //...
- return;
-
}
-
sleep(10);
-
}
III.[signal]
这种方法仅用于进程控制,不能进行数据交换。例如在发生非法内存访问、执行无效指令、某些按键(如CTRL+C,DEL等)等都会产生一个信号,其他程序调用有关的系统调用或用户自定义的处理过程进行处理。
信息处理的系统调用是signal,它的原型是void ( *signal( int sig, void (__cdecl *func)
( int sig [, int subcode ] )) ) ( int sig
);这个函数可以让一个进程选择很多方法中的一种去处理操作系统返回的中断讯号。
IV.[pipe]
管道(PIPE)是一种简单的进程间通信(IPC)机制,分为无名管道和有名管道两种。命名管道可以在同一台机器的不同进程间以及不同机器上的不同进程间进行双向通信(使用UNC命名规范)。管道的最大好处在于:它可以象对普通文件一样进行操作,它的操作表示符HANDLE,也就是说,它可以使用ReadFile,WriteFile函数进行与底层实现无关的读写操作,用户根本就不必了解网络间/进程间通信的具体细节。
无名管道实际上是内存中的一个临时存储区,由系统安全控制,并且独立于创建它的进程的内存区。管道对数据采用先进先出的方式管理,并严格按顺序操作,管道不能被搜索,管道中的信息只能读一次。无名管道只是在父子进程之间或者一个进程的两个子进程之间进行通信的。它是单向的。无名管道其实是通过用给了一个指定名字的有名管道来实现的。
有名管道的操作和无名管道类似。
管道的创建用createpipe()函数,用readfile()、writefile()对其进行操作。
-
SECURITY_ATTRIBUTES
a; - HANDLE
hReadPipe,hWritePipe; -
CreatePipe(&hReadPipe,&hWritePipe,&a,0);
- unsigned
long lBytesRead; - char
Buff[1024]; - int
ret; - while(1)
- {
-
ret=PeekNamedPipe(hReadPipe,Buff,1024,&lBytesRead,0,0); -
-
{ -
ret=ReadFile(hReadPipe,Buff,lBytesRead,&lBytesRead,0); -
break; -
} -
-
{ -
-
break; -
ret=WriteFile(hWritePipe,Buff,lBytesRead,&lBytesRead,0); -
break; -
} - }
V.[MQ]
VI.[共享储存段(SM)]
共享储存段通信(shared
memory)允许多个进程在外部通信协议或同步/互斥机制的支持下使用同一个内存段作为中间介质进行通信,它是一种很有效的数据通信方式。
在进行通信之前,先创建一个共享内存段,然后进行映射和分离操作。同时可以根据需要改变共享内存段的存取权限以及其他的一些特征。
☆对于下面的集中通信方式,就要提到“中间件(Middleware)”。
中间件是一类软件,它对应用程序隐含了实际网络和通信协议的细节。高级编程接口帮助开发者在不同的环境中创建应用程序,而不需要对将使用的网络和通信协议有更多的了解。
正常情况下,中间件在使用不同网络通信协议的客户机/服务器环境。它可以对客户机/服务器应用隐藏协议,从而使开发人员集中精力于改进应用程序,而不是开发通信接口。
中间件产品隐藏了前端应用程序和后端应用程序的区别。中间件层包括通用应用程序和流行应用程序的应用程序编程接口(API)之间的翻译功能。例如,Microsoft的开放式数据库连接(ODBC)标准提供后端数据库系统操作的通用功能。前端应用程序写入ODBC,并利用它的功能。ODBC
隐藏了不同厂商的SQL实现的区别。Microsoft以一组Microsoft
Windows驱动程序的形式提供ODBC,以提供对Microsoft Access、Microsoft Excel、Microsoft
SQL Server、FoxPro、Btrieve,dBASE,Borland Paradox、IBM
DB2、DECRdb和Oracle等格式产生的数据的访问。ODBC是为了使Windows成为客户访问后端数据库的标准而设计的。
□用户需要访问许多不同的后端服务器上的服务。
□后端服务器可以使用不同的操作系统,并需要不同的通信协议。
□后端数据库服务器有不兼容的SQL命令集,它使用户和程序员很难从一个系统转到另一个系统。
□限制用户只能使用某种特定的访问后端服务的应用程序现在已经不现实。用户需要从不同的应用程序来访问服务。
□新的模型是为了使用户在多厂商环境使用多种协议在任何前端来访问任何后端服务。
在多协议、多厂商环境,通常一个程序员需要编写应用程序,来与每个协议和支持系统进行工作。使用中间件,程序员只需简单地编写到中间件的接口,而由中间件处理所有多协议、多厂商问题。有三种类型的中间件:远程过程调用(RPC)、会晤(conversations)和消息传递系统。它们都能很好地隐藏通信过程,以及与它们进行操作的系统差异。
VII.[RPC]
Remote Procedure Call(PRC)
一个远程过程调用是在网络上一个计算机系统对另一计算机系统的请求。RPC保持了中间件在不同网络平台和通信协议上工作的性质。基本上,一个PRC就是一台计算机向另一台计算机发出的直接请求。它是一种请求/回答的过程,这时请求放等待一个回答,这意味着PRC通常是在面向连接界面上发生的一种实时呼叫。
RPC机制强制通信的两个应用程序必须同时处于运行状态。做远程调用时,两者必须先建立连接,而且通讯链路质量对它的效果影响很大。
它的工作方式是:当一个应用程序A需要与远程的另一个应用程序B交换信息或要求B提供协助时,A将在本地产生一个请求,通过通讯链路,同志B接收信息或提供相应的服务,B完成相关处理后将确认信息或结果返回给A。
PRC的优点是应用程序采用调用/返回方式通讯,拥有很高的潜在效率,但需要应用程序间的紧密耦合,通讯线路必须在通信期间一直保持良好的状态,而且必须进行大量的底层通讯的编程工作。
VIII.[conversations]
会晤(conversations)是逻辑连接的两个或多个系统之间的连续会话,同RPC不同,在分布式环境,会晤可能会重叠执行。出于这个原因,对需要在多个地方必须完全同步地完成,修改分布式数据库的工作,会晤是非常必要和有益的。IBM的高级程序对程序通信(APPC)实现了会晤。用于实现会晤的OSI标准也已出现。Covia
Technologies(Rosemont,Illinois)的通信集成器(CI,Communication
Integrator)是具有会晤的中间件的另一个例子、它可以在大型计算机、中型机和台式机上运行。
IX.[MQSeries消息队列]
为了简化应用程序间的通信,使得通信具有较高的可靠性,又保证实现的简单性,中间件技术是我们的首选,IBM公司的MQSeries就是基于这种技术的产品。MQSeries是一种独立的通信软件,应用程序只需将任务提交给该软件,就可以由该软件自动去完成信息的传递工作。
例如: