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

📄 cngp.c

📁 增值业务的sngp协议。
💻 C
📖 第 1 页 / 共 5 页
字号:
/*$Header: /home/cvsadmin/cvsroot/wam/sms/platform/src/cngp/cngp.c,v 1.17 2007/08/29 09:34:17 haowen Exp $*/
/*
 * cngp.c
 * CNGP protocol Daemon
 */

//cc cngp.c ncngp.c  common/errm.c common/mylog.c common/utils.c  common/md5.c  common/getopt.c  common/cfg.c common/smgw.c  common/gb2uni.c   common/UNICODE_2_GBK.c -lc_r -lpthread -I./common/ -I/usr/local/include/mysql -lmysqlclient -L/usr/local/lib/mysql -g -dDEBUG -o cngp
  
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <errmsg.h>
#include <my_config.h>
#include <mysql.h>
#include <mysqld_error.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/errno.h>
#include <unistd.h>
#include <time.h>
#include <stdarg.h>
#include <unistd.h>
#include <errno.h>
#include <pthread.h>

#include <smgw.h>
#include <cfg.h>
#include <mylog.h>
#include <utils.h>
#include <errm.h>
#include "ncngp.h"

#define MAXCNN 10
extern int errno;

typedef struct {
	int SubType;		//短消息子类型
	char FeeType[8];	//资费类型
	int FeeUserType;	//计费用户类型
}STYPE;

static STYPE S_MFXX;	//免费信息
static STYPE S_DBXF;	//点播下发
static STYPE S_DYJG;	//订阅结果
static STYPE S_QXDY;	//取消订阅
static STYPE S_BYHD;	//包月扣款请求
static STYPE S_BYXX;	//订阅下发(包月)
static STYPE S_ATXF;	//订阅下发(按条)
static STYPE S_ZXDX;	//自写短信
static STYPE S_QBTD;	//全部退定
static STYPE S_ECQR;	//二次确认

//const static int allconn = 10;

char inifile[256] = "";
/**********************需配置的变量************************/
/*日志配置*/
char logfile[256] = "";

 /*网关帐号配置*/
static char CNGP_IP[32] = "";
unsigned int CNGP_PORT = 0;
static char LOGIN_NAME[32] = "";
static char LOGIN_PASSWORD[32] = "";
static char ISMP_SERVICE_CODE[32] = ""; //ISMP 特服号
static char SSMP_SERVICE_CODE[32] = ""; // ssmp 特服号码
unsigned int CNGP_FLAG = 0;
unsigned int RECV_DEL106_FLAG = 1;

static unsigned int timeoutu = 0;
int Priority = 0;
char province[5]="";
//从db获取
static char corpid[32] = "";
static char spid[32] = "";

static int connecttype = 0; // 链接类型
// connecttype == 0 时用到
static int port = 0;
static int send_version = 0;
static int login_mode = 0;
static int connnum = 0;

// connecttype ==1 时用到
static int mtnum = 1;
static int mtport = 7890;
static int mtmode = 0;
static int mtversion = 0;

static int monum = 1;
static int moport = 7890;
static int momode = 0;
static int moversion = 0;

static int  feecode_flag = 0;
static int  report_flag = 0;
static char send_q_db[32] = "";
static char send_q_host[32] = "";
static char send_q_user[32] = "";
static char send_q_pass[32] = "";
static int send_q_port = 3306;

//David for 2SP
static char media_db[32] = "";
static char media_host[32] = "";
static char media_user[32] = "";
static char media_pass[32] = "";
static int  media_port = 3306;

static char gateway_name[32] = "";

//SERVICEMEDIA
static char servicemedia_db[32] = "";
static char servicemedia_host[32] = "";
static char servicemedia_user[32] = "";
static char servicemedia_pass[32] = "";
static int  servicemedia_port = 3306;

static int  timeout_no_submit_resp = 180;

static int retry_num = 3;
static int retry_max = -3;
static int MAX_MSG_LEN = 0;
static int altq_num = 10;
static int resnum = 50;
static int connected =1;// 已连接数
static int memsend = 500;
static int reportnum = 500;
static int reporttime =5;
static int socketbuffersize = 1024*1024;
static int active_time = 5;
static int connections =0;
// For main()
MYSQL fsql_mainmedia;
MYSQL fsql_main;
MYSQL fsql_servicemedia;

pthread_t pThread ,pThreadR, pThreadS;

extern int disable_errm;

struct timeval tSecond1, tSecond2 ;

pthread_mutex_t sendq_lock[MAXCNN]={PTHREAD_MUTEX_INITIALIZER}; //发送队列
pthread_mutex_t resq_lock[MAXCNN]={PTHREAD_MUTEX_INITIALIZER}; // 接收队列
pthread_mutex_t cnum_lock[MAXCNN]={PTHREAD_MUTEX_INITIALIZER}; // 链接状态,submitresp

SEND_Q *SENDQ[MAXCNN]; // send buffer 
RES_Q *RESQ[MAXCNN]; // recv response buffer
SEND_Q sendtemp; // send buffer temp
SEND_Q *reportlog=NULL;
static int  threads[MAXCNN][4] = {{0}}; //socket(链接状态), 链接状态, needsubmitresp


/*查找BUFFER 中空位置,返回-1表示MAP满*/
int FindPlace(SEND_Q *map, int size )
{
	int i;

	for(i=0; i<size; i++)
	{
		if(map[i].sq_id <= 0)
		{
			return i;
		}
	}
	
	if(i == size)
	{
		return -1;
	}
	
}


// 匹配发送队列和接收队列中数据
int CheckRes(SEND_Q *sendq, RES_Q  *resq, SEND_Q *sendreport)
{
	int sendn=0, resn =0;
	int flaginsert =0,k=0;
	char tempquery[1024];
	
	for ( resn =0 ; resn <memsend; resn++)
	{
		if(strlen(resq[resn].rq_submit_id) >0)
		{
			for(sendn =0 ; sendn <memsend ; sendn++)
			{
				if(strcmp(resq[resn].rq_submit_id, sendq[sendn].sq_submit_id) == 0 ) 
				{
				//	if( resq[resn].rq_response_status !=0 )
				//	{
						//错误,重发
				//		strcpy(sendq[sendn].sq_submit_id , "");
				//		strcpy(sendq[sendn].sq_submit_stat, "");
				//		INFO("[INFO-MAIN] resend  sq_id[%d]\n", sendq[sendn].sq_id );
				//		break;
				//	}
				//	else
					{
						k= FindPlace(sendreport,  memsend);
						if(k == -1)
						{
							INFO("[INFO-MAIN] reportlog full\n");
							return -1; // 缓存满
						}
						else
						{
							strcpy(sendq[sendn].sq_sms_scheduletime, resq[resn].rq_response_time);
							strcpy(sendq[sendn].sq_submit_id , resq[resn].rq_response_id);
							if(resq[resn].rq_response_status ==0) // response received 
								strcpy(sendq[sendn].sq_submit_stat, "SMC");
							else if(resq[resn].rq_response_status == -1) // simulate response 
								strcpy(sendq[sendn].sq_submit_stat, "SMC");
							else if(resq[resn].rq_response_status == -3) // unsend
								strcpy(sendq[sendn].sq_submit_stat ,"unsend");
							else
							{
							//	strcpy(sendq[sendn].sq_submit_stat,"fail");
								sprintf(sendq[sendn].sq_submit_stat, "fail_%d",resq[resn].rq_response_status);
							}
							memset(tempquery, 0 , 1024);
							// insert sp 2
						     	if (strcmp(sendq[sendn].sq_from, "16") == 0)
						     	{
								sprintf(tempquery,"insert into %s.lowerSP (AutoId, ServiceCode, Mobile, MobileType, Spnumber, Msg, MsgType, LinkID, WAMID, Status, ArrivedTime, MsgFrom, MediaName, Reserved) 	values(null, \'%s\', \'%s\', \'0\', \'%s\', \'%d\', \'%s\', \'%s\', \'%s\', \'0\', now(), \'0\', \'%s\', \'\')", media_db, sendq[sendn].sq_service_code, sendq[sendn].sq_mobile, sendq[sendn].sq_send, resq[resn].rq_response_status, "1", sendq[sendn].sq_linkid, sendq[sendn].sq_wamid, gateway_name);
								INFO("[INFO-MAIN]: Insert l2sp:[%s]\n",  tempquery);
				 		     		flaginsert= mysql_real_query(&fsql_mainmedia, tempquery, strlen(tempquery));
				 				if (flaginsert != 0)
								{
									INFO("[-ERR-MAIN]: insert l2sp failed .\n");
								}
						     	}
							INFO("[INFO-MAIN] resn[%d] Response ID[%s] status[%d] status found in sendbuffer\n", resn, resq[resn].rq_submit_id, resq[resn].rq_response_status);
							memcpy(&sendreport[k], &sendq[sendn] ,sizeof(SEND_Q));
			//				INFO("[DEBUG] sendreport[%d].sq_id = %d \n", k, sendreport[k].sq_id);
							memset(&resq[resn], 0, sizeof(RES_Q) );
							memset(&sendq[sendn],0, sizeof(SEND_Q));
			//				INFO("[INFO-MAIN] check res :resq[%d] sendq[%d] \n",resn, sendn);
							break;
						}
					}
				}
			}
			memset(&resq[resn], 0, sizeof(RES_Q)); // Not found , clear 
		}
	}
	return 0;
}


int Dumptosendreport(SEND_Q *send, char *deletestring)
{
	int i =0,n=0;
    	char tempquery[1024];
    	char content[256];

	for (i=0; i< memsend; i++)
		if(send[i].sq_id >0)
		{
			    send[i].sq_desc_pi[0] = '\0';
			    send[i].sq_desc_mi[0] = '\0';

			    mysql_escape_string(content, send[i].sq_sms_content, strlen(send[i].sq_sms_content)) ;
			    sprintf(tempquery, " (NULL,'%s',%d,'%s','%s','%s',%d,'%s','%s','%s','%s','%s','%s','%s',%d,'%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s')",
			            //send->sq_id,
			            send[i].sq_service_code,
			            send[i].sq_pri,               // %d
			            send[i].sq_message_format,
			            send[i].sq_fee_type,
			            send[i].sq_fee_code,
			            send[i].sq_sms_length,        // %d
			            content,
			            send[i].sq_content_type,
			            send[i].sq_desc_pi,
			            send[i].sq_desc_mi,
			            send[i].sq_mobile,
			            send[i].sq_send,
			            send[i].sq_fee_mobile,
			            send[i].sq_msg_type,          // %d
			            send[i].sq_content_name,
			            send[i].sq_content_id,
			            send[i].sq_provider,
			            send[i].sq_province,
			            send[i].sq_sms_scheduletime,
			            send[i].sq_send_time,
			            send[i].sq_submit_id,
			            send[i].sq_submit_stat,   //"SMC", send[i].sq_submit_stat, send->sq_submit_stat,
			            send[i].sq_submit_time,
			            send[i].sq_linkid,
			            send[i].sq_jf_code,
			            send[i].sq_product,
			            send[i].sq_zone_province,
			            send[i].sq_zone_city,
			            send[i].sq_from,
			            send[i].sq_wamid,
			            send[i].sq_reg_cmd,
			            send[i].sq_reg_gateway,
			            send[i].sq_reg_from);
				strcat(deletestring, tempquery);
				strcat(deletestring, ",");
				n++;
			//	send[i].sq_id =0;
				memset(&send[i], 0, sizeof(SEND_Q));
		}
		return n;
}

// 模拟response,返回值为模拟的response数量
int simulateres(SEND_Q *sendq, RES_Q *resq)
{
	int k =0, i=0, n=0;
#if 0
	for(k = 0; k<memsend ; k++)
		if( strcmp(sendq[k].sq_submit_stat , "sub") ==0 )
			for(i=0; i< memsend ; i++)
				{
					if(strlen(resq[i].rq_submit_id)==0)
					{
						strcpy(resq[i].rq_submit_id , sendq[k].sq_submit_id);
						getdatetime(resq[i].rq_response_time);
						resq[i].rq_response_status = -3;
						resq[i].intime = time(NULL);
					}
				}
#endif 

#if 1
		// check resq 
		for(k=0; k<memsend; k++)
			if( 0 == strlen(resq[k].rq_submit_id)  )
				i++;
		if(i == memsend)
		{
			// resq is null 
			for(k = 0; k<memsend ; k++)
				if( strcmp(sendq[k].sq_submit_stat , "sub") ==0 )
					for( i=0; i< memsend ; i++ )
					{
						if( strlen(resq[i].rq_submit_id) == 0 )
						{
							strcpy(resq[i].rq_submit_id , sendq[k].sq_submit_id);
							strcpy(resq[i].rq_response_id,sendq[k].sq_submit_id);
							getdatetime(resq[i].rq_response_time);
							resq[i].rq_response_status = -3;
							resq[i].intime = time(NULL);
							n++;
						}
					}
		}
		else{
			
			for( k=0; k<memsend; k++ )
				if(strcmp(sendq[k].sq_submit_stat, "sub") ==0)
				{	
					for( i=0; i<memsend ; i++ )
						if(strcmp(resq[i].rq_submit_id , sendq[k].sq_submit_id) ==0)
							// ignore 
							break ;

					for(i =0; i< memsend ; i++)
						if(strlen(resq[i].rq_submit_id) ==0)
						{
							strcpy(resq[i].rq_submit_id, sendq[k].sq_submit_id );
							strcpy(resq[i].rq_response_id, sendq[k].sq_submit_id);

⌨️ 快捷键说明

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