⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 moi.c

📁 一个很好的例子-基于Linux的消息传输系统
💻 C
字号:
#include "moi.h"
#include "string.h"
#include "message.h"
#include "ci.h"
#include<stdlib.h>
#include<time.h>
int port=8001;
CI *ci;
MOI *moi;

/**
* Create a MOI object
*/

MOI * createMOI()
{
	MOI *moi;
	moi=(MOI*)malloc(sizeof(MOI));
	if (moi!=NULL)
	{
		moi->ci=createCI(port);
                ci=moi->ci;
		return moi;
	}
	else
	{
		return NULL;
	}
}

/**
* Register to MTS. If registration fails, then returns null, else returns * MOI object for communication.
* @param appName The name of Application
* @param appID The ID of Application
* @param group The group that Application asks DMT to join
* @return MOI objects
*/
int serial=1;
int app_register(app_name_id_t app_name_id, char group[32])
{
        int i=0,result;
        moi=createMOI();
        StartCI(moi->ci);
        Message *msg=NULL,*sendMsg;
        int type=16,priority=4,length,srcPort;
        void *content;
        char src[32],des[32],srcIp[32];

		if(strlen(app_name_id.app_Name)>32)
		{
			return 1;                 //app_name error!
		}                    

		if (app_name_id.app_ID<0)
		{
			return 2;                 //app_id error!
		}

   		/*  init MOI  */
       	        moi->appId=app_name_id.app_ID;
		strcpy(moi->appName,app_name_id.app_Name);
		strcpy(moi->src,"dmt_1");
		/*init content*/
                content=(void *)malloc(sizeof(char)*500);
		strcpy(((AppRegContent*)(content))->appName,moi->appName);
		((AppRegContent*)(content))->appId=moi->appId;
		strcpy(((AppRegContent*)(content))->Group,group);
		((AppRegContent*)(content))->port=moi->ci->listenPort;
		/*  init Message  */
		strcpy(src,moi->src);
		strcpy(des,moi->src);
		strcpy(srcIp,"127.0.0.1");
		srcPort=port;
		serial++;
		length=sizeof(AppRegContent);   
                sendMsg=createMessage(type,serial,src,srcIp,srcPort,des,priority,length,content);
	
	putMessage(moi->ci,sendMsg,"127.0.0.1",8000);
	
	while((msg=getMessage(moi->ci))==NULL)
	{
		sleep(1);
		i++;
		if (i>5) break;
	}
	if (i>5)
	{
		return 7;
	}
	else
	{
		if (msg->type==14)
		{
			result=((CommonRespondContent*)(msg->content))->result;
			return result;
		}
	destroyMessage(msg);				
	}	
	return 6;                //  RGE_INTERNAL_ERROR			
}

/*..............................................................................................*/

void transnate_setoption(int SetOptiop,int *sendRange,int *type,int *syn,int *compulsory,int *priority)
{
	*sendRange = 0;	
	if((SetOptiop&1)!=0)
	{
		*sendRange=1;		//sendRange : 0|1|2
	}
	if((SetOptiop&2)!=0)
	{
		if(*sendRange==1)
		{
			*sendRange=0;
		}
		else
		{
			*sendRange=2;
		}		
	}
	if((SetOptiop&4)!=0)
	{
		*type=1;		      //type : 0|1|2
	}
	if((SetOptiop&8)!=0)
	{
		*type=2;		
	}
	if((SetOptiop&16)!=0)
	{
		*compulsory=1;	      //compulsory : 0|1
	}
	if((SetOptiop&32)!=0)
	{
		*priority=2;          //priority : 2|3|4
	}
	if((SetOptiop&64)!=0)
	{
		*priority=4;		
	}
	if((SetOptiop&128)!=0)
	{
		*syn=1;		     //syn : 0|1
	}	
	else
	{
		*syn=0;
	}
}

int app_send(app_info_t dest_app, int SendOption, msg_t msg)
{
	Message *msg_respond,*message;
	int type=15,serial,length,priority,i,srcPort;
	int sendRange = 0,con_type=0,syn,compulsory=0,con_priority=3;
	char src[32],des[32],srcIp[32],*data;
	void *content;

	if(strlen(dest_app.dest_dmt_name)>32)
	{
		return 1;                               //SEND_DEST_NAME_ERROR
	}

	if(dest_app.dest_app_id<0)
	{
		return 2;                              //SEND_DEST_APP_ID_ERROR
	}

	if(SendOption>255)                       
	{
		return 3;                             //SEND_SENDING_OPTION_ERROR
	}

	if(moi==NULL)
	{
		return 4;                             //SEND_APP_HAS_NOT_REGISTERED
	}

	/*..................init message......................*/
	strcpy(src,moi->src);
	strcpy(des,moi->src);
	strcpy(srcIp,"127.0.0.1");
	srcPort=port;
	serial++;
	priority=3;
	/*..................init message->content..............*/
	content=(void*)malloc(sizeof(char)*500);
	
	transnate_setoption(SendOption,&sendRange,&con_type,&syn,&compulsory,&con_priority);
	((DataMsgContent*)(content))->type=con_type;
	((DataMsgContent*)(content))->sendRange=sendRange;
	((DataMsgContent*)content)->syn=syn;
	((DataMsgContent*)content)->compulsory=compulsory;
	((DataMsgContent*)content)->state=0;
        ((DataMsgContent*)content)->srcApp=moi->appId;
        strcpy(((DataMsgContent*)content)->src,moi->src);
	strcpy(((DataMsgContent*)content)->des,dest_app.dest_dmt_name);
	
	((DataMsgContent*)content)->desApp=dest_app.dest_app_id;	
	((DataMsgContent*)content)->priority=con_priority;	
	((DataMsgContent*)content)->length=msg.length;	
        printf("data length : %d\n",((DataMsgContent*)content)->length);
        printf("before malloc!\n");
        data=(char *)malloc(sizeof(char)*100);
       ((DataMsgContent*)content)->data=data;
       strcpy(((DataMsgContent*)content)->data,msg.message);

	length=msg.length;
	
	message=createMessage(type, serial, src, srcIp,srcPort,des, priority, length, content);

	putMessage(moi->ci,message,"127.0.0.1",8000);

	if(syn==1)
	{ 
		i=0;
                sleep(1);
		while((msg_respond=getMessage(moi->ci))==NULL)	
		{
			sleep(1);
			i++;
			if(i>10) { break; }
		}
		if(i>10)
		{
			return 7;     //time out
		}
		else
		{
                        if(msg_respond->type=13)
                        {
		 	return ((CommonRespondContent*)(msg_respond->content))->result;
                        }
                       return 6;
		}
	}	
	return 0;
}

/*..............................................................................................*/

int receive(app_info_t* src_app, int time, msg_t *msg)
{
	Message *rec_msg;
	int i=0;

	if(src_app->dest_app_id<0 || strlen(src_app->dest_dmt_name)>32)
	{
		return 1;             //RECV_INPUT_APPINFO_ERROR
	}
	
	if(time<-1)
	{
		return 2;
	}

	if(moi==NULL)
	{
		return 3;   //RECV_APP_HAS_NOT_REGISTERED
	}
	
	rec_msg=getMessage(moi->ci);
	
	if(time==0)
	{
		if(rec_msg==NULL)
		{
			return 5;
		}
	}
	else if(time==-1)
	{
		while((rec_msg=getMsgFromCi(moi->ci))==NULL);
	}
	else
	{
		while((rec_msg=getMsgFromCi(moi->ci))==NULL)
		{
			sleep(1);
			i++;
			if(i>time)
			{
				break;
			}
		}
		if(i>time)
		{
			return 5;
		}		
	}
	msg->message=((DataMsgContent*)(rec_msg->content))->data;
	msg->length=((DataMsgContent*)(rec_msg->content))->length;
        strcpy(src_app->dest_dmt_name,((DataMsgContent*)(rec_msg->content))->src);
        src_app->dest_app_id=((DataMsgContent*)(rec_msg->content))->srcApp;
	return 0;
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -