肺癌转移肝脏的症状:(转)程序间通信的各种途径及解析 - 阿东正传 - 博客园

来源:百度文库 编辑:九乡新闻网 时间:2024/05/05 07:54:24

(转)程序间通信的各种途径及解析

一、开篇
     程序间通信的主要目的是实现多台计算机(也可以是同一台)中应用程序之间的数据共享与信息交换。在不同的计算机系统中,它们之间要通过网络之间的协议才能实现数据共享与信息交换;在同一台计算机系统中,它们之间只需一定的通道就能实现数据共享与信息交换。在不同计算机系统和同一计算机系统的程序通信中,既有很多相同之处,也有各自的特点。程序间通信都要靠一定的通道(pipe)来实现,其中的通道多种多样,各俱特色。
     为了充分认识和掌握程序间通信及其相应的实现技术,本文对各种通信方法进行讨论。包括每种方法的原理和实现等。二、各种通信途径及实现
     首先,程序间相互独立,它的运行环境不为别的进程所改变。I.[socket]
     SOCKET编程是一种典型的会话编程方式,类似于老师家访,敲门----有人开门----进去----交流----出门。它适用于client/server通信方式,也适用于点对点通信方式。
     下面分别介绍服务端和客户端的具体任务。     这里介绍TCP的过程。
     (1)服务端     服务端首先创建一个套接字,使用socket()调用;然后使用bind()将该套接字与本地IP和某一端口相关联(该端口可以是空闲的也可以是非空闲的,具体的可以参阅笔者的《对端口截听的实现》这篇文章)。使用listen()让套接字等候进入连接,然后用accept()使套接字作好接受客户连接的准备。当连接请求到来后,被阻塞服务进程的accept()函数生成一个新的套接字与客户套接字建立连接,并向客户返回接收信号。用read()来读入数据,用write()来向发送进程写回一些数据,如确认信息或回显信息。     (2)客户端     客户进程也是先创建一个套接字,用socket()调用,然后客户向服务进程发出连接请求,通过调用connect()可以建立一个端的连接,连接成功后用write()向服务端发送数据,用read()读取服务端返回的数据。     这种方式隐含了在建立client/server间通信的非对称性。client/server模型工作时要求有一套为客户机和服务器所共识的惯例来保证服务器能够被提供(或被接受),这一套惯例包括了一套协议,它必须在通信的两头都被实现。根据不同的实际情况,协议可能是对称的或是非对称的。在对称的协议中,每一方都有可能扮演主从角色;在非对称协议中,每一放则是从机。例如终端仿真TELNET是对称协议,HTTP是非对称协议。无论具体的协议是对称的还是非对称的,当服务被提供时必然存在客户进程和服务进程。     这种通信方式适用于单个计算机系统,也适用于多个计算机系统。
     ●
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 = bind(m_hSocket, (LPSOCKADDR)&m_addr, sizeof(m_addr));
if(ret == SOCKET_ERROR){
   TRACE("Bind Error: %d \n", (error = WSAGetLastError()));
   return ;
}
ret = listen(m_hSocket, 2);
if(ret == SOCKET_ERROR){
   TRACE("Listen Error: %d \n", (error = WSAGetLastError()));
   return ;
}
SOCKET s = accept(m_hSocket, NULL, NULL);
if(s == SOCKET_ERROR){
   TRACE("Accept Error: %d \n", (error = WSAGetLastError()));
   return ;
}char buff[256];
ret = recv(s, buff, 256, 0);
if(ret == 0 || ret == SOCKET_ERROR ){
   TRACE("Recv data error: %d\n", WSAGetLastError());
   return ;
}
         char buf[]="hello";
send(s, buf, str.GetLength(), 0);II.[file]
     这种方法很原始,使用率也很少,而且占用磁盘空间。利用文件作为程序间通信的通道,程序A向一文件写入数据,程序B通过读取这个文件中的数据从而与程序A进行通信,同时这一过程也可以是反向的。这种方法使用的前提是运行程序的用户需要具有对磁盘读/写的权限。
|A.WriteFile------>fileA<------B.ReadFile(check every