示例#1
0
文件: MR.c 项目: VanErt1/tuxeip
MR_Reply *_SendMRRequest(Eip_Session *session,CIP_USINT service,BYTE *path,
                         CIP_USINT requestpathsize,void *requestdata,int requestdatasize,int *replysize)
{   int mrsize=0;
    MR_Request *request=_BuildMRRequest(service,path,requestpathsize,requestdata,requestdatasize,&mrsize);
    MR_Reply *reply=_ExSendMRRequest(session,request,mrsize,replysize);
    free(request);
    return(reply);
}
示例#2
0
文件: CM.c 项目: arhunn/pvbaddon
MR_Reply *_UnconnectedSend(Eip_Session *session,BYTE Priority,
										CIP_USINT TimeOut_Ticks,
										MR_Request *MRrequest,int MRrequestsize,
										BYTE *routepath,CIP_USINT routepathsize,int *replysize)
{ Unconnected_Send_Request *UCRequest=NULL;
	MR_Reply *reply=NULL;
	if ((MRrequest==NULL) && (MRrequestsize<=0))
	{
		CIPERROR(Internal_Error,E_NothingToSend,0);
		return(NULL);
	}
	if ((routepath!=NULL) && (routepathsize>0)) //
	{	int UCRequestsize=sizeof(Unconnected_Send_Request)
										+MRrequestsize
										+(MRrequestsize%2) // pad
										+routepathsize+routepathsize%2;
		
		UCRequest=malloc(UCRequestsize);
		if (UCRequest==NULL)
		{
			CIPERROR(Sys_Error,errno,0);
			return(NULL);
		};
		memset(UCRequest,0,UCRequestsize);
		void *pos=(void *)(&(UCRequest->MRRequest));
	
		UCRequest->Priority=Priority;//used to calculate request timeout information
		UCRequest->TimeOut_Ticks=TimeOut_Ticks;//used to calculate request timeout information
		UCRequest->Request_size=MRrequestsize;
		
		memcpy(pos,MRrequest,MRrequestsize);
		pos+=MRrequestsize+MRrequestsize%2;
		*((CIP_USINT *)pos)=routepathsize/2;
		pos+=2*sizeof(CIP_USINT);
		memcpy(pos,routepath,routepathsize);
		reply=_SendMRRequest(session,UNCONNECTED_SEND,CM_PATH,sizeof(CM_PATH),UCRequest,UCRequestsize,replysize);
		free(UCRequest);
		if (reply!=NULL) 
		{ 
			if ((reply->Service!=(UNCONNECTED_SEND+0x80))&&(reply->Service!=(MRrequest->Service+0x80)))
			{
				CIPERROR(Internal_Error,E_UnsolicitedMsg,0);
				free(reply);
				return(NULL);
			} else
			{
				CIPERROR(MR_Error,reply->General_Status,_GetMRExtendedStatus(reply));
				return(reply);
			}
		} else return(NULL);	
	} else
	{	
		reply=_ExSendMRRequest(session,MRrequest,MRrequestsize,replysize);
		if (reply!=NULL) 
		{ 
			if (reply->Service!=(MRrequest->Service+0x80))
			{
				CIPERROR(Internal_Error,E_UnsolicitedMsg,0);
				free(reply);
				return(NULL);
			} else
			{
				CIPERROR(MR_Error,reply->General_Status,_GetMRExtendedStatus(reply));
				return(reply);
			}
		} else return(NULL);
	}
}