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

📄 cmppsock.cpp

📁 移动
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		}
		if(bEventMainOver) {break;}
		Sleep(10);
		if(time(NULL)-starttime>MAX_CMPP_SUBTIME)    //5--10s  
		{
			PRINTOUT("CMPP FAILED: SendSM receive timeout");	
			fLogout(FALSE);
			fDisconnect();
			Sleep(2000);
			return -4;		
		}
	}	
	return -4;	
}


/*******************************************************************************
return 
0 : no login or socket connect
-1: send buf failed
-4: receive response timeout
-5: logout be rejected
>0: success
*******************************************************************************/
int CCmppSock::fLogout(bool bResp)
{
	PRINTOUT("Logouting.....") ;
	if(!m_bAlive) {PRINTOUT("FAILED: logout,but no login."); return 0;}
	
	MESSAGE_HEAD head;
	UINT logout_sequence=m_sequence++;
	UINT packet_len=sizeof(MESSAGE_HEAD);
	head.command_length=network_dword(packet_len);
	head.command_id=network_dword(CMPP_TERMINATE);
	head.sequence_no=network_dword(logout_sequence);

	if(send(m_hSocket,(const char*)&head,packet_len,0)<0)
		if(send(m_hSocket,(const char*)&head,packet_len,0)<0)
		{
			PRINTOUT("FAILED: send packet failed."); 
			return -0xff;
		}
	Sleep(100);	

	if(!bResp) return 1;
	//receive
	DWORD dRevLen;
	UINT starttime=time(NULL);
	//MSG msg;
	while(1)//GetMessage(&msg, NULL, 0, 0) ) 
	{
		ioctlsocket(m_hSocket,FIONREAD,&dRevLen);
	    if(dRevLen>=sizeof(MESSAGE_HEAD))
		{
			memset(&head,0,sizeof(MESSAGE_HEAD));
			dRevLen=fReceive((BYTE*)&head,sizeof(MAX_CMPP_COM_BUF));
			if(logout_sequence==head.sequence_no && head.command_id==CMPP_TERMINATE_REP)
			{
				//if(head.command_status==E_SUCCESS)
				{
					m_bAlive=FALSE; PRINTOUT("Logout +OK.");
					return 1;
				}
				//else
				{
					//PRINTOUT("FAILED: Logout ");
					//return -5;
				}			
			}
		}
		Sleep(100);
		if(bEventMainOver) {break;}
		if(time(NULL)-starttime>MAX_CMPP_LOGOUTTIME)    //5--10s		
		{
			PRINTOUT("FAILED: Logout,receive timeout");	
			return -4;		
		}
	}
	return -4;
}
/*********************************************************************************
return 

/*********************************************************************************/
int CCmppSock::fAliveTst(BOOL bResp)
{
//	fReadAndAtuoAnswer();
//	return 0;

	PRINTOUT("Alive test.....") ;
	if(!m_bConnected) {PRINTOUT("FAILED: have not connected."); return 0;}
	
	MESSAGE_HEAD head;
	UINT packet_len=sizeof(MESSAGE_HEAD);
	UINT querylink_sequence=m_sequence++;
	head.command_length=network_dword(packet_len);
	head.command_id=network_dword(CMPP_ACTIVE_TEST);
	head.sequence_no=network_dword(querylink_sequence);

	if(send(m_hSocket,(const char*)&head,packet_len,0)<0)
		if(send(m_hSocket,(const char*)&head,packet_len,0)<0)
		{
			PRINTOUT("FAILED: send packet failed."); 
			return -0xff;
		}
	Sleep(100);	
	if(!bResp)	return 1;

	//receive
	DWORD dRevLen;
	UINT starttime=time(NULL);
	while(1)// GetMessage(&msg, NULL, 0, 0) ) 
	{
		ioctlsocket(m_hSocket,FIONREAD,&dRevLen);
	    if(dRevLen>=sizeof(MESSAGE_HEAD))
		{
			memset(&head,0,sizeof(MESSAGE_HEAD));
			dRevLen=fReceive((BYTE*)&head,sizeof(MAX_CMPP_COM_BUF));
			if(querylink_sequence==head.sequence_no && head.command_id==CMPP_ACTIVE_TEST_REP)
			{
				//if(head.command_status==E_SUCCESS)
				{
					m_bAlive=TRUE; PRINTOUT("Alivet test +OK.");
					return 1;
				}
				//else
				{
					//m_bAlive=FALSE;
					//PRINTOUT("FAILED: Alive test.");
					//return -5;
				}			
			}
		}
		Sleep(100);
		if(bEventMainOver) {break;}
		if(time(NULL)-starttime>MAX_CMPP_ALIVETESTTIME)    //5--10s		
		{
			PRINTOUT("FAILED: Alive test receive timeout");
			//fDisconnect();
			return -4;		
		}
	}
	return m_bAlive;
}
/*******************************************************************************
return 
     -1:host or port is unexpect
	 -2:create  error
	 -3:connect failed
	  1:success connect
/*******************************************************************************/
int CCmppSock::fConnect(char *host, unsigned int port)
{
	int ret=1;   
	if( (!host)||(port<1) )
	{  
		//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);	
	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)
	{
		//PRINTOUT("FAILED: connect failed!"); 
		int nErrorCode_=WSAGetLastError();
		//ShowTcpErr(nErrorCode_);
		//out("Error:connect()\n");
		return(-3);
	}
	m_smscInfo.uPort=port;    strcpy(m_smscInfo.SMSCIP,host);	
	//PRINTOUT("connect +OK."); 
  /* set socket to non-blocking */
  u_long temp=1;
  if (ioctlsocket(m_hSocket,FIONBIO,&temp) == SOCKET_ERROR)
  {
	return WSAGetLastError();
//	perror("Notice:ioctlsocket(non-block)\n");
  }
	/* 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)
	 {
	    return WSAGetLastError();
	 }

	 //keepalive = yes
	 int bkeep=true;
	 if(setsockopt(m_hSocket, SOL_SOCKET,SO_KEEPALIVE,(char *)&bkeep, sizeof(int)) == SOCKET_ERROR)
	 {
	  return WSAGetLastError();
	 }

	
	m_bConnected=TRUE;

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

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

	nLen=sizeof(MESSAGE_HEAD);
	struct MESSAGE_HEAD *phead=(struct MESSAGE_HEAD *)lpBuf;
	//if(Receive(lpBuf,nLen)!=nLen)
	if(recv(m_hSocket,(char*)lpBuf,nLen,0)!=nLen)
	{
		//fGetSockErr(degTemp); PRINTOUT(degTemp) ;
		PRINTOUT("FAILED: Receive -FAILED"); 
		return -1;
	}
	network_head(phead);
	lpBuf+=nLen;	
	nLen=phead->command_length-sizeof(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); PRINTOUT(degTemp) ;
			PRINTOUT("FAILED: Receive -FAILED"); 
			return -1;
		}	
	}
	return nLen+sizeof(MESSAGE_HEAD);
}

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




int CCmppSock::fReadAndAtuoAnswer()
{
	if(!m_bConnected) {PRINTOUT("FAILED: have not connected."); return 0;}
	if(!m_bAlive){PRINTOUT("FAILED: have not login."); return 0;}
	BYTE buffer[MAX_CMPP_COM_BUF];
	struct MESSAGE_HEAD *phead=(struct MESSAGE_HEAD *)buffer;
	BYTE* p=buffer+sizeof(struct MESSAGE_HEAD);

	int dRevLen;
	UINT starttime=time(NULL);
	while(1)// GetMessage(&msg, NULL, 0, 0) ) 
	{
		ioctlsocket(m_hSocket,FIONREAD,(unsigned long*)&dRevLen);
		if(dRevLen<sizeof(MESSAGE_HEAD))break;

	    if(dRevLen>=sizeof(MESSAGE_HEAD))
		{
			memset(buffer,0,MAX_CMPP_COM_BUF);
			dRevLen=fReceive(buffer,sizeof(MAX_CMPP_COM_BUF));
			if(phead->command_id==CMPP_ACTIVE_TEST)
			{
				phead->command_id=network_dword(CMPP_ACTIVE_TEST_REP);
				phead->sequence_no=network_dword(phead->sequence_no);
				phead->command_length=network_dword(sizeof(MESSAGE_HEAD)+1); 
				buffer[sizeof(MESSAGE_HEAD)]=0;		//status
				send(m_hSocket,(const char*)buffer,sizeof(MESSAGE_HEAD)+1,0);
			}
			else if(phead->command_id==CMPP_SUBMIT_REP)// && send_sequence==phead->sequence_no)
			{
				PRINTOUT("Submit_rep\r\n");
				return -2; 
			}
		}
	}	
	return -4;
}

void CCmppSock::Check()
{
	fReadAndAtuoAnswer();
}

⌨️ 快捷键说明

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