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

📄 smgp3.c.bak

📁 基于上海电信 sgmp3.0短信协议,实现的源程序,现网运行稳定,unix (freeBSD) 环境下编程.
💻 BAK
📖 第 1 页 / 共 5 页
字号:
					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数量
						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)	//登陆请求响应
			{
				// 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(未响应): %-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 转化为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 )   //包月扣费结果通知.
			            {
			            	//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 {			//状态报告
			            char stat[8];
			            char err[8];
			            char temp[21];
			            char MsgID[11];

			            memset(stat,0,sizeof(stat));
			            memset(temp,0,

⌨️ 快捷键说明

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