?? smgp3.c
字號:
INFO("[INFO-RECV:%u] recv thread cannot receive data from socket, reconnect. recv_len:%d\n",threadsnum, recv_len);
INFO("[INFO-RECV:%u] Reset login status lock\n", threadsnum);
pthread_mutex_lock(&cnum_lock[cn]);
threads[cn][1] = 0; // login status
threads[cn][2] = 0; // need submit resp
threads[cn][0] = 0; // socket
pthread_mutex_unlock(&cnum_lock[cn]);
INFO("[INFO-RECV:%u] Reset login status unlock\n", threadsnum);
close(Rsocket_fd);
INFO("[INFO-RECV:%u] Buffersize == %d\n", threadsnum, buffersize);
if( 0 == buffersize )
{
INFO("[INFO-RECV:%u] Buffersize ==0 , reconnect\n", threadsnum);
Rsocket_fd = ConnectISMG(R_Seq, cn, threadsnum, smg_type); // socket
if(Rsocket_fd > 0)
{
pthread_mutex_lock(&cnum_lock[cn]);
threads[cn][0] = Rsocket_fd;
pthread_mutex_unlock(&cnum_lock[cn]);
}
INFO("[INFO-RECV:]0Rsocket_fd = %d\n", Rsocket_fd);
//模擬 response
INFO("[INFO-RECV:%u] simulate resp lock\n", threadsnum );
pthread_mutex_lock(&sendq_lock[cn]);
pthread_mutex_lock(&resq_lock[cn]);
n = simulateres(SENDQ[cn], RESQ[cn]);
pthread_mutex_unlock(&resq_lock[cn]);
pthread_mutex_unlock(&sendq_lock[cn]);
INFO("[INFO-RECV:%u] simulate resp unlock simulate:%d\n", threadsnum ,n);
//修改等待resp數(shù)量
INFO("[INFO-RECV:%u] change need sub resp num lock\n", threadsnum);
pthread_mutex_lock(&cnum_lock[cn]);
threads[cn][2] -= n;
pthread_mutex_unlock(&cnum_lock[cn]);
INFO("[INFO-RECV:%u] change need sub resp num lock\n", threadsnum);
}
}
else
{
INFO("[INFO-RECV:%u] RECV DATA %d\n", threadsnum, recv_len);
buffersize += recv_len;
}
}
}
else if( HaveData(Rsocket_fd) < 0 )
{
INFO("[INFO-RECV:%u] Rsocket_fd error,Reset login status lock\n", threadsnum);
pthread_mutex_lock(&cnum_lock[cn]);
threads[cn][1] = 0; // login status
threads[cn][2] = 0; // need submit resp
threads[cn][0] = 0; // socket
pthread_mutex_unlock(&cnum_lock[cn]);
INFO("[INFO-RECV:%u] Reset login status unlock\n", threadsnum);
close(Rsocket_fd);
}
resqnum = checkresqnum(RESQ[cn]);
// INFO("[INFO-RECV:%u] Buffersize:%d resqnum:%d\n", threadsnum , buffersize, resqnum);
// if( (buffersize >= LEN_SGIP_HEADER ) && (resqnum >0) )
while( (buffersize>=LEN_SMGP_HEAD) && (resqnum >0))
{
n = GetMessageHead( socketbuffer, &Body_Length, &Command_ID, &R_Seq);
buffersize = buffersize - LEN_SMGP_HEAD;
INFO("[INFO-RECV:%u] buffsersize:%d Command_ID:%08x Body_Length:%d \n", threadsnum, buffersize, Command_ID, Body_Length);
memmove(socketbuffer , socketbuffer+LEN_SMGP_HEAD, buffersize);
if( buffersize < Body_Length )
{
usleep(1000*500);
recv_len = recv(Rsocket_fd, socketbuffer+buffersize, socketbuffersize-buffersize-1, 0);
if(recv_len> 0)
buffersize += recv_len;
INFO("[INFO-RECV:%u] buffersize < Body_Length,restart recv, buffersize=%d\n", threadsnum, buffersize);
}
if(Command_ID == ID_SMGP_LOGIN_RESP) //登陸請求響應(yīng)
{
// Bind Resp
n = RecvLoginResp(socketbuffer, Body_Length, &Status, &Version);
buffersize -= Body_Length;
memmove(socketbuffer, socketbuffer+Body_Length, buffersize );
INFO("[INFO-RECV:%u] login resp Recv ,chang login status lock\n", threadsnum );
if(Status == 0)
{
pthread_mutex_lock(&cnum_lock[cn]);
threads[cn][1] = 2; // login status
threads[cn][2] = 0; // need submit resp
pthread_mutex_unlock(&cnum_lock[cn]);
Rsocket_fd = threads[cn][0];
INFO("[INFO-RECV:%u] login resp Recv ,chang login status unlock.\n", threadsnum );
}
else
{
close(Rsocket_fd);
INFO("[INFO-RECV:%u] login resp Recv ,Status :%d login err .lock\n", threadsnum, Status);
pthread_mutex_lock(&cnum_lock[cn]);
threads[cn][0] = 0; // socket
threads[cn][1] = 0; // not login
threads[cn][2] = 0; // reset need submit resp
pthread_mutex_unlock(&cnum_lock[cn]);
INFO("[INFO-RECV:%u] login resp Recv ,login err . unlock\n", threadsnum );
}
}
else if(Command_ID == ID_SMGP_ACTIVE_TEST )
{
if (ActiveTestResp(Rsocket_fd, R_Seq) != 0) {
INFO("[INFO-RECV:%u]: ERR:SEND ACTIVE_TEST_RESP FAILED\n", threadsnum);
close(Rsocket_fd);
pthread_mutex_lock(&cnum_lock[cn]);
threads[cn][0] = 0; // socket
threads[cn][1] = 0; // not login
threads[cn][2] = 0; // reset need submit resp
pthread_mutex_unlock(&cnum_lock[cn]);
}
INFO("[INFO-RECV:%u]: CONNECTION IS OK. R: 0x%08x\n", threadsnum, R_Seq);
}
else if(Command_ID == ID_SMGP_ACTIVE_TEST_RESP)
{
INFO("[INFO-RECV:%u]: CONNECTION IS OK. S: 0x%08x NSR(未響應(yīng)): %-4d\n", threadsnum, R_Seq, NeedSubmitResp);
}
else if(Command_ID == ID_SMGP_SUBMIT_RESP)
{
// submit resp
memset(MsgID,0,sizeof(MsgID));
n = RecvSubmitResp(socketbuffer, Body_Length, MsgID, &Status);
buffersize -= Body_Length;
memmove(socketbuffer, socketbuffer + Body_Length , buffersize);
time(&timep);
tp=localtime(&timep);
resqtmp.intime= time(NULL);
resqtmp.rq_response_status = Status;
getdatetime(resqtmp.rq_response_time);
sprintf(resqtmp.rq_submit_id, "%u", R_Seq);
/*MSGID 轉(zhuǎn)化為ASCII碼*/
memset(t_MsgID, 0, sizeof(t_MsgID));
BCD2ASCII(t_MsgID, MsgID,10);
strncpy(resqtmp.rq_msgid, t_MsgID, sizeof(resqtmp.rq_msgid) - 1);
INFO("[INFO-RECV:%u] lock Submit RESP id :%s Status:%d, MSGID:%s\n", threadsnum, resqtmp.rq_submit_id, Status, resqtmp.rq_msgid);
pthread_mutex_lock(&resq_lock[cn]);
n= Insertresq(RESQ[cn], resqtmp);
pthread_mutex_unlock(&resq_lock[cn]);
INFO("[INFO-RECV:%u] unlock\n", threadsnum);
memset(&resqtmp, 0 , sizeof(resqtmp));
pthread_mutex_lock(&cnum_lock[cn]);
threads[cn][2] -= 1; // need submit resp
pthread_mutex_unlock(&cnum_lock[cn]);
if(n != 0)
INFO("[INFO-RECV:%u] insert resp failed .SEQ:%u Status:%d \n", threadsnum, R_Seq, Status);
}
else if(Command_ID == ID_SMGP_DELIVER)
{
memset(&deliver, 0, sizeof(deliver));
if (DeliverGet(socketbuffer, &deliver,Body_Length) != 0) {
INFO("[INFO-RECV:%u][-ERR]: RECV DELIVER FAILED\n", threadsnum);
close(Rsocket_fd);
pthread_mutex_lock(&cnum_lock[cn]);
threads[cn][0] = 0; // socket
threads[cn][1] = 0; // not login
threads[cn][2] = 0; // reset need submit resp
pthread_mutex_unlock(&cnum_lock[cn]);
}
buffersize -= Body_Length;
if(buffersize < 0)
{
INFO("[INFO-RECV:%u][-ERR]: buffersize<0, exit\n", threadsnum);
exit(0);
}
memmove(socketbuffer, socketbuffer+Body_Length, buffersize );
//如果接收號碼有118,去掉后再插入recv_q
INFO("[INFO-RECV:%u]SMGP3.0_before:DestTermID=%s\n", threadsnum, deliver.DestTermID);
if ( strncmp(deliver.DestTermID,"118",3) == 0 ) {
char dest[21+1];
memset(dest,0,22);
strcpy(dest,deliver.DestTermID);
memset(deliver.DestTermID,0,22);
strcpy(deliver.DestTermID,dest+3);
}
INFO("[INFO-RECV:%u]SMGP3.0_after:DestTermID=%s\n", threadsnum, deliver.DestTermID);
if ((strncmp(deliver.DestTermID, "9310", 4) == 0) && (strcmp(gateway_name, "scxwdphs") == 0))
{
char dest2[32 + 1];
memset(dest2, 0, 32 + 1);
strcpy(dest2, deliver.DestTermID);
memset(deliver.DestTermID,0,22);
strcpy(deliver.DestTermID, "10621111");
strcat(deliver.DestTermID, dest2 + 4);
INFO("[INFO-RECV:2 deliver.DestTermID = %s\n", deliver.DestTermID);
}
// if ((strncmp(deliver.DestTermID, "10621111", 8) == 0) && (strcmp(gateway_name, "scxwdphs") == 0))
// {
// char dest2[32 + 1];
// memset(dest2, 0, 32 + 1);
// strcpy(dest2, deliver.DestTermID);
// memset(deliver.DestTermID,0,22);
// strcpy(deliver.DestTermID, "9310");
// strcat(deliver.DestTermID, dest2 + 8);
// INFO("[INFO-RECV:2 deliver.DestTermID = %s\n", deliver.DestTermID);
// }
if ((strncmp(deliver.DestTermID, "10628538", 8) == 0) && (strcmp(gateway_name, "sctfdphs") == 0))
{
char dest2[32 + 1];
memset(dest2, 0, 32 + 1);
strcpy(dest2, deliver.DestTermID);
memset(deliver.DestTermID,0,22);
strcpy(deliver.DestTermID, "9009");
strcat(deliver.DestTermID, dest2 + 8);
INFO("[INFO-RECV:2 deliver.DestTermID = %s\n", deliver.DestTermID);
}
if (deliver.IsReport == 0)
{
memset(sqlbuf, 0, sizeof(sqlbuf));
mysql_escape_string(sqlbuf, deliver.MsgContent, strlen(deliver.MsgContent)) ;
//INFO("INFO-RECV:%u] DEBUG LinkID:[%s]\n", threadsnum, LinkID);
memset(LinkID, 0, sizeof(LinkID));
SubmitType=0;
if(unparse_packet_1(deliver.Paramater, deliver.ParamaterLen,LinkID, &SubmitType,&DealResult) !=0 )
{
INFO("[INFO-RECV:%u][ERR]: unparse_packet_1 ERR %s\n", threadsnum, deliver.Paramater);
break;
}
INFO("[INFO-RECV:%u] SubmitType:[%d] LinkID:[%s]\n",threadsnum,SubmitType, LinkID);
if( SubmitType==13 || SubmitType==15)
{
if( ( SubmitType==13 )&& strncmp(sqlbuf,"DG",2)!=0 && strncmp(sqlbuf,"QX",2)!=0)
{
sprintf(query_string, "insert into %s.recv_q values(NULL,'%s','%s',now(),'%s','0','%s','0','0','%s')",
send_q_db,deliver.SrcTermID, sqlbuf, deliver.DestTermID,LinkID,"13" );
}
if( ( SubmitType==13 )&& ( strncmp(sqlbuf,"DG",2)==0||strncmp(sqlbuf,"QX",2)==0 ) ) //定購/退訂.
{
sprintf(query_string, "insert into %s.recv_q values(NULL,'%s','%s',now(),'%s','0','%s','4','0','%s')",
send_q_db,deliver.SrcTermID, sqlbuf, deliver.DestTermID,LinkID,"13" );
}
if( SubmitType==15 )
{
sprintf(query_string, "insert into %s.recv_q values(NULL,'%s','%s',now(),'%s','0','%s','4','0','%s')",
send_q_db,deliver.SrcTermID, sqlbuf, deliver.DestTermID,LinkID,"15" );
}
INFO("[INFO-RECV:%u]: SubmitType is 13 or 15:%s\n", threadsnum, query_string );
ret= mysql_real_query(&recv_mysql, query_string, strlen(query_string));
if ( ret !=0 )
{
INFO("[-ERR]: sql_query: %s\n", mysql_error (&recv_mysql));
exit(-1);
}
} else
if( SubmitType==5 ) //包月扣費結(jié)果通知.
{
//MsgContent:09918061574 ,DXXDG ,20060601,20060630,0,001500
//oper databases; insert smc_result.
char smcBuf[256];
char mobile[21]="";
char service[20]="";
char date1[16]="";
char date2[16]="";
char status[6]="";
char feecode[8]="";
int ret2=1;
memset( smcBuf ,0 ,sizeof(smcBuf));
strcpy( smcBuf ,deliver.MsgContent );
INFO("[INFO-RECV:%u][BYKF]: SrcTermID:%s ,DestTermID:%s ,LinkID:%s smcBuf=%s\n",
threadsnum, deliver.SrcTermID, deliver.DestTermID ,LinkID ,smcBuf);
ret2=GetSmcNotice( smcBuf , mobile , service ,date1 ,date2 ,status,feecode );
//---------------------------------add by 2006-06-12
sprintf(query_string, "insert into %s.smc_result values(NULL,now(),'%s','%s','%s','%s','%s','%s','')",
send_q_db, mobile ,service ,feecode ,status,date1 ,date2);
INFO("[INFO-RECV:%u]: SubmitType is 5:%s\n", threadsnum, query_string );
ret= mysql_real_query(&recv_mysql, query_string, strlen(query_string));
if ( ret !=0 )
{
INFO("[-ERR]: sql_query: %s\n", mysql_error (&recv_mysql));
exit(-1);
}
}
else //MO
{
INFO("[INFO-RECV:]ismp-deliver.SrcTermID = %s\n", deliver.SrcTermID);
INFO("[INFO-RECV:]ismp-TEST10\n");
//if (strncmp(deliver.SrcTermID, ismp, 5) == 0)
//ismp升級使用 sctfdphs'ismp is 010000
if ( ( strncmp(deliver.SrcTermID, ismp, strlen(ismp)) == 0 || strncmp(deliver.SrcTermID, "010000", 5) == 0 )&& strlen(ismp)>3 )
{
INFO("[INFO-RECV:]ismp-TEST20\n");
ret = Recv_ismp( deliver, MsgID, recv_mysql);
if ( ret !=0 )
{
INFO("[INFO-RECV:%u][-ERR]: Recv_ismp error: %d\n", threadsnum, ret );
close(Rsocket_fd);
pthread_mutex_lock(&cnum_lock[cn]);
threads[cn][0] = 0; // socket
threads[cn][1] = 0; // not login
threads[cn][2] = 0; // reset need submit resp
pthread_mutex_unlock(&cnum_lock[cn]);
}
} else
{
if(strlen(deliver.SrcTermID) < 8)
{
sprintf(query_string, "insert into %s.recv_q values(NULL,'%s','%s',now(),'%s','0','%s','5','0','%s')",
send_q_db,deliver.SrcTermID, sqlbuf, deliver.DestTermID,LinkID,"0" );
INFO("[INFO-RECV:%u]: SQL query:%s\n", threadsnum, query_string );
}
else
{
sprintf(query_string, "insert into %s.recv_q values(NULL,'%s','%s',now(),'%s','0','%s','0','0','0')",
send_q_db,deliver.SrcTermID, sqlbuf, deliver.DestTermID, LinkID );
INFO("[INFO-RECV:%u]: MO:%s\n", threadsnum, query_string );
}
ret= mysql_real_query(&recv_mysql, query_string, strlen(query_string));
if ( ret !=0 )
{
INFO("[-ERR]: sql_query: %s\n", mysql_error (&recv_mysql));
exit(-1);
}
}
}
}
else { //狀態(tài)報告
char stat[8];
char err[8];
char temp[21];
char MsgID[11];
memset(stat,0,sizeof(stat));
memset(temp
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -