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

📄 ylfcmppsock.cpp

📁 移动
💻 CPP
字号:
// ylfCmppSock.cpp: implementation of the ylfCmppSock class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "ylfCmppSock.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif



/////////////////////////////////////////////////////////////////////////////
ylfCmppSock::ylfCmppSock()
{
	nReceiveError=0;

	nextAliveTstTime=CTime::GetCurrentTime()+CTimeSpan(0,0,0,NEXTALIVETSTTIME);
	m_bConnected=m_bAlive=FALSE;

	m_hSocket=INVALID_SOCKET;
}
int ylfCmppSock::CreateSocket()
{
	m_hSocket=socket(AF_INET,SOCK_STREAM,0);
	if(m_hSocket==INVALID_SOCKET)
	{
		TRACE("FAILED:socket create failed.....");
		//nErrorCode_=WSAGetLastError();
		return 0;
	}
	SOCKADDR_IN  sockaddr;
	memset(&sockaddr,0,sizeof(sockaddr));
	sockaddr.sin_family=AF_INET;
	sockaddr.sin_addr.s_addr=htonl(INADDR_ANY);
	sockaddr.sin_port=htons(0);
	if(bind(m_hSocket,(LPSOCKADDR)&sockaddr,sizeof(sockaddr)) == SOCKET_ERROR)
	{
		closesocket(m_hSocket);
		TRACE("FAILED:socket bind failed,close socket.....");
		//int nErrorCode_=WSAGetLastError();
		m_hSocket=INVALID_SOCKET;
		return 0;
	}
	return 1;
}

ylfCmppSock::~ylfCmppSock()
{	
	fDisconnect();
}
/////////////////////////////////////////////////////////////////////////////
// ylfCmppSock member functions
/**************************************************************************************
return 
0 : already have login
-1: usrname is null
-2: no socket connected
-4: receive response timeout
-5: login be rejected
>0: success
**************************************************************************************/
int ylfCmppSock::fLogin(char* SmsIP,int port,char* systemid,char *usrname, char *passwd)
{

	if(m_bAlive)     {TRACE("已登录."); return 0;}
	if(!m_bConnected){TRACE("FAILED:socket连接尚未建立."); return -2;}
	if(!usrname)     {TRACE("FAILED:用户名为空.") ; return -1;}	

	if(strlen(SmsIP)>16
		||strlen(systemid)>16
		||strlen(usrname)>16
		||strlen(passwd)>16) 
	{
		return -1;
	}

	TRACE("Logining.....");

	BYTE buffer[MAX_SEND_BUF];
	memset(buffer,0,MAX_SEND_BUF);

	BYTE *p=buffer;

	int len=100;
	*((int*)p)=len;					p+=4;	//total length
	*((int*)p)=COMMAND_LOGIN;				p+=4;	//command
	strcpy((char*)p,SmsIP);	p+=20;	//SmsIP
	*((int*)p)=port;				p+=4;	//port
	strcpy((char*)p,systemid);		p+=20;	//systemid
	strcpy((char*)p,usrname);		p+=20;	//usrname
	strcpy((char*)p,passwd);		p+=20;	//passwd

	if(Send(buffer,len)==SOCKET_ERROR)
	{
		TRACE("FAILED:Login ,send packet failed.Disconnect..."); 
		fDisconnect();
		return -0xff;
	}
	
	//receive resp	
	int dRevLen;
	UINT starttime=time(NULL);	
	//MSG msg;
	while(1) 
	{
		len=12;
		ioctlsocket(m_hSocket,FIONREAD,(unsigned long *)&dRevLen);
	    if(dRevLen>=len)
		{
			memset(buffer,0,len);
			dRevLen=fReceive(buffer,len);
			p=buffer+4;
			if(dRevLen==len && *((int*)p)==COMMAND_LOGIN)
			{
				p+=4;
				if(*((int*)p)==0)
				{
					m_bAlive=TRUE; TRACE("Login +OK.");
					nReceiveError=0;
					nextAliveTstTime=CTime::GetCurrentTime()+CTimeSpan(0,0,0,NEXTALIVETSTTIME);

					return 1;
				}
				else
				{
					int status=*((int*)p);
					if(status==1)
					{
						TRACE("FAILED: Login fail from user and password error");
					}
					else
					{
						TRACE("FAILED: Login fail from connect sms");
					}
					return -status;
				}
			}
		}
		Sleep(100);
//		if(WaitForSingleObject(m_hEventMainOver,0)==WAIT_OBJECT_0) {break;}
		if(time(NULL)-starttime>30)    //MAX_LOGINTIME 5--10s  
		{
			TRACE("FAILED:LOGIN receive timeout");	
			fDisconnect();
			return -4;		
		}
	}	
	return -4;
}
/*****************************************************************************************
return 
0 : no login or socket connect
-1: destadd or sendmsg is null
-2: sendmsg error
-3: sendpack error
-4: receive response timeout
-5: 
-6: sendsm resperror
1: success

0xff  : no send sm alarm
*****************************************************************************************/
int ylfCmppSock::fSendSM(const char* destaddr,const char* sendmsg)
{
	if(strlen(destaddr)>16||strlen(sendmsg)>140) 
	{
		return -1;
	}
	if(!m_bConnected)
	{
		return 0xFF;
	}
	if(!m_bAlive)
	{
		return -2;
	}
	if(destaddr[0]==0 || sendmsg[0]==0 )  
	{
		TRACE("FAILED: Submit , destadd or sendmsg is NULL") ;	
		return -1;
	}

	BYTE buffer[MAX_SEND_BUF];
	BYTE* p=buffer;

	int len=28+strlen(sendmsg);

	memset(buffer,0,MAX_SEND_BUF);
	*((int*)p)=len;					p+=4;	//total length
	*((int*)p)=COMMAND_SUBMIT;		p+=4;	//command
	strcpy((char*)p,destaddr);		p+=20;	//destaddr
	strcpy((char*)p,sendmsg);				//sendmsg
	if(Send(buffer,len)==SOCKET_ERROR)
	{
		TRACE("FAILED: Send Short Message ,send packet failed.disconnect...\r\n"); 
		//fDisconnect();
		return -0xff;
	}
	nextAliveTstTime=CTime::GetCurrentTime()+CTimeSpan(0,0,0,NEXTALIVETSTTIME);
	return 1;
}


/*********************************************************************************/
int ylfCmppSock::fAliveTst()
{
	if(CTime::GetCurrentTime()<nextAliveTstTime)return 1;

	nextAliveTstTime=CTime::GetCurrentTime()+CTimeSpan(0,0,0,NEXTALIVETSTTIME);
	if(!m_bConnected)
	{
		return 0xFF;
	}
	if(!m_bAlive)
	{
		return -2;
	}
	BYTE buffer[MAX_SEND_BUF];
	BYTE* p=buffer;

	int len=12;

	memset(buffer,0,MAX_SEND_BUF);
	*((int*)p)=len;					p+=4;	//total length
	*((int*)p)=COMMAND_ALIVE_TEST;	p+=4;	//command
	*((int*)p)=0;	p+=4;	//status
	if(Send(buffer,len)==SOCKET_ERROR)
	{
		TRACE("FAILED: Send Short Message ,send packet failed.disconnect...\r\n"); 
		//fDisconnect();
		return -0xff;
	}
	//receive resp	
	int dRevLen;
	UINT starttime=time(NULL);	

	Sleep(100);
	//MSG msg;
	while(1) 
	{
		len=12;
		ioctlsocket(m_hSocket,FIONREAD,(unsigned long *)&dRevLen);
	    if(dRevLen>=len)
		{
			memset(buffer,0,len);
			dRevLen=fReceive(buffer,len);
			p=buffer+4;
			if(dRevLen==len && *((int*)p)==COMMAND_ALIVE_TEST)
			{
				p+=4;
				int status=*((int*)p);
				if(status==0)
				{
					nReceiveError=0;
					return 1;
				}
				else
				{
					return -status;
				}
			}
		}
		Sleep(100);
//		if(WaitForSingleObject(m_hEventMainOver,0)==WAIT_OBJECT_0) {break;}
		if(time(NULL)-starttime>30)    //MAX_LOGINTIME 5--10s  
		{
			TRACE("FAILED:LOGIN receive timeout");	
			fDisconnect();
			return -4;		
		}
	}	
	return -4;
}
/*******************************************************************************
return 
     -1:host or port is unexpect
	 -2:create  error
	 -3:connect failed
	  1:success connect
/*******************************************************************************/
int ylfCmppSock::fConnect(char *host, unsigned int port)
{
	int ret=1;   
	if( (!host)||(port<1) )
	{  
		TRACE("FAILED: host or port is unexpect.");    
		return -1;
	}
	if(m_bConnected)	
	{
		fDisconnect();	Sleep(1000);		
	}
	if(m_hSocket==INVALID_SOCKET)
	{
		if(CreateSocket()==0) return -2;
	}

	m_bConnected=m_bAlive=FALSE;


	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)
	{
		TRACE("FAILED: connect failed!"); 
		int nErrorCode_=WSAGetLastError();
		//ShowTcpErr(nErrorCode_);
		//out("Error:connect()\n");
		return(-3);
	}
	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 ylfCmppSock::fDisconnect()
{	
	if(m_bConnected) 
	{
		closesocket(m_hSocket);
		m_hSocket=INVALID_SOCKET;
		m_bConnected=FALSE;	
		m_bAlive=FALSE;
		TRACE("FAILED: socket连接已断开. ");
	}
	return 1;
}

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

	if(Receive(lpBuf,nLen)!=nLen)
	{
		//fGetSockErr(degTemp); TRACE(degTemp) ;
		TRACE("FAILED: Receive -FAILED"); 
		return -1;
	}

	nLen=*((int*)lpBuf)-8;
	lpBuf+=8;	

	if(nLen>1000)	
	{
		//fGetSockErr(degTemp); TRACE(degTemp) ;
		TRACE("FAILED: Receive -FAILED"); 
		nLen=0;		//added for assert
		return -1;
	}
	if(nLen>0)
	{
		//if(Receive(lpBuf,nLen)!=nLen)
		if(Receive(lpBuf,nLen)!=nLen)
		{
			//fGetSockErr(degTemp); TRACE(degTemp) ;
			TRACE("FAILED: Receive -FAILED"); 
			return -1;
		}	
	}
	return nLen+8;
}



void ylfCmppSock::ReadAllMsg()
{
}

int ylfCmppSock::Receive(unsigned char *lpBuf, int nBufLen)
{
	unsigned char * buf;
	int byRet,ErrCode;
	int TempLen;			//every frame 2048 bytes
	int Num=0;
	TempLen=nBufLen;
	buf=lpBuf;

	while((byRet=recv (m_hSocket,(char *)buf,TempLen,0))!=TempLen)
	{
		if(byRet<0)
		{
			ErrCode=WSAGetLastError();
			if(ErrCode!= WSAEWOULDBLOCK)//block err closeconnect
			{
				return(-1);
			}
			else	//if no data not return byRet=0,return an err WSAEWOULDBLOCK
			{		//本来应正常退出,但在MPU关电时也返回WSAEWOULDBLOC,新开电无法正常连接,才调用退出
				nReceiveError++;
				if(nReceiveError>100)
				{
					return(-1);
				}
				return(0);
			}
		}
		else if(byRet==0)
		{
			return(0);
		}
		else
		{
			Num+=byRet;				
			buf+= byRet;
			TempLen=nBufLen-Num;
			if(TempLen<=0)return nBufLen;
		}
 	}
	nReceiveError=0;
	return nBufLen;
}

int ylfCmppSock::Send(unsigned char *pBuffer, int cLength)
{
  int cBytes,ErrCode;
  int TempLen;			//every frame 2048 bytes
  int TotalSize=cLength;
  int Num=0,SendNum=0;
  BOOL bBeginSend=FALSE;
  unsigned char *buf;
  buf=pBuffer;

  TempLen=cLength;
  while ((cBytes=send(m_hSocket,(char *)buf,TempLen,0))!=cLength)
  {
	 if(cBytes<0)
	 {
		ErrCode=WSAGetLastError();
		if(ErrCode!= WSAEWOULDBLOCK)
		{
			return(-1);
		}
		else
		{
			if(bBeginSend)
			{
				SendNum++;	//blocke err closeconnect
				if(SendNum>2000)
				{
					return(-1);
				}
				Sleep(5);
			}
			else
			{
				SendNum++;	//block err closeconnect
				if(SendNum>2000)
				{
					return(-1);
				}
				Sleep(5);
			}
		}
	}
	else
	{
		bBeginSend=TRUE;
		if(cBytes==cLength)
			return(TotalSize);
		Num+=cBytes;
		if(Num>TotalSize)	//lose frames
		{
			return(-1);
		}
		buf+= cBytes;
		cLength-= cBytes;
		if(cLength<MAX_SEND_BUF)
			TempLen=cLength;
	}
  }
	return(TotalSize);
}

⌨️ 快捷键说明

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