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

📄 smgp3.c

📁 基于上海电信 sgmp3.0短信协议,实现的源程序,现网运行稳定,unix (freeBSD) 环境下编程.
💻 C
📖 第 1 页 / 共 5 页
字号:
            		isHainanFlag = 1;
            		INFO("[INFO]: IS HaiNan SMGP3 Gateway.\n");
        	}
    	}
    	
                        
    	if (read_int32(&S_MF.MsgType,	"免费.MSGTYPE") != 0) goto CFGERR;
	if (read_uchar(S_MF.FeeType, sizeof(S_MF.FeeType)-1, "免费.FEETYPE") != 0) goto CFGERR;
	if (read_int32(&S_MF.FeeCode, "免费.FEECODE") != 0) goto CFGERR;
	if (read_int32(&S_MF.FixFee,  "免费.FIXFEE") != 0) goto CFGERR;

	if (read_int32(&S_DB.MsgType, "点播.MSGTYPE") != 0) goto CFGERR;
	if (read_uchar(S_DB.FeeType, sizeof(S_DB.FeeType)-1, "点播.FEETYPE") != 0) goto CFGERR;
	if (read_int32(&S_DB.FeeCode, "点播.FEECODE") != 0) goto CFGERR;
	if (read_int32(&S_DB.FixFee,  "点播.FIXFEE") != 0) goto CFGERR;

	if (read_int32(&S_ATDZ.MsgType, "按条.定制.MSGTYPE") != 0) goto CFGERR;
	if (read_uchar(S_ATDZ.FeeType, sizeof(S_ATDZ.FeeType)-1, "按条.定制.FEETYPE") != 0) goto CFGERR;
	if (read_int32(&S_ATDZ.FeeCode, "按条.定制.FEECODE") != 0) goto CFGERR;
	if (read_int32(&S_ATDZ.FixFee,  "按条.定制.FIXFEE") != 0) goto CFGERR;

	if (read_int32(&S_ATQR.MsgType, "按条定制.确认.MSGTYPE") != 0) goto CFGERR;
	if (read_uchar(S_ATQR.FeeType, sizeof(S_ATQR.FeeType)-1, "按条定制.确认.FEETYPE") != 0) goto CFGERR;
	if (read_int32(&S_ATQR.FeeCode, "按条定制.确认.FEECODE") != 0) goto CFGERR;
	if (read_int32(&S_ATQR.FixFee,  "按条定制.确认.FIXFEE") != 0) goto CFGERR;


	if (read_int32(&S_QR.MsgType, "定制包月.确认.MSGTYPE") != 0) goto CFGERR;
	if (read_uchar(S_QR.FeeType, sizeof(S_QR.FeeType)-1, "定制包月.确认.FEETYPE") != 0) goto CFGERR;
	if (read_int32(&S_QR.FeeCode, "定制包月.确认.FEECODE") != 0) goto CFGERR;
	if (read_int32(&S_QR.FixFee, "定制包月.确认.FIXFEE") != 0) goto CFGERR;

	if (read_int32(&S_BY.MsgType, "定制.包月.MSGTYPE") != 0) goto CFGERR;
	if (read_uchar(S_BY.FeeType, sizeof(S_BY.FeeType)-1, "定制.包月.FEETYPE") != 0) goto CFGERR;
	if (read_int32(&S_BY.FeeCode, "定制.包月.FEECODE") != 0) goto CFGERR;
	if (read_int32(&S_BY.FixFee, "定制.包月.FIXFEE") != 0) goto CFGERR;

	if (read_int32(&S_HD.MsgType, "定制.话单.MSGTYPE") != 0) goto CFGERR;
	if (read_uchar(S_HD.FeeType, sizeof(S_HD.FeeType)-1, "定制.话单.FEETYPE") != 0) goto CFGERR;
	if (read_int32(&S_HD.FeeCode, "定制.话单.FEECODE") != 0) goto CFGERR;
	if (read_int32(&S_HD.FixFee, "定制.话单.FIXFEE") != 0) goto CFGERR;
	if (read_uchar(nanjingct_flag, sizeof(nanjingct_flag) - 1,"NANJINGCT_FLAG") != 0) goto CFGERR;
	if (read_uchar(ismp,sizeof(ismp), "ISMP") != 0) goto CFGERR;
	if (read_uchar(smps, sizeof(smps),"SMPS") != 0) goto CFGERR;
    	close_conf();
    	return (0);
CFGERR:
    	close_conf();
    	return (-1);
}

static int ConnectISMG( unsigned int  C_seq, int cn, pthread_t threadnums, int login_type)
{
	int res = 1;
	int connect_times = 0;
	int Resultd=1;
	unsigned long Command_ID;
	unsigned long Body_Length;
	int socket_fd =0,ret =0;
	struct timespec  ismgtime;

	INFO("[INFO-RECV:%u]: %d Trying ISMG Server ( %s : %d)\n", threadnums, cn, smg_host, smg_port);
       res = ConnectSMG(&socket_fd, smg_host, smg_port);
	INFO("[INFO-ONLYRECV:%u]: res:%d  socket_fd:%d\n", threadnums, res, socket_fd );
       if (res != 0)
	{
		INFO("[INFO-RECV:] ConnectSMG fail errno = %d\n", errno);
		close(socket_fd);
		return -1;
       }
       if (LoginSMG(socket_fd, smg_user, smg_pass, login_type, 0x30, C_seq) != 0)
	{
		INFO("[INFO-RECV:] LoginSMG fail errno = %d\n", errno);
		close(socket_fd);
		return -1;
       }
	return socket_fd;
}


int partDGQX(  char * content, char * service ,char * mobile)
{
//DG 9310 142022 02881999930  rq_from=>6
//QX 9310 142015 02881288180  rq_from=>7
    char *p=NULL;
    char * idxdata1=NULL;
    char * idxdata2=NULL;
    char * idxdata3=NULL;
    
    int spacenum=0;
    int size=0;
         
    if ( content==NULL )
        return -1;
        
    p= content;    
   
    while( *p && size<=128 )
    {    
//    	printf("  --- test4 size=%d p=%c---\n",size,*p);

    	size++;
    		
    	if ( *p ==' ' )    	
    	     spacenum++;    	        	    	
    	if ( *p ==' ' && spacenum==2 )
    	    idxdata1= p+1;               //142022 02881999930 
    	if ( *p ==' ' && spacenum==3 )
    	    idxdata2= p+1;               //02881999930
    	        	
    	//if ( *p ==' ' && spacenum==4 )
    	//    idxdata3= p+1;
    	    
    	p++;     
    }
    
//    printf("  --- test6---\n");
     
    strncpy( service , idxdata1 , idxdata2-idxdata1-1 );
    
    strcpy( mobile , idxdata2 );
       
    return 0;		            	
}

int Recv_ismp(SMGP_DELIVER deliver, char * MsgID, MYSQL mysql)
{
        char ec[4];
        char * p_id;
        char * p_ec;
        int     id_len = 0;
        int     res;
        char temp[33];
	char sqlbuff[1024];
	char query_string[1024];
        
        char tmpmobile[32]="";
	char tmpservice[32]="";
	
	memset(query_string, 0, sizeof(query_string));
	memset(sqlbuff,0,1024);
	mysql_escape_string(sqlbuff, deliver.MsgContent, strlen(deliver.MsgContent));

        //---------------------------------------------
    	//四川新闻网电信订购关系同步包处理: addby 2007-03-09
    	//DG 9310 142022 02881999930  rq_from=>6
    	//QX 9310 142015 02881288180  rq_from=>7
    	
    	memset( tmpmobile  ,0, sizeof(tmpmobile));
    	memset( tmpservice  ,0, sizeof(tmpservice));
    				            	
    	if ( strncmp( "DG", deliver.MsgContent, 2 ) == 0 ) 
    	{   
    	     partDGQX( deliver.MsgContent ,tmpservice,tmpmobile );
    	     sprintf(query_string, "insert into %s.recv_q(rq_id, rq_mobile, rq_content, rq_date, rq_gateway, rq_provider, rq_linkid, rq_from, rq_status, rq_bak)"
    	  	"values(NULL,'%s','%s',now(),'%s','0','','6','','')",send_q_db, tmpmobile, tmpservice, deliver.DestTermID);			            	     
    	    
    	    INFO("[Recv_ismp]:DG:%s\n", query_string);
            res = mysql_real_query(&mysql, query_string, strlen(query_string));
            if ( res !=0 ) 
            {
                INFO("[-ERR]: query: %s\n", mysql_error (&mysql));
                return (-1);
            } 
            return res;
            
    	}
    	if ( strncmp( "QX", deliver.MsgContent, 2 ) == 0 ) 
    	{
    	     partDGQX( deliver.MsgContent ,tmpservice,tmpmobile );
    	     sprintf(query_string, "insert into %s.recv_q(rq_id, rq_mobile, rq_content, rq_date, rq_gateway, rq_provider, rq_linkid, rq_from, rq_status, rq_bak)"
    	  	"values(NULL,'%s','%s',now(),'%s','0','','7','','')",send_q_db, tmpmobile, tmpservice, deliver.DestTermID);
    	    
    	    INFO("[Recv_ismp]:QX:%s\n", query_string);
            res = mysql_real_query(&mysql, query_string, strlen(query_string));
            if ( res !=0 ) 
            {
                INFO("[-ERR]: query: %s\n", mysql_error (&mysql));
                return (-1);
            } 
            return res;
    	}
    	//---------------------------------------------
			            	        
        if ( strncmp( "SP_ZXQX", deliver.MsgContent, 7 ) == 0 ) {                       
            //正向取消        
            sprintf(query_string, "insert into %s.recv_q(rq_id, rq_mobile, rq_content, rq_date, rq_gateway, rq_provider, rq_linkid, rq_from, rq_status, rq_bak)"
            		" values(NULL, '%s', '%s', now(), '%s', '0', '','8','0','')", send_q_db, deliver.SrcTermID, sqlbuff, deliver.DestTermID);
            INFO("[Recv_ismp]:  %s\n", query_string);
            res = mysql_real_query(&mysql, query_string, strlen(query_string));
            if ( res !=0 ) {
                INFO("[-ERR]: query: %s\n", mysql_error (&mysql));
                return (-1);
            } 
            return res;
        }
        
        memset( ec, 0, 4 );
        memset(MsgID,0,sizeof(MsgID));
	memset(temp, 0, 33);
        p_id = strstr( deliver.MsgContent, "ID=" );                    
        p_ec = strstr( deliver.MsgContent, " EC=" );
        //if ( (p_id == NULL) || (p_ec == NULL) || (id_len = (int)(p_ec - p_id) ) > 15 ) {
        if ( (p_id == NULL) || (p_ec == NULL)  ) {
            INFO("[Recv_ismp]: ID ERROR:%s\n", p_id+3 );
            return (-1);
        }
	id_len = strlen(p_id) - strlen(p_ec) -3;
        memcpy( temp, p_id+3, id_len );     //COPY ID
	temp[id_len] = '\0';
        memcpy( ec, p_ec+4, 1 );                //COPY EC
        //BCD2ASCII( temp, deliver.MsgID,10 );
        //-------------------------------------------
        if ( (strstr( deliver.DestTermID,"7118")!=NULL||strstr( deliver.DestTermID,"10621598")!=NULL )&& strcmp( ec,"5")==0 )
        {
               memset( ec, 0, 4 );
               strcpy( ec,"7");
               INFO("[Recv_ismp]: qhxwdphs-sync-change-ec-to-7\n" );
        }    
	//上面已经有了转换,多余的
	//mysql_escape_string(sqlbuff, deliver.MsgContent, strlen(deliver.MsgContent));
        
        //ismp 同步包的各种情况处理
        if ( strncmp( "SP_DBQQJG", deliver.MsgContent, 9 ) == 0 ) {                                           
        //反向点播请求结果  
            sprintf(query_string, "insert into %s.report_q(rq_id, rq_sequence, rq_mobile, rq_state, rq_code, rq_date, rq_provider, rq_flag)"
            		"values(NULL, '%s', '%s', '0', '%s', now(), '1', '0')", send_q_db, temp, "SP_DBQQJG" , ec);
            
        } else if ( strncmp( "SP_DBJG", deliver.MsgContent, 7 ) == 0 ) {                                           
        //反向点播结果
            sprintf(query_string, "insert into %s.report_q(rq_id, rq_sequence, rq_mobile, rq_state, rq_code, rq_date, rq_provider, rq_flag)"
            		"values(NULL, '%s', '%s', '0', '%s', now(), '1', '0')", send_q_db, temp, "SP_DBJG" , ec);
            
        } else if ( strncmp( "SP_DZQQJG", deliver.MsgContent,9 ) == 0 ) {                       
        //反向定制请求结果
	     sprintf(query_string, "insert into %s.report_q(rq_id, rq_sequence, rq_mobile, rq_state, rq_code, rq_date, rq_provider, rq_flag)"
	     		"values(NULL, '%s', '%s', '0', '%s', now(), '1', '0')", send_q_db, temp, "SP_DZQQJG" , ec);
            
        } else if ( strncmp( "SP_DZJG", deliver.MsgContent, 7 ) == 0 ) {                       
        //反向定制结果
            sprintf(query_string, "insert into %s.report_q(rq_id, rq_sequence, rq_mobile, rq_state, rq_code, rq_date, rq_provider, rq_flag)"
            		"values(NULL, '%s', '%s', '0', '%s', now(), '1', '0')", send_q_db, temp, "SP_DZJG" , ec);
            
        }  else if ( strncmp( "SP_QXJG", deliver.MsgContent, 7 ) == 0 ) {                       
        //反向取消
            sprintf(query_string, "insert into %s.report_q(rq_id, rq_sequence, rq_mobile, rq_state, rq_code, rq_date, rq_provider, rq_flag)"
            		"values(NULL, '%s', '%s', '0', '%s', now(), '1', '0')", send_q_db, temp, "SP_QXJG" , ec);
            
        } else {
            //what happened??
            INFO("[-ERR]: ISMP Content Error, MsgContent:%s\n", deliver.MsgContent );
            return (-1);
        }
        INFO("[Recv_ismp]: %s\n", query_string);
        res = mysql_real_query(&mysql, query_string, strlen(query_string));
	 if ( res !=0 ) {
                INFO("[Recv_ismp][-ERR]: query: %s\n", mysql_error (&mysql));
                return (-1);
        } 
    return res;
}


int  ISMP_ChangeFeeType(char *fee_type)
{
	if(strcmp(fee_type,"01")==0)
    {
		strcpy(fee_type,"00");
	}
	else if (strcmp(fee_type,"02")==0)
    {
		strcpy(fee_type,"01");
	}
	else if (strcmp(fee_type,"03")==0)
    {
		strcpy(fee_type,"02");
	}
    return 0;
}

void *OnlyRecv(void *argv)
{
	int n=0;
    	int Status=0,ret = 0;
    	int Version = 0;
    	unsigned char t_MsgID[40],MsgID[40]; 
    	SMGP_DELIVER deliver;
    	int Rsocket_fd=0, recv_len= 0; 
    	char bufferrecv[1024]="";
    	unsigned int Command_ID=0;
    	pthread_t threadsnum=0;
    	unsigned int R_Seq = 0;
    	unsigned int Body_Length=0;
    	int cn= 0, connectionnum = 0,i =0;
    	struct timespec recvtime;
	pthread_mutex_t recvlock = PTHREAD_MUTEX_INITIALIZER;
   	pthread_cond_t  recvcond = PTHREAD_COND_INITIALIZER;
	char *socketbuffer = NULL;
	int bufferoffset =0, buffersize=0;
	RES_Q resqtmp;
    	struct tm *tp;
    	time_t timep;
	int resqnum =0;
	char sqlbuf[1024];
	char query_string[1024];
	MYSQL recv_mysql;
	unsigned char DealResult =0;
    	unsigned char LinkID[21];
    	unsigned char SubmitType=0;
	
    	threadsnum = pthread_self();
    	pthread_detach(threadsnum);
	
	INFO("[INFO-OnlyRecv:%u] RECV Thread START\n", threadsnum);

	/*连接recv_q, report_q所在数据库*/
	if(!mysql_init(&recv_mysql))
	{
		INFO("[INFO-OnlyRecv:%u][-ERR} init mysql error \n", threadsnum);
		exit(-1);
    	}
    	if (!mysql_real_connect(&recv_mysql, send_q_host, send_q_user, send_q_pass, send_q_db, send_q_port, NULL, 0) ) 
	{
        	INFO("[INFO-OnlyRecv:%u][-ERR] sql_connect: %s\n", mysql_error(&recv_mysql));
        	exit(-1);
    	}
	socketbuffer = malloc(socketbuffersize);
	if(socketbuffer == NULL)
	{
		INFO("[INFO-OnlyRecv:%u] malloc error .\n", threadsnum);
		socketbuffer = malloc(socketbuffersize);
	}
	buffersize = 0;
    	INFO("[INFO-OnlyRecv:%u]: Recv thread start!\n", threadsnum);
    	while(1)
	{
		if( HaveData(Rsocket_fd) > 0 )
		{
			// have data to receive
		    	if( buffersize < socketbuffersize)
		    	{
				recv_len = recv(Rsocket_fd, socketbuffer+buffersize, socketbuffersize-buffersize-1, 0);
				if(recv_len <= 0)
				{
						// reconnect
					INFO("[INFO-OnlyRecv:%u] recv thread cannot receive data from socket, reconnect. recv_len:%d\n",threadsnum, recv_len);
					INFO("[INFO-OnlyRecv:%u] Reset login status lock\n", threadsnum);
					close(Rsocket_fd);
					Rsocket_fd = -1;
					INFO("[INFO-OnlyRecv:%u] Buffersize == %d\n", threadsnum, buffersize);
					if( 0 == buffersize )
					{
						INFO("[INFO-OnlyRecv:%u] Buffersize ==0 , reconnect\n", threadsnum);
						Rsocket_fd = ConnectISMG(R_Seq, cn, threadsnum, smg_recv_type); // socket

⌨️ 快捷键说明

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