?? smgp3.c
字號:
/*$Header: /base/cvsroot/wam/sms/platform/src/smgp3/SMGP3.c,v 1.26 2007/08/01 08:20:16 haowen Exp $*/
/*
* SMGP3.c
* SMGP protocol Daemon
* Version 3.0
*gcc SMGP3.c nsmgp.c mylog.c smgw.c utils.c cfg.c UNICODE_2_GBK.c md5.c parse_packet.c -g -lunicode -pthread -I/usr/local/include/mysql -lmysqlclient -L/usr/local/lib/mysql -o SMGP3
gcc -g SMGP3.c nsmgp.c common/mylog.c smgw.c parse_packet.c common/utils.c common/cfg.c common/UNICODE_2_GBK.c common/md5.c -lunicode -pthread -I./common/ -I/usr/local/include/mysql -lmysqlclient -L/usr/local/lib/mysql -o SMGP3
*/
#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 <gnu/regex.h>
#include <pthread.h>
#include "nsmgp.h"
#include "cfg.h"
#include "mylog.h"
#include "utils.h"
#include "smgw.h"
#include "error.h"
extern int errno;
typedef struct {
int MsgType;
char FeeType[4];
int FeeCode; // 0 -- 表示使用 '000000', 1 -- 表示使用真實(shí)的費(fèi)用
int FixFee; // 同上
} STYPE;
static STYPE S_MF; // 免費(fèi)
static STYPE S_DB; // 點(diǎn)播,按條
static STYPE S_ATQR; //按條確認(rèn)語
static STYPE S_ATDZ;
static STYPE S_QR; // 包月確認(rèn)
static STYPE S_BY; // 包月
//static STYPE S_AT;
static STYPE S_HD; // 包月話單
char logfile[256] = "";
char inifile[256] = "";
static int smg_type = 0;
static int smg_recv_type = 0;
static char smg_host[32] = "";
static int smg_port = 0;
static char smg_user[32] = "";
static char smg_pass[32] = "";
static char province[32] = "";
static char cmcode[32] = "";
//but not used
static char spid[32] = "";
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;
static char newspcode4[32] = "";
//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 expiretime = 0;
static int feetrim_flag = 0;
static int priority =0;
static int isHainanFlag=0;
static int altq_num = 10;
static int resnum = 50;
static int altq_timer = 1000 * 80;
static int connections =1; //總連接數(shù)
static int connected =1;// 已連接數(shù)
static int disconnected[10] ={-2,-2,-2,-2,-2,-2,-2,-2,-2,-2};// 斷開線程號
static int memsend = 500;
static int reportnum = 500;
static int NeedSubmitResp = 0;
static int reporttime =5;
static int socketbuffersize = 1024*1024;
static char nanjingct_flag[1 + 1] = "0";
/*管理平臺號碼*/
static char ismp[32] ="";
static char smps[32] ="";
// For main()
MYSQL fsql_mainmedia;
MYSQL fsql_main;
MYSQL fsql_servicemedia;
pthread_t pThread ,pThreadR, pThreadS;
struct timeval tSecond1, tSecond2 ;
pthread_mutex_t sendq_lock[10]={PTHREAD_MUTEX_INITIALIZER}; //發(fā)送隊(duì)列
pthread_mutex_t resq_lock[10]={PTHREAD_MUTEX_INITIALIZER}; // 接收隊(duì)列
pthread_mutex_t cnum_lock[10]={PTHREAD_MUTEX_INITIALIZER}; // 鏈接狀態(tài),submitresp
SEND_Q *SENDQ[10]; // send buffer
RES_Q *RESQ[10]; // recv response buffer
SEND_Q sendtemp; // send buffer temp
SEND_Q *reportlog=NULL;
static int threads[10][4] = {{0}}; //socket(鏈接狀態(tài)), 鏈接狀態(tài), needsubmitresp
/*查找BUFFER 中空位置,返回-1表示MAP滿*/
int FindPlace(SEND_Q *map, int size )
{
int i;
// INFO("[FUNCTION-FINDPLACE]: call , mapsize:%d\n", size);
for(i=0; i<size; i++)
{
// INFO("[FUNCTION-FINDPLACE] START sq_id :%d i:%d\n", map[i].sq_id ,i );
if(map[i].sq_id <= 0)
{
return i;
}
// INFO("[FUNCTION-FINDPLACE] END sq_id :%d i:%d\n", map[i].sq_id , i);
}
if(i == size)
{
return -1;
}
}
// 匹配發(fā)送隊(duì)列和接收隊(duì)列中數(shù)據(jù)
int CheckRes(SEND_Q *sendq, RES_Q *resq, SEND_Q *sendreport)
{
int sendn=0, resn =0;
int flaginsert =0,k=0, flag=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 == 33 || resq[resn].rq_response_status == 88 || resq[resn].rq_response_status == 1)
{
// 流量錯,重發(fā)
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 if( resq[resn].rq_response_status != 0 && resq[resn].rq_response_status != -1 && resq[resn].rq_response_status != -1)
{
if(sendq[sendn].sq_pri <= retry_max)
{
// insert into send_log , failed
InsertSendLog(&fsql_main, send_q_db,&sendq[sendn], resq[resn].rq_response_status);
if (strcmp(sendq[sendn].sq_from, "16") == 0)
{
memset(tempquery, 0 , 1024);
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");
}
}
sendq[sendn].sq_id = 0;
memset(&sendq[sendn], 0, sizeof(SEND_Q));
}
else
{
sendq[sendn].intime = time(NULL);
strcpy(sendq[sendn].sq_submit_id , "");
strcpy(sendq[sendn].sq_submit_stat, "");
sendq[sendn].sq_pri--;
}
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_msgid);
if(resq[resn].rq_response_status ==0) // response received
{
if(sendq[sendn].sq_msg_type == 20 || sendq[sendn].sq_msg_type == 21 || sendq[sendn].sq_msg_type == 22
|| sendq[sendn].sq_msg_type == 23 || sendq[sendn].sq_msg_type == 24 || sendq[sendn].sq_msg_type == 6)
{
//訂購,點(diǎn)播同步信息,沒有狀態(tài)報告,直接插入send_log
INFO("[INFO-MAIN] when sq_msg_type is 20,21,22,23,24, there are no report. so into send_log\n");
InsertSendLog(&fsql_main, send_q_db,&sendq[sendn], 0);
memset(&sendq[sendn],0, sizeof(SEND_Q));
break;
}
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");
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(&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,
"SMC", //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數(shù)量
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
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -