本文中CX公共模块在设计过程中对以下各方面也进行了兼顾:
1、CX传送数据的实时性保证:网络中间件针对所有接收函数都提供有timeout的功能,这样既避免了client挂起而接收不到回应消息;又使得server端在接收请求消息并等待的同时可进行一些周期性任务的处理;
2、CX的重发机制:当一个server没有侦听到请求时,client可以多次向server重发请求,重发间隔时间由调用者自己设定;
3、CX支持阻塞模式:使用select机制来同步多路I/O复用。允许client从多个server等待回应。server同样也可以使用这样的机制来等待请求消息,或从其它server处等待回应消息;
4、CX的监视机制:提供单独的进程来监视host的状态,一旦某个host不可访问就会产生错误或警告信息。
2.3网络中间件的实例
int CXc_send(const CX_serv serv_addr, const void *msg, int len, int retry_interval )
{
int serv_num;
int result;
//检查调用CX的任务是否已向CX注册,CX是否在本地host上初始化
if((!CX_TaskInitialized)||(!CXs_CXisInitialized()))
{ result = CX_NOT_INITIALIZED; }
//参数检查
else if((len <= 0)||(len>CX_MaxMsgSize))
{ result = CX_ILLEGAL_MSG_LEN; }
else
{ //将server地址转换为server号
result=ServAddr2Num(serv_addr, &serv_num );
if(result == OK)
{ //发送请求消息
result = CXclient_send( serv_num, msg, len, retry_interval );
}
}
return result;
}
int CXclient_send( int serv_num, const void *msg, int len, int retry_interval )
{
int result;
result = CX_CONN_RESET;
while(result == CX_CONN_RESET)
{
//检查cliet是否还与server保持连接,如果没有则建立连接
if(!CXclient_IsStillConnectedTo(serv_num))
{ result = CXc_Connect(serv_num, retry_interval);
if(result != OK)
{ return result; }
}
//向server发送消息
Result = CXFD_WriteMsg(Client_Admin[serv_num].cl_write_fd, msg, len);
//如果没有发送成功,则返回错误码,并修改client相应的项目
if(result == CX_CONN_RESET)
{ Client_Admin[serv_num].cl_is_connected = FALSE; }
}
return result;
}