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

📄 parse_packet.c

📁 基于上海电信 sgmp3.0短信协议,实现的源程序,现网运行稳定,unix (freeBSD) 环境下编程.
💻 C
字号:
/*$Header: /base/cvsroot/wam/sms/platform/src/smgp3/parse_packet.c,v 1.1 2006/06/30 02:48:31 zhiyong Exp $*/

#include <stdio.h>
#include <string.h>
#include <arpa/inet.h>
#include "parse_packet.h"



int unparse_packet_1(unsigned char *buffer,unsigned int length, 
                     unsigned char *linkid,
                     unsigned char *SubmitMsgType,
                     unsigned char *SPDealResult    )
{
//    unsigned char *p;
    int offset =0;
    unsigned short temp;
    TLV2   param;
    
    // buffer: Tag(2)+Length(2)+Value(XX) +Tag(2)+Length(2)+Value(XX)
    //p = buffer;  
    
    if(length==0)
       return 0;
       
    while(offset< length)
    {                         
        memset(&param, 0, sizeof(TLV2));   
        memcpy (&temp, buffer+offset, 2);   
        param.Paramater_Tag = ntohs(temp);  //get Tag.
        offset += 2;
        
        if(param.Paramater_Tag == LinkID_Tag) 
        {
            memcpy (&temp, buffer+offset, 2);    //get Length        
            param.Length = ntohs(temp);
            offset += 2;
            memcpy(linkid, buffer+offset,param.Length); //get Value.
            
            offset += param.Length;
            if(offset>= length) 
                return 0;                      
        } 
        else
        if(param.Paramater_Tag == SubmitMsgType_Tag) 
        {
            memcpy (&temp, buffer+offset, 2);
            param.Length = ntohs(temp);
            offset += 2;
            
            memcpy(SubmitMsgType,buffer+offset,param.Length); //get Value.
            
            //*SubmitMsgType=ntohs(
            
            offset += param.Length;
            if(offset>= length) 
                return 0;                      
        } 
        else
        if( param.Paramater_Tag == SPDealReslt_Tag) 
        {
            memcpy (&temp, buffer+offset, 2);            
            param.Length = ntohs(temp);
            offset += 2;
            
            memcpy(SPDealResult,buffer+offset,param.Length); //get Value.
            
            offset += param.Length;
            if(offset>= length) 
                return 0;
            
        }
        else
        {	
        	printf("unknow TLV type, ID:0x%02x\n", param.Paramater_Tag);
		memcpy (&temp, buffer+offset, 2);            
            	param.Length = ntohs(temp);
            	offset += 2;
                       
            	offset += param.Length;
            	if(offset>= length) 
                	return 0;
        }
            
      }//end while.
      
      return 0;
//        memset(&param, 0, sizeof(TLV2));
//        memcpy (&temp, buffer, 2);
//        offset += 2;
//        param.Paramater_Tag = ntohs(temp);
}


int parse_packet(unsigned char *buffer, unsigned int length , unsigned char *linkid, unsigned int SubmitMsgType, unsigned int  SPDealResult)
{
//    unsigned char *p;
    int offset =0;
    unsigned short temp;
    unsigned char  ch;
    temp = htons(LinkID_Tag);
    memcpy (buffer , (unsigned char *) &temp, 2);
    offset += 2;
    temp = htons(20);
    memcpy (buffer+offset , (unsigned char *) &temp, 2);
    offset += 2;
    memcpy (buffer+offset, linkid,20);
    offset += 20;

    temp = htons(SubmitMsgType_Tag);
    memcpy (buffer+offset , (unsigned char *) &temp, 2);
    offset += 2;
    temp = htons(1);
    memcpy (buffer+offset , (unsigned char *) &temp, 2);
    offset += 2;
    ch = htons(SubmitMsgType);
    memcpy (buffer+offset , (unsigned int *) &ch, 1);
    offset += 2;

    if(SubmitMsgType == 15) {
        temp = htons(SPDealReslt_Tag);
        memcpy (buffer+offset , (unsigned char *) &temp, 2);
        offset += 2;
        temp = htons(1);
        memcpy (buffer+offset , (unsigned char *) &temp, 2);
        offset += 2;
        ch = htons(SPDealResult);
        memcpy (buffer+offset , (unsigned int *) &ch, 1);
        offset += 1;
    }
    return offset;
}




int unparse_packet(unsigned char *buffer,unsigned int length, unsigned char *linkid,unsigned char *SubmitMsgType,unsigned char *SPDealResult)
{
//    unsigned char *p;
    int offset =0;
    unsigned short temp;
    TLV2   param;

    memset(&param, 0, sizeof(TLV2));
    //p = buffer;
    memcpy (&temp, buffer, 2);
    offset += 2;
    param.Paramater_Tag = ntohs(temp);

    //--------------------------------------------main Item.
     
    if(param.Paramater_Tag == LinkID_Tag) {
        memcpy (&temp, buffer+offset, 2);
        offset += 2;
        param.Length = ntohs(temp);
        memcpy(linkid, buffer+offset,param.Length);
        offset += param.Length;
        if(offset>= length) {
            return 0;
        }
        memset(&param, 0, sizeof(TLV2));
        memcpy (&temp, buffer, 2);
        offset += 2;
        param.Paramater_Tag = ntohs(temp);
    } 
    
    if(param.Paramater_Tag == SubmitMsgType_Tag) {
        memcpy (&temp, buffer+offset, 2);
        offset += 2;
        param.Length = ntohs(temp);
        offset += param.Length;
        if(offset>= length) {
            return 0;
        }
        memset(&param, 0, sizeof(TLV2));
        memcpy (&temp, buffer, 2);
        offset += 2;
        param.Paramater_Tag = ntohs(temp);
    } 
    
    if( param.Paramater_Tag == SPDealReslt_Tag) {
        memcpy (&temp, buffer+offset, 2);
        offset += 2;
        param.Length = ntohs(temp);
        offset += param.Length;
        if(offset>= length) {
            return 0;
        }
        memset(&param, 0, sizeof(TLV2));
        memcpy (&temp, buffer, 2);
        offset += 2;
        param.Paramater_Tag = ntohs(temp);
    } 
    //--------------------------------------------
    if(param.Paramater_Tag == TP_pid_Tag) {
        memcpy (&temp, buffer+offset, 2);
        offset += 2;
        param.Length = ntohs(temp);
        offset += param.Length;
        if(offset>= length) {
            return 0;
        }
        memset(&param, 0, sizeof(TLV2));
        memcpy (&temp, buffer, 2);
        offset += 2;
        param.Paramater_Tag = ntohs(temp);
    } 
    if( param.Paramater_Tag == TP_udhi_Tag) {
        memcpy (&temp, buffer+offset, 2);
        offset += 2;
        param.Length = ntohs(temp);
        offset += param.Length;
        if(offset>= length) {
            return 0;
        }
        memset(&param, 0, sizeof(TLV2));
        memcpy (&temp, buffer, 2);
        offset += 2;
        param.Paramater_Tag = ntohs(temp);
    } 
   
    if( param.Paramater_Tag == ChargeUserType_Tag) {
        memcpy (&temp, buffer+offset, 2);
        offset += 2;
        param.Length = ntohs(temp);
        offset += param.Length;
        if(offset>= length) {
            return 0;
        }
        memset(&param, 0, sizeof(TLV2));
        memcpy (&temp, buffer, 2);
        offset += 2;
        param.Paramater_Tag = ntohs(temp);
    } 

    if(param.Paramater_Tag == ChargeTermType_Tag) {
        memcpy (&temp, buffer+offset, 2);
        offset += 2;
        param.Length = ntohs(temp);
        offset += param.Length;
        if(offset>= length) {
            return 0;
        }
        memset(&param, 0, sizeof(TLV2));
        memcpy (&temp, buffer, 2);
        offset += 2;
        param.Paramater_Tag = ntohs(temp);
    } 
    if( param.Paramater_Tag == ChargeTermPseudo_Tag) {
        memcpy (&temp, buffer+offset, 2);
        offset += 2;
        param.Length = ntohs(temp);
        offset += param.Length;
        if(offset>= length) {
            return 0;
        }
        memset(&param, 0, sizeof(TLV2));
        memcpy (&temp, buffer, 2);
        offset += 2;
        param.Paramater_Tag = ntohs(temp);
    } 
    if(param.Paramater_Tag == DestTermType_Tag) {
        memcpy (&temp, buffer+offset, 2);
        offset += 2;
        param.Length = ntohs(temp);
        offset += param.Length;
        if(offset>= length) {
            return 0;
        }
        memset(&param, 0, sizeof(TLV2));
        memcpy (&temp, buffer, 2);
        offset += 2;
        param.Paramater_Tag = ntohs(temp);
    } 
    if( param.Paramater_Tag == DestTermPseudo_Tag) {
        memcpy (&temp, buffer+offset, 2);
        offset += 2 ;
        param.Length = ntohs(temp);
        offset += param.Length;
        if(offset>= length) {
            return 0;
        }
        memset(&param, 0, sizeof(TLV2));
        memcpy (&temp, buffer, 2);
        offset += 2;
        param.Paramater_Tag = ntohs(temp);
    } 
    if(param.Paramater_Tag == PkTotal_Tag) {
        memcpy (&temp, buffer+offset, 2);
        offset += 2;
        param.Length = ntohs(temp);
        offset += param.Length;
        if(offset>= length) {
            return 0;
        }
        memset(&param, 0, sizeof(TLV2));
        memcpy (&temp, buffer, 2);
        offset += 2;
        param.Paramater_Tag = ntohs(temp);
    } 
    if( param.Paramater_Tag == PkNumber_Tag) {
        memcpy (&temp, buffer+offset, 2);
        offset += 2; 
        param.Length = ntohs(temp);
        offset += param.Length;
        if(offset>= length) {
            return 0;
        }
        memset(&param, 0, sizeof(TLV2));
        memcpy (&temp, buffer, 2);
        offset += 2;
        param.Paramater_Tag = ntohs(temp);
    } 
   
    
    if(param.Paramater_Tag == SrcTermType_Tag) {
        memcpy (&temp, buffer+offset, 2);
        offset += 2;
        param.Length = ntohs(temp);
        offset += param.Length;
        if(offset>= length) {
            return 0;
        }
        memset(&param, 0, sizeof(TLV2));
        memcpy (&temp, buffer, 2);
        offset += 2;
        param.Paramater_Tag = ntohs(temp);
    } 
    if( param.Paramater_Tag == SrcTermPseudo_Tag) {
        memcpy (&temp, buffer+offset, 2);
        offset += 2;
        param.Length = ntohs(temp);
        offset += param.Length;
        if(offset>= length) {
            return 0;
        }
        memset(&param, 0, sizeof(TLV2));
        memcpy (&temp, buffer, 2);
        offset += 2;
        param.Paramater_Tag = ntohs(temp);
    } 
    if(param.Paramater_Tag == NodesCount_Tag) {
        memcpy (&temp, buffer+offset, 2);
        offset += 2;
        param.Length = ntohs(temp);
        offset += param.Length;
        if(offset>= length) {
            return 0;
        }
        memset(&param, 0, sizeof(TLV2));
        memcpy (&temp, buffer, 2);
        offset += 2;
        param.Paramater_Tag = ntohs(temp);
    } 
    if( param.Paramater_Tag == MsgSrc_Tag) {
        memcpy (&temp, buffer+offset, 2);
        offset += 2;
        param.Length = ntohs(temp);
        offset += param.Length;
        if(offset>= length) {
            return 0;
        }
        memset(&param, 0, sizeof(TLV2));
        memcpy (&temp, buffer, 2);
        offset += 2;
        param.Paramater_Tag = ntohs(temp);
    } 
    if(param.Paramater_Tag == SrcType_Tag) {
        memcpy (&temp, buffer+offset, 2);
        offset += 2;
        param.Length = ntohs(temp);
        offset += param.Length;
        if(offset>= length) {
            return 0;
        }
        memset(&param, 0, sizeof(TLV2));
        memcpy (&temp, buffer, 2);
        offset += 2;
        param.Paramater_Tag = ntohs(temp);
    } 
    if( param.Paramater_Tag == MServiceID_Tag) {
        memcpy (&temp, buffer+offset, 2);
        offset += 2;
        param.Length = ntohs(temp);
        offset += param.Length;
        if(offset>= length) {
            return 0;
        }
    } 
    return 0;
}

⌨️ 快捷键说明

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