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

📄 nokiasock.cpp

📁 移动
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			if( (lmsgType==52)&&(lpackNum==((m_msgNum+256)-2)%256) )
				break;			
		}
		if(WaitForSingleObject(m_hExit,0)==WAIT_OBJECT_0)  break; 
		if(timeout++>MAX_LOGOUTTIME_NOKIA)      
		{iRet=-4; PRINTOUT("LOGOUT -FAILED receive timeout");	goto end;	}
	}
	lpBuf+=1;   	iRet=1;	
	if(!(lpBuf[7]==3||lpBuf[9]==3))
	{
		lpBuf+=7;		fShowSmeErr(lpBuf);
		iRet=-6;        PRINTOUT("Logout -FAILED");
	}	
    #endif
end:
	SetEvent(m_hTB);
	m_bAlive=FALSE;
	if(iRet==1)        {PRINTOUT("Logout +OK.") ;	}
	else if(iRet==-111){PRINTOUT("Logout -FAILED.") ;	}
	fDisconnect();
	return iRet;
}
/*********************************************************************************
return 

/*********************************************************************************/
int CNokiaSock::fAliveTst()
{
	int    iRet=-111,iResult=1,nBufLen=0;
	BYTE   lsendBuf[MAX_SENDBUF];
	BYTE*  lpBuf=lsendBuf;

	BYTE   recvBuf[MAX_RECVBUF];
	DWORD  dRevLen=0;	
	int    timeout=0;    

	PRINTOUT("Test Alive.....") ;
	if(WaitForSingleObject(m_hTB,0)!=WAIT_OBJECT_0)     
	{ iRet=1;goto end;}

//	if(fWaitforSend(MAX_SUBTIME_NOKIA)!=TRUE)
//	{  PRINTOUT("Test Alive -FAILED: wait failed"); iRet=-4; goto end;}

	if( !m_bConnected ){iRet=0;PRINTOUT("Alive Test -FAILED:没有建立socket连接."); goto end;}

	memcpy(lpBuf,"\00240:000\t\003",9);		lpBuf+=9;    
	fPacknum(lsendBuf+4);                	nBufLen=lpBuf-lsendBuf;
	memset(m_sendBuf,0,MAX_SENDBUF);
	memcpy(m_sendBuf,lsendBuf,nBufLen);
//	if(Send(lsendBuf, nBufLen)==SOCKET_ERROR)
	if(send(m_hSocket,(const char*)lsendBuf,nBufLen,0)==SOCKET_ERROR)
	{
		fGetSockErr(degTemp);		PRINTOUT(degTemp) ;	
		PRINTOUT("Alive Test -FAILED:send packet failed!"); 
		iRet=-1; goto end;
	}
		//receive
	lpBuf=recvBuf; 
	while(1)// (GetMessage(&msg, NULL, 0, 0)) 
	{
//		TranslateMessage(&msg);
//		DispatchMessage(&msg);
//		IOCtl(FIONREAD,&dRevLen); 
			ioctlsocket(m_hSocket,FIONREAD,&dRevLen);
	    if(dRevLen>=MIN_MSGLEN)
		{
			int lmsgType,lpackNum;
			lpBuf=recvBuf;  memset(recvBuf,0,MAX_RECVBUF);
			int offset=fReceive(lpBuf,MAX_RECVBUF,lmsgType,lpackNum);
			if(offset>0)  lpBuf=lpBuf+offset-1;
			if( (lmsgType==90)&&(lpackNum==((m_msgNum+256)-2)%256) )
				break;			
		}
		if(WaitForSingleObject(m_hExit,0)==WAIT_OBJECT_0)  break; 
		if(timeout++>10)      
		{iRet=-4; PRINTOUT("Alive Test -FAILED: receive timeout");	goto end;	}
	}
	
	iRet=1;  lpBuf+=1;
	if(!(lpBuf[7]==3||lpBuf[9]==3))
	{
		lpBuf+=7;	                            fShowSmeErr(lpBuf);	
		PRINTOUT("Alive test -FAILED: resp error");iRet=-6;
	}
end:
	SetEvent(m_hTB);
	if(iRet>0)
	{ m_bAlive=TRUE;PRINTOUT("Alive Test +OK.") ;}
	return iRet;
}






/*******************************************************************************
return 
     -1:host or port is unexpect
	 -2:create  error
	 -3:connect failed
	  1:success connect

/*******************************************************************************/
int CNokiaSock::fConnect(char *host, unsigned int port)
{
	int ret=1;   
	m_smscInfo.uPort=port;    strcpy(m_smscInfo.SMSCIP,host);	
	if( (!host)||(port<1) )
	{  PRINTOUT("host or port is unexpect");    ret=-1;   goto end;}
	sprintf(degTemp,"connecting to %s...",host);	PRINTOUT(degTemp);    
	if( (m_bConnected)||(m_bAlive) ){fLogout(); Sleep(1000);}	
	SetEvent(m_hTB);  //ResetEvent(m_hExit);
	m_msgNum=1;	
	if(m_hSocket==INVALID_SOCKET)
	{
		if(CreateSocket()==0) return -2;
	}
	else
	{
		closesocket(m_hSocket);
		if(CreateSocket()==0) return -2;
	}
//	if(!Create(0))
//	{	fGetSockErr(degTemp); PRINTOUT(degTemp); ret=-1;   goto end; 	}	
//	if(!Connect(host,port))
//	{   fGetSockErr(degTemp); PRINTOUT(degTemp); fClose();ret=-2; goto end;}	
//	PRINTOUT("connect +OK."); 
	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_bConnected=TRUE;
end:
	if(ret!=1) {PRINTOUT("connect -FAILED");}
	return ret;
}
/*******************************************************************************
return ;
/*******************************************************************************/
int CNokiaSock::fDisconnect()
{	
	if(m_bConnected) 
	{fClose();m_bConnected=FALSE;	
	 PRINTOUT("断开socket连接.");
	}
	return 1;
}

void CNokiaSock::fShowSmeErr(BYTE *lpBuf)
{
	PRINTOUT("fShowSmeErr");
	if(memcmp(lpBuf,"900",3)==0)
	{			
		char cTemp[4]="\0\0\0"; memcpy(cTemp,lpBuf+4,3);		
		fGetSMEErr(atoi(cTemp),degTemp);
		PRINTOUT(degTemp);
	}
	if(memcmp(lpBuf,"901",3)==0)
	{
	}
}

void CNokiaSock::fPacknum(void *pBuf)
{
	EnterCriticalSection(&m_csLock); 
	char cTemp[4];
	sprintf(cTemp,"%3d",m_msgNum);
	if(cTemp[0]==32)  cTemp[0]=48;
	if(cTemp[1]==32)  cTemp[1]=48;
    m_msgNum=(m_msgNum+2)%256;
	memcpy(pBuf,cTemp,3);  
	LeaveCriticalSection(&m_csLock); 
}

int CNokiaSock::fClose()
{
	m_bAlive=m_bConnected=FALSE;
//	ShutDown(both);
	closesocket(m_hSocket);    
	m_hSocket=INVALID_SOCKET;
	m_msgNum=1;	strcpy(degTemp,"\0");
	return 1;
}
int CNokiaSock::fSend(BYTE *sendBuf,int nBufLen) 
{	int iRet=0;	return iRet;  }

int CNokiaSock::fReceive(BYTE* lpBuf, int nBufLen, int& msgType,int& packNum) 
{
	int    iRet=0;
	DWORD  dRevLen=0,nLen=nBufLen;		
	char   cTemp[4]="\0\0\0"; 
	BYTE*  lpTemp=lpBuf;

	if(recv(m_hSocket,(char*)lpBuf,nBufLen,0)!=nLen)
	{
		//fGetSockErr(degTemp); PRINTOUT(degTemp) ;
		PRINTOUT("FAILED: Receive -FAILED"); 
		return -1;
	}
/*	if(nLen=Receive(lpBuf,nBufLen)==SOCKET_ERROR)
	{
		fGetSockErr(degTemp); PRINTOUT(degTemp) ;
		PRINTOUT("Receive -FAILED"); 
		iRet=msgType=-1;   	goto end;
	}
*/	while(*lpBuf++!=2){;}
	if(!lpBuf){iRet=msgType=-1;goto end;}
	memcpy(cTemp,((BYTE*)lpBuf),2);  	msgType=atoi(cTemp);
	memcpy(cTemp,((BYTE*)lpBuf)+3,3);	packNum=atoi(cTemp);
	switch(msgType)
	{
	case 99:                 //NACK MSG
		lpBuf+=3;
		memcpy(cTemp,lpBuf,3);
		m_msgNum=atoi(cTemp) %256;
		fPacknum(&m_sendBuf[4]);
		PRINTOUT("Received NACK msg,change packnum and resend before msg");
//		if(Send(m_sendBuf, MAX_SENDBUF)==SOCKET_ERROR)
		if(send(m_hSocket,(const char*)m_sendBuf,MAX_SENDBUF,0)==SOCKET_ERROR)
		{
			fGetSockErr(degTemp);		
			PRINTOUT(degTemp) ;	
			PRINTOUT("resend -FAILED");
		}
		break;
	case 98:                //GEN ERROR RESP
		PRINTOUT("Received General error response,show and ignore it");
		lpBuf+=7;         fShowSmeErr(lpBuf);
		break;
	case 90:                 //ALIVE RESP
	case 51:
	case 52:
	case 53:
		break;
	default:
		;
		//PRINTOUT("Received unhandle msg");
	}
	iRet=lpBuf-lpTemp;
end:
	return iRet;
}

int CNokiaSock::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_MSGLEN_NOKIA/2]; memset((BYTE*)wTemp,0,MAX_MSGLEN_NOKIA);		
		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;
}

BOOL CNokiaSock::fWaitforSend(int nType)
{
	int iRet=TRUE;
	int timeout=0;
	
	EnterCriticalSection(&m_csLock); 
	while(1)//( GetMessage(&msg, NULL, 0, 0) ) 
	{
		if(timeout++>nType)      
		{iRet=-3;       goto end;	}
//		TranslateMessage(&msg);
//		DispatchMessage(&msg);
		int wait=WaitForSingleObject(m_hTB,0);
		if(wait==WAIT_OBJECT_0)      break;

		if(timeout==1)	PRINTOUT("Waitting.....");
		if(wait==WAIT_TIMEOUT)       continue;
		else
		{ iRet=-1;      goto end;} 
		if(WaitForSingleObject(m_hExit,0)==WAIT_OBJECT_0) 
		{iRet=-2;       goto end;}

	}
	ResetEvent(m_hTB);
end:
	if(iRet!=TRUE)
	{   sprintf(degTemp,"Wait -FAILED %d type:%d",iRet,nType);PRINTOUT(degTemp);}
	LeaveCriticalSection(&m_csLock); 
	return iRet;
}

int CNokiaSock::CreateSocket()
{
	m_hSocket=socket(AF_INET,SOCK_STREAM,0);
	if(m_hSocket==INVALID_SOCKET)
	{
		PRINTOUT("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);
		PRINTOUT("FAILED:socket bind failed,close socket.....");
		//int nErrorCode_=WSAGetLastError();
		m_hSocket=INVALID_SOCKET;
		return 0;
	}
//	m_sequence=1;
	return 1;
}

⌨️ 快捷键说明

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