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

📄 nsmgp.c

📁 基于上海电信 sgmp3.0短信协议,实现的源程序,现网运行稳定,unix (freeBSD) 环境下编程.
💻 C
📖 第 1 页 / 共 3 页
字号:
    
//    INFO("  sizeof(SMGP3_SUBMIT)=%d\n",sizeof(SMGP3_SUBMIT));
//    INFO("  sizeof(TLinkID)=%d\n",sizeof(TLinkID));
//    INFO("  sizeof(TSubmitMsgType)=%d\n",sizeof(TSubmitMsgType));
    
    memset( &TLinkID ,0, sizeof(TLinkID));
    memset( &TChargeUserType ,0, sizeof(TLV));
    memset( &TSubmitMsgType ,0, sizeof(TLV));
    memset( &TSpDealResult ,0, sizeof(TLV));
    //---------------------------------------------
    Total_Length = LEN_SMGP_HEAD +LEN_SMGP_SUBMIT+submit->MsgLength  ; //12+135+msg+TLV
    
//    INFO(" before1 : TLV len=%d\n",Total_Length);
    
    Total_Length+=sizeof(TLinkID);  //+24
    if( subMsgType != 200)
        Total_Length+=sizeof(TSubmitMsgType);  //+5
    if( spDealRes  != 200)
        Total_Length+=sizeof(TSpDealResult);   //+5   
        
//    INFO(" after1 : TLV len=%d\n",Total_Length);                     
    //--------------------------
    memset(buffer,0,sizeof(buffer));
    // Message Header 
    MakeHead(buffer, Total_Length, Command_ID, SequenceNum);
    p = buffer+ LEN_SMGP_HEAD;
    
    //--new structure-------------------------------------------
    memcpy(p,submit, sizeof(SMGP3_SUBMIT));
    p+=sizeof(SMGP3_SUBMIT) ;
    
    // MsgContent : string     
    memcpy(p, content , submit->MsgLength);
    p += submit->MsgLength;
    //---------------------------------------------    
    // Reserve : String 
    //-------------------------------------
//     strncpy(p, "00000000",8);
    p += 8;
    
    //可变参数
    //-----------------------------------------------           
//       TChargeUserType.Paramater_Tag=0x004 ; 
//       TChargeUserType.Length=1 ; 
//       TChargeUserType.Value=3 ;   //0: 对接收者收费,3: 由ChargeTermID决定.
    //-----------------------
       var1= 0x003 ;
       TLinkID.Tag=  htons( var1 )  ;  
       var1= 20 ;
       TLinkID.Length=  htons( var1 )  ;    //
       memcpy( TLinkID.Value,linkid,20);
       
       var1= 0x00B ; 
       TSubmitMsgType.Paramater_Tag=   htons(var1 ) ; 
       var1= 1;
       TSubmitMsgType.Length=  htons( var1 ) ; 
       
       if( subMsgType==13)    var1=13;
       if( subMsgType==15)    var1=15; 
       
 //      INFO("  ....A1SubmitMsgType.Value=%d \n", var1);
       
       TSubmitMsgType.Value= subMsgType ; 
       
//       INFO("  ....A2SubmitMsgType.Value=%d \n",  TSubmitMsgType.Value );
       
       var1= 0x00C ; 
       TSpDealResult.Paramater_Tag=  htons( var1 ) ; 
       var1= 1;
       TSpDealResult.Length= htons( var1 ) ; 
       
//       INFO("  ....C1 SpDealResult.Value=%d \n", spDealRes);
       
       TSpDealResult.Value= spDealRes  ; 
       
//       INFO("  ....C2 SpDealResult.Value=%d \n",  htons(spDealRes));
       
    //--------------------------------------       
       memcpy(p, &TLinkID ,sizeof(TLinkID));
           
       p+=sizeof(TLinkID);
       
       if( subMsgType != 200)
       {
       	  memcpy(p, &TSubmitMsgType ,sizeof(TSubmitMsgType));
          p+=sizeof(TSubmitMsgType);
       }       
       if( spDealRes != 200)
       {
       	  memcpy(p, &TSpDealResult ,sizeof(TSpDealResult));
          p+=sizeof(TSpDealResult);
       }
//############################################
#if 0   
    memcpy(p, (unsigned char *)&TLinkID.Tag, 2);
    p += 2;
    memcpy(p, (unsigned char *)&TLinkID.Length, 2);
    p += 2;
    memcpy( TLinkID.Value,linkid,20);
    p += 20;
    
    if( subMsgType != 200)
    {
    	 memcpy(p, (unsigned char *)&TSubmitMsgType.Paramater_Tag, 2);
         p += 2;
         memcpy(p, (unsigned char *)&TSubmitMsgType.Length, 2);
         p += 2;
         memcpy(p, (unsigned char *)&TSubmitMsgType.Value, 1);
         p += 1;       	  
    }       
    if( spDealRes != 200)
    {
       	 memcpy(p, (unsigned char *)&TSpDealResult.Paramater_Tag, 2);
         p += 2;
         memcpy(p, (unsigned char *)&TSpDealResult.Length, 2);
         p += 2;
         memcpy(p, (unsigned char *)&TSpDealResult.Value, 1);
         p += 1;  
    }
#endif    
//###########################################       
       
   //-----------------------------------------------    
//    memcpy(p, submit->Paramater,submit->ParamaterLen);
//    p += submit->ParamaterLen

    for (i = 0; i < 30; i++)
    {
        poll_list.fd = Socket_fd;
        poll_list.events = POLLOUT;

        res = poll(&poll_list, (unsigned int) 1, 1000);
        if (res == 0) { 
            continue;
        } else if (res < 0) {
            if (errno == EINTR || errno == EAGAIN) 
                continue;
            else    
            {   
                INFO( "[-ERR]: poll(2) () Failed: %s\n",  strerror(errno));
                return (-1);
            }
        } 

        ret =  write(Socket_fd, &buffer[bytes_written], Total_Length - bytes_written);
        if (ret < 0) 
        {
            if (errno == EINTR || errno == EAGAIN) 
                continue;
            else    
            {
                INFO( "[-ERR]: write(2) (  %d ) Failed: %s\n",  Total_Length, strerror(errno));
                return (-1);
            }
        }
        bytes_written += ret;
        if (bytes_written == Total_Length)
            break;
    }
    if ( bytes_written < Total_Length ){
        INFO( "[-ERR]: write(2) (  %d ) Failed: %s\n",  Total_Length, strerror(errno));
        return (-1);
    }
    
    //INFO("        sent bytes :%d\n",bytes_written);  
    INFO("     SUBMIT01: SequenceID :%ld ,sentBytes :%d\n", SequenceNum,bytes_written);         
//------------------------------------------------------------------    
    memset(dServiceID ,0, sizeof(dServiceID));
    memset(dFeeType ,0, sizeof(dFeeType));
    memset(dFeeCode ,0, sizeof(dFeeCode));
    memset(dFixedFee ,0, sizeof(dFixedFee));
    
    strncpy(dServiceID, submit->ServiceID, sizeof(dServiceID)-1);
    strncpy(dFeeType,   submit->FeeType,   sizeof(dFeeType)-1);
    strncpy(dFeeCode,   submit->FeeCode,   sizeof(dFeeCode)-1);
    strncpy(dFixedFee,  submit->FixedFee,  sizeof(dFixedFee)-1);
      
    memset(dValidTime ,0, sizeof(dValidTime));
    memset(dAtTime ,0, sizeof(dAtTime));
    
    strncpy(dValidTime, submit->ValidTime, sizeof(dValidTime)-1);
    strncpy(dAtTime,    submit->AtTime,    sizeof(dAtTime)-1);
    
    memset(dSrcTermID ,0, sizeof(dSrcTermID));
    memset(dChargeTermID ,0, sizeof(dChargeTermID));
    memset(dDestTermID ,0, sizeof(dDestTermID));
    
    memset(dContent ,0, sizeof(dContent));
    strncpy(dContent,  content,  submit->MsgLength );
//    strncpy(dContent,  content,  strlen(content) );
    
    strncpy(dSrcTermID,   submit->SrcTermID,   sizeof(dSrcTermID)-1);
    strncpy(dChargeTermID,submit->ChargeTermID,sizeof(dChargeTermID)-1);
    strncpy(dDestTermID,  submit->DestTermID,  sizeof(dDestTermID)-1);
    
    INFO( "SEND SUBMIT01: Total_Length:%d,MsgType:%d ,NeedReport:%d ,Priority:%d ,ServiceID:%s\n",
                   Total_Length,submit->MsgType,submit->NeedReport,submit->Priority,dServiceID);
                   
    INFO( "     SUBMIT01: FeeType:%s ,FeeCode:%s ,FixedFee:%s ,MsgFormat:%d ,ValidTime:%s,AtTime:%s\n",
                   dFeeType,dFeeCode,dFixedFee,submit->MsgFormat,dValidTime,dAtTime);
    
    INFO( "     SUBMIT01: SrcTermID:%s ,ChargeTermID:%s ,DestTermIDCount:%d ,DestTermID:%s ,MsgLength:%d,Content:%s\n",
                   dSrcTermID,dChargeTermID,submit->DestTermIDCount,dDestTermID, submit->MsgLength,dContent);
                   
    INFO( "     SUBMIT01: linkid:%s ,subMsgType:%d ,spDealRes:%d \n",linkid,subMsgType,spDealRes );                                  
            
    return (0);
}

/************************************************************************************/
/* 											   		                                */			
/* Recv Submit Resp from SMG			                                            */
/* Function name: RecvSubmitResp	     			                                */
/* 											                                        */
/* Argument: char *socketbuffer                                                          */
/*          unsigned int *MsgID                                                     */
/*          unsigned int *result 		                                            */		
/* Return : int 							                                        */
/* 			 0 : right						                                        */
/************************************************************************************/
int RecvSubmitResp(char *socketbuffer, unsigned int Body_Length, char *MsgID, unsigned int *result)
{	
	unsigned char buffer[15];
	unsigned int temp;
	memset(buffer, 0, sizeof(buffer));
	memcpy(buffer, socketbuffer, Body_Length);
	memcpy(MsgID,buffer,10); 
	memcpy((unsigned char*)&temp,buffer+10,4);
	*result = ntohl(temp);
	return  (0);
}

/************************************************************************************/
/* 											   		                                */			
/* Recv Deliver Packet from SMG			                                            */
/* Function name: DeliverGet	         			                                */
/* 											                                        */
/* Argument: int Socket_fd                                                          */
/*               .......................                                            */
/* Return : int 							                                        */
/* 			 0 : right						                                        */
/*			-1 : send errror			   	                                        */			
/************************************************************************************/
int DeliverGet(char *socketbuffer, SMGP_DELIVER *deliver,unsigned int Body_Length)
               //unsigned char *buf,unsigned int *buflen)
{
    int res, ret, bytes_read = 0, i;
    unsigned char buffer[512];
    unsigned char  *p;
    unsigned int  temp = 0;
    struct pollfd poll_list;


    if(Body_Length >512) 
        return (-1);
    memset(buffer, 0, sizeof(buffer));
    memset(deliver ,0,sizeof(SMGP_DELIVER));
    memcpy(buffer, socketbuffer, Body_Length); 
    
    p = buffer;
    /* MsgID : string(10) */
    strncpy(deliver->MsgID, p,10);
    //printf("Get MsgID:%s\n",deliver->MsgID);
    p +=10;
    /* IsReport : Integer(1) */
    memcpy((unsigned char *)&temp,p,1);
    deliver->IsReport = temp;
    p += 1;

    /* MsgFormat : Integer(1) */
    memcpy((unsigned char *)&temp,p,1);
    deliver->MsgCoding = temp;
    p += 1;
    /* RecvTime : string(14) */
    memcpy(deliver->RecvTime, p,14);
    p += 14;
    /* SrcTermID : string(21) */
    memcpy(deliver->SrcTermID, p, 21);
    p += 21;
    /* DestTermID : string(21) */
    memcpy(deliver->DestTermID, p, 21);
    p += 21;
    /* MsgLength : Integer(1) */
    memcpy((unsigned char *)&temp,p,1);
    deliver->MsgLength = temp;
    p += 1;
    
    /* MsgContent : string(Var.) */
    if(deliver->IsReport == 0)
    {
        if(deliver->MsgCoding == 8){
            temp = deliver->MsgLength ;
            deliver->MsgLength =UNICODE_2_GBK_BE(deliver->MsgContent,p,deliver->MsgLength);
        }
        else {
            temp = deliver->MsgLength ;
            memcpy(deliver->MsgContent, p, deliver->MsgLength);
        }
    }
    else 
    {
        memcpy(deliver->MsgContent, p, deliver->MsgLength);
        temp = deliver->MsgLength ; //addby
    }
    
    p+=temp;
    p+=8;    //Reserve.
    
    deliver->ParamaterLen = Body_Length-LEN_SMGP_DELIVER- deliver->MsgLength;
    
    if(deliver->ParamaterLen  >0 )
    {
        memcpy(deliver->Paramater,p,deliver->ParamaterLen);
    }
    
    INFO( "[DeliverGet]: IsReport:%d, MsgID:%s ,SrcTermID:%s ,DestTermID:%s ,MsgCoding:%d, MsgLength:%d, MsgContent:%s, ParamaterLen:%d\n",    
           deliver->IsReport , deliver->MsgID,deliver->SrcTermID,deliver->DestTermID ,deliver->MsgCoding, deliver->MsgLength, deliver->MsgContent, deliver->ParamaterLen);    
    return 0;
}

/************************************************************************************/
/* 											   		                                */			
/* Recv Length  from SMG			                                            */
/* Function name: SMGP_Recv_Length	     			                                   */
/* 											                                        */
/* Argument: int Socket_fd                                                          */
/*          unsigned int *MsgID                                                     */
/*          unsigned int *result 		                                            */		
/* Return : int 							                                        */
/* 			 0 : right						                                        */
/*			-1 : send errror			   	                                        */			
/************************************************************************************/
int SMGP_Recv_Length(int Socket_fd,unsigned int Body_Length)
{
    unsigned char  buffer[512];

    memset(buffer, 0, sizeof(buffer));
    /* Receive Message Body */
    if (read(Socket_fd, buffer, Body_Length) != (int)Body_Length )
        return (-1);
    /* Result : Integer(1) */
    return (0);
}
/************************************************************************************/
/* 											   		                                */			
/* Recv DeliverResp  from SMG			                                            */
/* Function name: DeliverResp	     			                                   */
/* 											                                        */
/* Argument: int Socket_fd                                                          */
/*          unsigned int *MsgID                                                     */
/*          unsigned int *result 		                                            */		
/* Return : int 							                                        */
/* 			 0 : right						                                        */
/*			-1 : send errror			   	                                        */			
/************************************************************************************/
int DeliverResp(int Socket_fd, unsigned int Sequence, char *MsgID, int Result)

⌨️ 快捷键说明

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