您的位置:逆风者 VC++ 正文
 添加时间:2007-09-01 原文发表:2007-08-31 人气:84 来源:vckbase.com

本文章共2854字,分2页,当前第1页,快速翻页:
 

论软件接口中几种底层通讯的实现

作者:李伟华

一、 概述
  软件接口是实现一个系统跟另外系统进行信息交互的桥梁,在不同的系统之间,根据系统的关联程度的不同存在紧耦合和松耦合两种:紧耦合要求接口响应反应快,消息不能阻塞;松耦合对响应反应要求比较低。本人主要讨论紧耦合接口通讯实现,在目前应用中,Socket、中间件、SOAP等都用相应的应用,但是应用中发现各通讯方式有自己固有的特征,"适合的才是最好的",这是真理。
逆风编程精品
  在接口和系统信息交互的过程中,两种模式使用得很普遍:同步调用和异步调用,同步调用要求接口发出请求消息后必须等待服务端系统的应答消息,接口阻塞直至超时;异步调用则发出请求消息后,接口可以从事其它处理,定时轮询服务端应答消息和消息或事件通知。同步方式简单,但是很容易造成接口阻塞,造成消息积压超时。

二、 技术实现

1、 Socket通讯
  Socket通讯相对来说是很古老的通讯方式,也是最常用的通讯方式。Socket通讯有阻塞和非阻塞两种方式。在同步方式,采用阻塞编程比较简单,但是为了防止接口阻塞,我们需要设置Socket超时,因此可以使用Socket的SELECT模型(参考如下示例代码):


	CurReceLen=0;

	for(;;)

	{

		iResult=select(0,&fdread,NULL,NULL,&timeout);

		if(iResult==0)

		{

			AfxMessageBox("接收应答消息超时!!!",MB_OK|MB_ICONERROR);

			closesocket(Socket);

			return FALSE;

		}



		CurReceLen = recv(Socket, oBuf ReceLen, len, NO_FLAG_SET);

		if((CurReceLen>0) && (CurReceLen != SOCKET_ERROR))

		{

			oBuf[ReceLen CurReceLen]=''\0'';

                           memcpy((char *)&MsgLen,oBuf,sizeof(WORD32));

                           MsgLen=ntohl(MsgLen);

			if(ReceLen CurReceLen==MsgLen)

			{

				ReceLen =CurReceLen;

				break;

			}



			ReceLen =CurReceLen;

		}

	}      
  在异步方式下,采用非阻塞方式实现比较方便,在非阻塞方式下可使用WSAAsyncSelect模型和WSAEventSelect模型:WSAAsyncSelect模型基于消息,WSAEventSelect模型基于事件,下面的示例代码设置了Socket进行读写和关闭操作的消息:

    if (status == SOCKET_ERROR)

    {

        WriteLogFile("Set stream socket module fail!!!IP(%s),

                      Port(%d) and error(%d)",

                      GetIPAddr((PeerMap node)->IPAddr),

                      (PeerMap node)->PeerPortNo,

                      WSAGetLastError());

        CloseSocket(TempSocket,__LINE__,__FILE__);

        return FALSE;

    }      
  无论使用阻塞方式或非阻塞方式编程,需要重点考虑的一个问题:粘包现象,即应用发送两个或以上的数据包,在Socket通讯层将数据包合并成一个发送出去,因此接收端收到数据包以后需要对数据包根据应用定义的长度进行拆分,否则导致应用层丢包。

2、中间件通讯
  目前中间平台也比较多,我所使用的中间件有BEA的Tuxedo和东方通的TongEasy,TongEasy我就不说了,主要讨论一下Tuxedo。BEA Tuxedo系统提供九种通信模式:

⑴.同步Request/Response模式;
⑵.异步Request/Response模式;
⑶.嵌套调用;
⑷.调用转发;
⑸.会话通信;
⑹.主动消息通告;
⑺.基于事件的通信;
⑻.基于队列的通信;
⑼.使用事务。

  同步请求/应答方式比较简单,因此在应用中也使用得相当多。但是同步请求/应答方式在服务端服务端反应比较慢时造成阻塞,如果使用了多线程方式,不管Tuxedo采用长连接还是短连接均容易造成线程挂起,不能再进行后续处理,很多情况需要程序重启。采用异步方式不会造成阻塞,但需要去查询是否有应答消息,下面的代码实现了使用异步函数实现同步调用的功能,增加了超时处理,这样不会导致程序阻塞:
 
本文章更多内容1 - 2 - 下一页>>
相关文章

简单PID数字控制的VC程序实现
在非MFC程序中引用CString
介绍一个操作DHTML表格的C 对象
案例研究:If-Trader 订单流程处理系统
在VC中调用DirectShow全屏播放视频
UTF-8与GB2312之间的互换
使用 Http 在线自动升级程序
《系统飞狐》中获取系统信息的方法
发掘 C# 特性赋予科学计算项目以威力
定制调试诊断工具和实用程序——摆脱DLL“地
清理VC工程
VC.NET简单实现GIF动画
MFC Activex 录音机控件
VC Oracle 开发入门
C 类对象的拷贝构造函数
WinCE4.2 下轻松调用 Windows Media Player
带光圈文字输出的实现
浅析三线程程序开发思路与实现
.NET Remoting与分布式应用开发——初识 Re
介绍一个控制并行端口的MFC类

相关评论


本文章所属分类:首页 VC++

  热门关键字: