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

📄 sgipsock.cpp

📁 移动
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	p+=4;
	*(ps+1)=*(int *)p;
	p+=4;
	*(ps+2)=*(int *)p;
}
#define SAVEDATAPATH "d:\\buffhis\\"
BOOL bCreateFile=TRUE;
HFILE   hFile=-1;
void CSGIPSock::savebuffertofile(const char *buf)
{
	BYTE	byFileType=0;		//须配置控制 0: 以时间间隔秒产生文件, 1:以文件尺寸xMB产生文件
	static time_t prevtime=time(NULL);
	int		timeintervel=10*60;		//??? 5秒,须配置控制,按时间产生文件的时间间隔
	int		err;
	OFSTRUCT OfStruct;
	DWORD IOStatus;                             /* result of a file read  */
	char filestr[100],cdrstr[1000],AAddrstr[40],BAddrstr[40],CAddrstr[40],cTemp[40],prevstr[10];
	char bufferfile[2000];
	memset(bufferfile,0,sizeof(bufferfile));
	unsigned char  BUFTELNO[20];

	SYSTEMTIME	syst;
		time_t curttime=time(NULL);
		GetLocalTime(&syst);
		//bCreateFile
		if((curttime-prevtime)>timeintervel)//if(syst.wHour==0&&bCreateFile)//	//须产生新文件
		{
			bCreateFile=FALSE;
			prevtime=curttime;
			if(hFile!=-1)	//原文件结束,新产生文件
			{
				SetFilePointer((HANDLE)hFile, 0, NULL, FILE_BEGIN);
				sprintf(cdrstr,"wangliang savedata file begin\n");
				WriteFile((HANDLE)hFile, (LPSTR)cdrstr, strlen(cdrstr),&IOStatus,NULL);
				CloseHandle((HANDLE)hFile);
			}
			hFile=-1;
			GetLocalTime(&syst);
			sprintf(filestr,"%sBJ%04d%02d%02d%02d%02d.buf",SAVEDATAPATH,syst.wYear,syst.wMonth,syst.wDay,syst.wHour,syst.wMinute);
			if (hFile=OpenFile(filestr, (LPOFSTRUCT) &OfStruct, OF_EXIST|OF_SHARE_EXCLUSIVE) >= 0)
			{
				hFile=OpenFile(filestr,&OfStruct,OF_READWRITE|OF_CANCEL|OF_PROMPT);
				if(hFile<0)
					return;
			}
			else
			{
				hFile=OpenFile(filestr,&OfStruct,OF_CREATE | OF_READWRITE|OF_CANCEL|OF_PROMPT);
				if(hFile<0)
					return;
				//新产生文件,形成文件目录内容
				sprintf(cdrstr,"wangliang savedata file begin\n");
				WriteFile((HANDLE)hFile, (LPSTR)cdrstr, strlen(cdrstr),&IOStatus,NULL);
			}
		}
		else
		{
		//	if(syst.wHour!=0) bCreateFile=TRUE;
			if(hFile==-1)	//新产生文件
			{
				GetLocalTime(&syst);
				sprintf(filestr,"%sBJ%04d%02d%02d%02d%02d.buf",SAVEDATAPATH,syst.wYear,syst.wMonth,syst.wDay,syst.wHour,syst.wMinute);
				if (hFile=OpenFile(filestr, (LPOFSTRUCT) &OfStruct, OF_EXIST|OF_SHARE_EXCLUSIVE) >= 0)
				{
					hFile=OpenFile(filestr,&OfStruct,OF_READWRITE|OF_CANCEL|OF_PROMPT);
					if(hFile<0)
						return;
				}
				else
				{
					hFile=OpenFile(filestr,&OfStruct,OF_CREATE | OF_READWRITE|OF_CANCEL|OF_PROMPT);
					if(hFile<0)
						return;
					//新产生文件,形成文件目录内容
					sprintf(cdrstr,"wangliang savedata file begin\n");
					WriteFile((HANDLE)hFile, (LPSTR)cdrstr, strlen(cdrstr),&IOStatus,NULL);
				 }
			}
		}
		//hFile!=0,文件已经打开,可直接写文件内容
//		sprintf(cdrstr,"%s",data);
		////////////////////////////////////////////////////////
	//	int times=0;
	//	char *p;
	//	char perbyte[5];
	//	p=(char*)buf;
	//	while(1)
	//	{
	//		if(times==0)
	//		{
				GetLocalTime(&syst);
				sprintf(bufferfile,"%04d %02d %02d %02d %02d %02d \n",syst.wYear,syst.wMonth,syst.wDay,syst.wHour,syst.wMinute,syst.wSecond);
	//		}
	//		sprintf(perbyte,"%x ",*p);
	//		p++;
	//		times++;
	//		if(times>1000) break;
	//		if((times%32)==0) strcat(bufferfile,"\n");

	//	}
		////////////////////////////////////////////////////////
		WriteFile((HANDLE)hFile, (LPSTR)bufferfile, strlen(bufferfile),&IOStatus,NULL);
		WriteFile((HANDLE)hFile, (LPSTR)buf,1000,&IOStatus,NULL);
		WriteFile((HANDLE)hFile, (LPSTR)"\n", strlen(bufferfile),&IOStatus,NULL);
}
int CSGIPSock::fLogin1(char *usrname, char *passwd)
{

	strcpy(m_smscInfo.usrName,usrname); 
	strcpy(m_smscInfo.passWd,passwd);

	SGIP_PRINTOUT("Logining.....");

	BYTE buffer[MAX_SMPP_COM_BUF];
	memset(buffer,0,MAX_SMPP_COM_BUF);
	struct SGIP_MESSAGE_HEAD *phead=(struct SGIP_MESSAGE_HEAD *)buffer;
	BYTE *p=buffer+sizeof(struct SGIP_MESSAGE_HEAD);


	*p=1;///SP向SMG建立的连接,用于发送命令
	p++;
	p=(BYTE*)AddStrToBuf((char*)p,usrname,16);
	p=(BYTE*)AddStrToBuf((char*)p,passwd,16);
	p=(BYTE*)AddStrToBuf((char*)p,"",8);
	
	phead->command_id=SGIP_BIND;

	UINT packet_len=p-buffer;
	phead->command_length=packet_len;
//	phead->sequence_no=m_sequence++;

	int login_sequence[3];//=phead->sequence_no;
	AddSequenceNO((char*)buffer,"382032",m_sequence++);
	
	network_head(phead);

	GetSequence(buffer,login_sequence);
   // network_dword(login_sequence[0]);
	//if(Send(buffer,packet_len)==SOCKET_ERROR)
	if(send(m_hSocket,(const char*)buffer,packet_len,0)==SOCKET_ERROR)
	{
		if(send(m_hSocket,(const char*)buffer,packet_len,0)==SOCKET_ERROR)//重发
		{
			SGIP_PRINTOUT("FAILED:Login ,send packet failed.Disconnect..."); 
			fDisconnect();
			return -0xff;
		}
	}
//	Sleep(500);
	
	//receive resp	
	DWORD dRevLen;
	UINT starttime=time(NULL);	
	//MSG msg;
	while(1) //GetMessage(&msg, NULL, 0, 0) ) 
	{
		//TranslateMessage(&msg);		DispatchMessage(&msg);
		//IOCtl(FIONREAD,&dRevLen);	//get the socket on receive data length
		ioctlsocket(m_hSocket,FIONREAD,&dRevLen);
	    if(dRevLen>=sizeof(SGIP_MESSAGE_HEAD))
		{
			memset(buffer,0,MAX_SMPP_COM_BUF);
			dRevLen=fReceive(buffer,MAX_SGIP_RSP_BUF_LEN);
			if(login_sequence[0]==phead->SP
				/*&&login_sequence[1]==phead->itime*/
				&&login_sequence[2]==phead->no
			    && phead->command_id==SGIP_BIND_RESP)
			{
				BYTE ty=*(buffer+sizeof(SGIP_MESSAGE_HEAD));
				m_bAlive=TRUE; SGIP_PRINTOUT("Login +OK.");
				return ty;
			}
			else
			{
			//	SGIP_PRINTOUT("FAILED: Login +FAILED.");
			//	return -4;
				continue;
			}
		}
		Sleep(50);
		if(WaitForSingleObject(m_hEventMainOver,0)==WAIT_OBJECT_0) {break;}
		if(time(NULL)-starttime>MAX_SGIP_LOGINTIME)    //5--10s  
		{
			SGIP_PRINTOUT("FAILED:LOGIN receive timeout");	
			fDisconnect();
			return -4;		
		}
	}	
	return -4;
}

int CSGIPSock::fSendSM(char* destaddr,char* srcaddr, const char* sendmsg,bool bResp)
{

	BYTE buffer[MAX_SMPP_COM_BUF];
	struct SGIP_MESSAGE_HEAD *phead=(struct SGIP_MESSAGE_HEAD *)buffer;
	BYTE* p=buffer+sizeof(struct SGIP_MESSAGE_HEAD);
	memset(buffer,0,MAX_SMPP_COM_BUF);
	
	p=(BYTE*)AddStrToBuf((char*)p,srcaddr,21);
	p=(BYTE*)AddStrToBuf((char*)p,"000000000000000000000",21);//付费号码
	//p=(BYTE*)AddStrToBuf((char*)p,destaddr,21);//付费号码
	*p++=1;//接收的用户数
	p=(BYTE*)AddStrToBuf((char*)p,destaddr,21);//接收的号码
	p=(BYTE*)AddStrToBuf((char*)p,"82032",5);//企业代码
	p=(BYTE*)AddStrToBuf((char*)p,"xylsm",10);//业务代码 wangliang 2003.2.10
	*p++=1;//记费类型
	p=(BYTE*)AddStrToBuf((char*)p,"0",6);//该条短消息的收费值
	p=(BYTE*)AddStrToBuf((char*)p,"0",6);//赠送用户的话费
	*p++=0;//代收费标志,0:应收;1:实收
	*p++=2;//引起MT消息的原因  2-非MO点播引起的MT消息
	*p++=0;//优先级0-9从低到高,默认为0
	p=(BYTE*)AddStrToBuf((char*)p,"",16);//短消息寿命的终止时间,如果为空,表示使用短消息中心的缺省值
	p=(BYTE*)AddStrToBuf((char*)p,"",16);//短消息定时发送的时间,如果为空,表示立刻发送该短消息
	*p++=2;//状态报告标记 1-该条消息无论最后是否成功都要返回状态报告
	//*p++=0;//信息类型 0-短消息信息
	*p++=0;//GSM协议类型。 0 The TP-UD field contains only the short message
	*p++=0;//GSM 2TP_udhi协议类型。 0 The TP-UD field contains only the short message
	*p++=15;//8;//短消息的编码格式 8:UCS2编码 15:gbk  0:ASSIC
	*p++=0;//信息类型:0-短消息信息
//	*p++=len;//短消息的长度
//	int len=fill_message(p+1,sendmsg);		//length and content
//	p+=len;
	///////////////////
	p+=3;
	int len=strlen(sendmsg);
	*(DWORD*)p=(DWORD)len;
	p++;
	p=(BYTE*)AddStrToBuf((char*)p,(char*)sendmsg,len);
	///////////////////
	p=(BYTE*)AddStrToBuf((char*)p,"",8);//保留,扩展用

	phead->command_id=SGIP_SUBMIT;
	UINT packet_len=p-buffer;
	phead->command_length=packet_len;
	

	AddSequenceNO((char*)buffer,"382032",m_sequence++);
	TRACE("--------PACKET_LEN---%d\n",phead->command_length);
	int send_sequence[3]; 

	network_head(phead);
	TRACE("--------PACKET_LEN---%d\n",phead->command_length);
	GetSequence(buffer,send_sequence);

	///////////////
//	savebuffertofile((const char*)buffer);
	//////////////
	//if(Send(buffer,packet_len)==SOCKET_ERROR)
	//修改对长TCP包一个send可能不能发送完
	BYTE *pbuf=buffer;
	len=0;
	int ErrCode,SendNum=0;
	BOOL bBeginSend=false;
	while((len=send(m_hSocket,(const char*)pbuf,packet_len,0))!=packet_len)
	{
		if(len==SOCKET_ERROR)
		{
			ErrCode=WSAGetLastError();
			if(ErrCode!= WSAEWOULDBLOCK)
			{
				TRACE("FAILED: Send Short Message ,send packet failed.disconnect.....%d.",ErrCode); 
			//	fDisconnect();
				return -0xff;
			}
			else
			{
				if(bBeginSend)
				{
					SendNum++;	//blocke err closeconnect
					if(SendNum>500)
					{
						TRACE("FAILED: Send Short Message ,send packet failed.disconnect....%d",ErrCode); 
					//	fDisconnect();
						return -0xff;
					}
					Sleep(30);
				}
				else
				{
					SendNum++;	//block err closeconnect
					if(SendNum>500)
					{
						TRACE("FAILED: Send Short Message ,send packet failed.disconnect...%d",ErrCode); 
					//	fDisconnect();
						return -0xff;
					}
					Sleep(30);
				}
			}
		}
		else
		{
			bBeginSend=TRUE;
			if(len==packet_len)
				break;
			pbuf+= len;
			packet_len-= len;
		}
	}
//	Sleep(50);
	bResp=false;	//不等待结果
	if(!bResp)	return 0;
	FD_SET sockset = {1, m_hSocket};
	TIMEVAL tv = {10, 0};
    int result=select(0, &sockset, NULL, NULL, &tv);
	
	DWORD dRevLen;
//	UINT starttime=time(NULL);
	//MSG msg;
	if(result>0)//while(1)// GetMessage(&msg, NULL, 0, 0) ) 
	{
		//TranslateMessage(&msg);
		//DispatchMessage(&msg);
		//IOCtl(FIONREAD,&dRevLen); 
		if ( FD_ISSET( m_hSocket, &sockset))
		{
#if 1
	//		while(1){
//				dRevLen=recv(m_hSocket,(char *)buffer,MAX_SMPP_COM_BUF,0);
				dRevLen=fReceive(buffer,MAX_SMPP_COM_BUF);
				if(send_sequence[0]==phead->SP
					&&send_sequence[1]==phead->itime
					&&send_sequence[2]==phead->no
					&&phead->command_id==SGIP_SUBMIT_RESP)
				{
					BYTE ty=*(buffer+sizeof(SGIP_MESSAGE_HEAD));
					return ty;
				}
//				if(dRevLen<=0)
//					break;
//				result=select(0, &sockset, NULL, NULL, &tv);
//				if(result>0)
//				{
//					if ( FD_ISSET( m_hSocket, &sockset))
//						continue;
//					else
//						break;
//				}
//				else
//					break;
//			}
#else
			
		/*	ioctlsocket(m_hSocket,FIONREAD,&dRevLen);
			if(dRevLen>=sizeof(SGIP_MESSAGE_HEAD))
			{
				memset(buffer,0,MAX_SMPP_COM_BUF);
				dRevLen=fReceive(buffer,sizeof(MAX_SMPP_COM_BUF));
//				if(send_sequence==phead->sequence_no && phead->command_id==ESME_SUB_SM_RESP)
				if(send_sequence==phead->sequence_no &&phead->command_id==ESME_SUB_SM_RESP)
				{
					if(phead->command_status==E_SUCCESS)
					{
						SGIP_PRINTOUT((CString)destaddr + "  Submit +OK.\n");
						return 1;
					}
					else
					{
						SGIP_PRINTOUT("FAILED: Submit.\n");
						fLogout(FALSE);
						fDisconnect();
						return -2; 
					}
				}
			}*/
		
			//TranslateMessage(&msg);		DispatchMessage(&msg);
			//IOCtl(FIONREAD,&dRevLen);	//get the socket on receive data length
			//////////////////////////////
				UINT starttime=time(NULL);
				while(1) //GetMessage(&msg, NULL, 0, 0) ) 
				{
					//TranslateMessage(&msg);		DispatchMessage(&msg);
					//IOCtl(FIONREAD,&dRevLen);	//get the socket on receive data length
					ioctlsocket(m_hSocket,FIONREAD,&dRevLen);
					if(dRevLen>=sizeof(SGIP_MESSAGE_HEAD))
					{
						memset(buffer,0,MAX_SMPP_COM_BUF);
						dRevLen=fReceive(buffer,MAX_SGIP_RSP_BUF_LEN);
						if(send_sequence[0]==phead->SP
							/*&&send_sequence[1]==phead->itime*/
							&&send_sequence[2]==phead->no
							&& phead->command_id==SGIP_SUBMIT_RESP)
						{
							BYTE ty=*(buffer+sizeof(SGIP_MESSAGE_HEAD));
							m_bAlive=TRUE; SGIP_PRINTOUT("SUBMIT_RESP +OK.");
							return ty;
						}
						else
						{
							SGIP_PRINTOUT("FAILED: SUBMIT_RESP FAILED.");
						//	return -4;
						}
					}
					Sleep(50);
					if(WaitForSingleObject(m_hEventMainOver,0)==WAIT_OBJECT_0) {break;}
					if(time(NULL)-starttime>MAX_SGIP_LOGINTIME)    //5--10s  
					{
						SGIP_PRINTOUT("FAILED:SUBMIT_RESP timeout");	
						break;
					//	fDisconnect();
					//	return -4;		
					}
				}	
		/////////////////////////////////////
#endif
		}
	}	
	else if(result<0)
	{
//		Sleep(50);
//		if(WaitForSingleObject(m_hEventMainOver,0)==WAIT_OBJECT_0) {break;}
//		if(time(NULL)-starttime>MAX_SGIP_SUBTIME)    //5--10s  
		{
			SGIP_PRINTOUT("FAILED: SendSM receive timeout");	
			fLogout(FALSE);
			fDisconnect();
//			Sleep(3000);
		//	return -4;		
		}
	}
	FD_CLR(m_hSocket,&sockset);
	return result;
}

⌨️ 快捷键说明

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