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

📄 sgipsock.cpp

📁 移动
💻 CPP
📖 第 1 页 / 共 3 页
字号:
						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;
}


/*******************************************************************************
return 
0 : no login or socket connect
-1: send buf failed
-4: receive response timeout
-5: logout be rejected
>0: success
*******************************************************************************/
int CSGIPSock::fLogout(bool bResp)
{
	return -4;
}
/*********************************************************************************
return 

/*********************************************************************************/
int CSGIPSock::fAliveTst()
{
	return 0;
}
/*******************************************************************************
return 
     -1:host or port is unexpect
	 -2:create  error
	 -3:connect failed
	  1:success connect
/*******************************************************************************/
int CSGIPSock::fConnect(char *host, unsigned int port)
{
	int ret=1;   
	if( (!host)||(port<1) )
	{  
		SGIP_PRINTOUT("FAILED: host or port is unexpect.");    
		return -1;
	}
	strcpy(m_smscInfo.SMSCIP,host);
	m_smscInfo.uPort=port;

	char degTemp[100];
	sprintf(degTemp,"connecting to %s...",host);	
	SGIP_PRINTOUT(degTemp);    
	if(m_bAlive)	fLogout(FALSE);
	if(m_bConnected)	
	{
		fDisconnect();	Sleep(1000);		
	}
//	if(m_hSocket==INVALID_SOCKET)
	{
		if(CreateSocket()==0) return -2;
	}

	m_sequence=0;
	m_bConnected=m_bAlive=FALSE;

	m_smscInfo.uPort=port;    
	strcpy(m_smscInfo.SMSCIP,host);	

	SOCKADDR_IN  sockaddr_inServer;
	memset(&sockaddr_inServer,0,sizeof(SOCKADDR_IN));
	sockaddr_inServer.sin_family=AF_INET;
	sockaddr_inServer.sin_addr.s_addr=inet_addr(host);
	sockaddr_inServer.sin_port=htons(port);
	if(connect(m_hSocket,(SOCKADDR *)&sockaddr_inServer,sizeof(SOCKADDR_IN)) == SOCKET_ERROR)
	{
		SGIP_PRINTOUT("FAILED: connect failed!"); 
		int nErrorCode_=WSAGetLastError();
		//ShowTcpErr(nErrorCode_);
		//out("Error:connect()\n");
		m_hSocket=INVALID_SOCKET;
		return(-3);
	}
	m_smscInfo.uPort=port;    strcpy(m_smscInfo.SMSCIP,host);	
	SGIP_PRINTOUT("connect +OK."); 
	
	m_bConnected=TRUE;
    /* set socket to non-blocking */
    u_long temp=1;
    if (ioctlsocket(m_hSocket,FIONBIO,&temp) == SOCKET_ERROR)
	{
	  int nErrorCode_=WSAGetLastError();
	}

	/* set socket to SO_LINGER */
	 LINGER  optval;
	 optval.l_onoff=1;
	 optval.l_linger=0;	//abort

	 if(setsockopt(m_hSocket, SOL_SOCKET,SO_LINGER,(char *)&optval, sizeof(LINGER)) == SOCKET_ERROR)
	 {
	  int nErrorCode_=WSAGetLastError();
	 }

	return 1;
}
/*******************************************************************************
return ;
/*******************************************************************************/
int CSGIPSock::fDisconnect()
{	
	if(m_bConnected) 
	{
		closesocket(m_hSocket);
		m_hSocket=INVALID_SOCKET;
		m_bConnected=FALSE;	
		m_bAlive=FALSE;
		SGIP_PRINTOUT("FAILED: socket连接已断开. ");
	}
	return 1;
}

int CSGIPSock::fReceive(BYTE* lpBuf, int nBufLen) 
{
	int    iRet=0;
	int  nLen;		

	nLen=sizeof(SGIP_MESSAGE_HEAD);
	struct SGIP_MESSAGE_HEAD *phead=(struct SGIP_MESSAGE_HEAD *)lpBuf;
	//if(Receive(lpBuf,nLen)!=nLen)
	if(recv(m_hSocket,(char*)lpBuf,nLen,0)!=nLen)
	{
		//fGetSockErr(degTemp); SGIP_PRINTOUT(degTemp) ;
		SGIP_PRINTOUT("FAILED: Receive -FAILED"); 
		return -1;
	}
//	network_head(phead);
	lpBuf+=nLen;	
	nLen=phead->command_length-sizeof(SGIP_MESSAGE_HEAD);
	if(nLen>1000)	nLen=0;		//added for assert
	if(nLen>0)
	{
		//if(Receive(lpBuf,nLen)!=nLen)
		if(recv(m_hSocket,(char*)lpBuf,nLen,0)!=nLen)
		{
			//fGetSockErr(degTemp); SGIP_PRINTOUT(degTemp) ;
			SGIP_PRINTOUT("FAILED: Receive -FAILED"); 
			return -1;
		}	
	}
	return nLen+sizeof(SGIP_MESSAGE_HEAD);
}

/*int CSGIPSock::fCodeMsg(BYTE *msg,int& nMsglen)
{
	int i=0,j=0,iRet=0;
	while(i++<nMsglen)
	{
		if((int)msg[i-1]>0x7f)
		{ iRet=8; break;}
		if((int)msg[i-1]=='_')
		{ iRet=8;break;}
	}
	if(iRet==8)  
	{
		BYTE*  lbTemp=msg;
		WCHAR wTemp[MAX_SGIP_MSGLEN/2]; memset((BYTE*)wTemp,0,MAX_SGIP_MSGLEN);		
		nMsglen=MultiByteToWideChar(CP_ACP,0,(char*)lbTemp, -1,wTemp,int(MAX_SENDBUF/2));
		if(nMsglen>0)
		{
			for(i=0;i<nMsglen-1;i++)
			{
				char cTemp[5]="\0";
				int xxx=*((WORD*)(wTemp+i));
				itoa(xxx,cTemp,16);	
				if((cTemp[3]==0)&&(cTemp[2])==0)
				{
					cTemp[3]=cTemp[1];cTemp[2]=cTemp[0];
					cTemp[1]=0;cTemp[0]=0;
				}
				if(cTemp[3]==0) cTemp[3]=48;
				if(cTemp[2]==0) cTemp[2]=48;
				if(cTemp[1]==0) cTemp[1]=48;
				if(cTemp[0]==0) cTemp[0]=48;				
				memcpy(lbTemp,cTemp,4);
				lbTemp+=4; 
			}
			nMsglen=lbTemp-msg;
		}
		else iRet=-1;
	}

	return iRet;
}*/

/*void CSGIPSock::OnClose(int nErrorCode) 
{
	fDisconnect();
	CSocket::OnClose(nErrorCode);
}*/




void CSGIPSock::SetHostName(char *phost)
{
	strcpy(m_smscInfo.SMSCIP,phost);

}

void CSGIPSock::SetPort(int port)
{
	m_smscInfo.uPort=port;

}

void CSGIPSock::SetUser(char *puser, char *pwd)
{
	strcpy(m_smscInfo.usrName,puser);
	strcpy(m_smscInfo.passWd,pwd); 

}

void CSGIPSock::ClearBuffer()
{
	FD_SET sockset = {1, m_hSocket};
	TIMEVAL tv = {0, 0};
    int result;
	int dRevLen;
	char buffer[MAX_SMPP_COM_BUF];
	while(1){
		result=select(0, &sockset, NULL, NULL, &tv);
		if(result>0)//while(1)// GetMessage(&msg, NULL, 0, 0) ) 
		{
			if ( FD_ISSET( m_hSocket, &sockset))
			{
					dRevLen=recv(m_hSocket,(char *)buffer,MAX_SMPP_COM_BUF,0);
					//if(dRevLen==0||dRevLen==SOCKET_ERROR )
			}
		}
		else
			break;
		if(dRevLen<=0||dRevLen==SOCKET_ERROR)
			break;
	}
}

void CSGIPSock::OnClose()
{
	closesocket(m_hSocket);
	m_bAlive=0;
	m_bConnected=0;
}

int CSGIPSock::GetRespState(int state, char *pcresp)
{
	char *pstr="";
	int result=0;
	switch(state)
	{
	//状态定义Command_status	错误代码	描述
	case 0:	pstr="无错误,命令正确接收";
		result=1;
		break;
	case 1:	pstr="非法登录,如登录名、口令出错、登录名与口令不符等。";
		break;
	case 2:	pstr="重复登录,如在同一TCP/IP连接中连续两次以上请求登录。";
		break;
	case 3:	pstr="连接过多,指单个节点要求同时建立的连接数过多。";
		break;
	case 4:	pstr="登录类型错,指bind命令中的logintype字段出错。";
		break;
	case 5:	pstr="参数格式错,指命令中参数值与参数类型不符或与协议规定的范围不符。";
		break;
	case 6:	pstr="非法手机号码,协议中所有手机号码字段出现非86130号码或手机号码前未加\"86\"时都应报错。";
		break;
	case 7:	pstr="消息ID错";
		break;
	case 8:	pstr="信息长度错";
		break;
	case 9:	pstr="非法序列号,包括序列号重复、序列号格式错误等";
		break;
	case 10:	pstr="非法操作GNS";
		break;
	case 11:	pstr="节点忙,指本节点存储队列满或其他原因,暂时不能提供服务的情况";
		break;
	case 21:	pstr="目的地址不可达,指路由表存在路由且消息路由正确但被路由的节点暂时不能提供服务的情况";
		break;
	case 22:	pstr="路由错,指路由表存在路由但消息路由出错的情况,如转错SMG等";
		break;
	case 23:	pstr="路由不存在,指消息路由的节点在路由表中不存在";
		break;
	case 24:	pstr="计费号码无效,鉴权不成功时反馈的错误信息";
		break;
	case 25:	pstr="用户不能通信(如不在服务区、未开机等情况)";
		break;
	case 26:	pstr="手机内存不足";
		break;
	case 27:	pstr="手机不支持短消息";
		break;
	case 28:	pstr="手机接收短消息出现错误";
		break;
	case 29:	pstr="不知道的用户";
		break;
	case 30:	pstr="不提供此功能";
		break;
	case 31:	pstr="非法设备";
		break;
	case 32:	pstr="系统失败";
		break;
	case 33:	pstr="短信中心队列满";
		break;
	default:
		pstr="其它错误码(待定义)";   break;//
	}
	sprintf(pcresp,"%d,%s",state,pstr);
	return result;
}


void CSGIPSock::AddMsgHeadcmdID(BYTE *pbuf,int cmdID)
{

}

void CSGIPSock::AddMsgHeadLength(BYTE* pbuf,int len)
{

}

char* CSGIPSock::AddStrToBuf(char *buf, char *src, int len)
{
	char str[140];
	ModifyStr(str,src,len);
	memcpy(buf,str,len);
	return buf+len;
}

void CSGIPSock::ModifyStr(char *buf,char *src, int len)
{
	int slen=strlen(src);
	strcpy(buf,src);
	for(int i=0;i<len-slen;i++)
		*(buf+slen+i)='\0';

}

void CSGIPSock::AddSequenceNO(char *buf,char *sp,int no)
{
	char strtime[20];
	struct SGIP_MESSAGE_HEAD *ph=(struct SGIP_MESSAGE_HEAD *)buf;
	CTime time=CTime::GetCurrentTime();
	sprintf(strtime,"%02d%02d%02d%02d%02d",time.GetMonth(),time.GetDay()
		,time.GetHour(),time.GetMinute(),time.GetSecond());
	ph->itime=atoi(strtime);
	ph->SP=atoi(sp);
	ph->no=no;
}

void CSGIPSock::GetSequence(BYTE *pbuf, int *ps)
{
  /*	for(int i=0;i<3;i++)
	{
		*(ps+i)=*(int *)pbuf;
		pbuf+4;
	}*/

	int i=0;
	BYTE *p;
	p=pbuf;
	p+=8;// ->sequenceno
	*ps=*(int *)p;

⌨️ 快捷键说明

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