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

📄 nokiasock.cpp

📁 移动
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// NokiaSock.cpp : implementation file
#include "stdafx.h"
#include "NokiaSock.h"

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

int    gCount=0;
BYTE   CNokiaSock::m_sendBuf[MAX_SENDBUF];     //记录上次发送的缓冲	
struct tagSMSCInfo CNokiaSock::m_smscInfo;
/////////////////////////////////////////////////////////////////////////////
CNokiaSock::CNokiaSock()
{
	m_iErrCount=0;	m_msgNum=1;	
	m_bAlive=m_bConnected=FALSE;
	strcpy(degTemp,"\0");
	m_hExit=CreateEvent(NULL,TRUE,FALSE,"exit");  //nosignle
	m_hTB  =CreateEvent(NULL,TRUE,TRUE,"同步");  //signle
	memset(m_sendBuf,0,MAX_SENDBUF);
	memset(&m_smscInfo,0,sizeof(struct tagSMSCInfo));	
	InitializeCriticalSection(&m_csLock); 
	m_hSocket=INVALID_SOCKET;
}

CNokiaSock::~CNokiaSock()
{
	m_msgNum=1;	
	m_bAlive=m_bConnected=FALSE;
	strcpy(degTemp,"\0");
	if(m_hTB)    CloseHandle(m_hTB);
	if(m_hExit)  CloseHandle(m_hExit);
	DeleteCriticalSection(&m_csLock);
}


// Do not edit the following lines, which are needed by ClassWizard.
#if 0
BEGIN_MESSAGE_MAP(CNokiaSock, CSocket)
	//{{AFX_MSG_MAP(CNokiaSock)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()
#endif	// 0

/////////////////////////////////////////////////////////////////////////////
// CNokiaSock 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 CNokiaSock::fLogin(char *usrname, char *passwd)
{
	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("Logining.....") ;

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

	if(m_bAlive)     {iRet= 0; PRINTOUT("Login -FAILED already have login."); goto end;}
	if(!m_bConnected){iRet=-2; PRINTOUT("Login -FAILED socket连接没有建立."); goto end;}
	if(!usrname)     {iRet=-1; PRINTOUT("Login -FAILED user name is null.") ; goto end;}	
	else
	{strcpy(m_smscInfo.usrName,usrname); if(passwd!="")strcpy(m_smscInfo.passWd,passwd); else strcpy(m_smscInfo.passWd,"\0");}		

	//send
	memset(lpBuf,0,MAX_SENDBUF);
	memcpy(lpBuf,"\00201:000\t010:",12);   lpBuf+=12;	
	memcpy(lpBuf,usrname,strlen(usrname)); lpBuf+=strlen(usrname);
	memcpy(lpBuf,"\t011:",5);              lpBuf+=5;	
	memcpy(lpBuf,passwd,strlen(passwd));   lpBuf+=strlen(passwd);
	memcpy(lpBuf,"\t\003",2);              lpBuf+=2;
	
	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) ;	
	    if(WaitForSingleObject(m_hExit,0)==WAIT_OBJECT_0)
		{ iRet=0xff;goto end;}
		PRINTOUT("Login -FAILED send packet failed.retrying..."); 
		if(fConnect(m_smscInfo.SMSCIP,m_smscInfo.uPort)<1)		
		{  iRet=-0xff; goto end;}		 		
//		if(Send(lsendBuf, nBufLen)==SOCKET_ERROR)
		if(send(m_hSocket,(const char*)lsendBuf,nBufLen,0)==SOCKET_ERROR)
		{  iRet=-0xff; goto end;}		 
		PRINTOUT("retry  +OK."); 
	}

	//receive resp
	#if 1
	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(lpBuf,0,MAX_RECVBUF);
			int offset=fReceive(lpBuf,dRevLen,lmsgType,lpackNum);
			if(offset>-1) lpBuf=lpBuf+offset-1;
			if( (lmsgType==51)&&(lpackNum==((m_msgNum+256)-2)%256) )
				break;			
//			if(lmsgType==99) continue;
		}
		Sleep(100);
		if(WaitForSingleObject(m_hExit,0)==WAIT_OBJECT_0) break; 
		//CString str;str.Format("%d",timeout);PRINTOUT(str);
		if(timeout++>MAX_LOGINTIME_NOKIA)      
		{iRet=-4; PRINTOUT("LOGIN -FAILED receive timeout");	goto end;	}
	}	
	lpBuf+=1;
	if(!(lpBuf[7]==3||lpBuf[9]==3))
	{	lpBuf+=7;           fShowSmeErr(lpBuf);		iRet=-5;PRINTOUT("Login -FAILED.");	}
	else
	{	iRet=1; 	}		
    #endif
	
end:
	SetEvent(m_hTB);
	if(iRet>0) {m_bAlive=TRUE; PRINTOUT("Login +OK.") ;}
	return iRet;
}
/*****************************************************************************************
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
>0: success

0xff  : no send sm alarm
*****************************************************************************************/
int CNokiaSock::fSendSM(char *destadd, char *srcadd, char *sendmsg,bool bResp)
{
	int    iRet=-111,iResult=1,nBufLen=0;
	BYTE   lsendBuf[MAX_SENDBUF];
	BYTE*  lpBuf=lsendBuf;
	char   lsend[MAX_MSGLEN_NOKIA];

	BYTE   recvBuf[MAX_RECVBUF];
	DWORD  dRevLen=0;	
	int    timeout=0;
	if((!destadd)||(!sendmsg) )  {iRet=-1; PRINTOUT("Submit -FAILED destadd or sendmsg is NULL") ;	goto end;}
	else     
	{if(!srcadd) strcpy(m_smscInfo.srcAdd,srcadd); else strcpy(m_smscInfo.srcAdd,"0000");}
	 //strcpy(m_smscInfo.sendMsg,sendmsg); }
	sprintf(degTemp,"MSISDN:%s  Submit message %d.....",destadd,++gCount);   	PRINTOUT(degTemp) ;

//	if(fWaitforSend(MAX_SUBTIME_NOKIA)!=TRUE)
//	{  PRINTOUT("Submit -FAILED: wait failed"); iRet=-4; goto end;}
	//send
	memset(lpBuf,0,MAX_SENDBUF);
	memcpy(lpBuf,"\00203:000\t021:",12);	  	    lpBuf+=12;	
	memcpy(lpBuf,destadd,strlen(destadd));          lpBuf+=strlen(destadd);
	memcpy(lpBuf,"\t023:",5);                       lpBuf+=5;
	memcpy(lpBuf,srcadd,strlen(srcadd));            lpBuf+=strlen(srcadd);
	
	nBufLen=strlen(sendmsg);      
	memset(lsend,0,MAX_MSGLEN_NOKIA);   strcpy(lsend,sendmsg);
	iResult=fCodeMsg((BYTE*)lsend,nBufLen);
	if(iResult==8)
	{
		if(strlen(lsend)>MAX_MSGLEN_NOKIA)   
		{PRINTOUT("Submit -FAILED sendmsg too long");iRet=-2; goto end;}
		memcpy(lpBuf,"\t030:8\t034:",11);            lpBuf+=11;
	}
	if(iResult==-1)
	{  PRINTOUT("Submit -FAILED character error");   iRet=-2; goto end;}
	if(iResult==0)
	{    memcpy(lpBuf,"\t033:",5);                   lpBuf+=5;	}
	memcpy(lpBuf,lsend,nBufLen);                     lpBuf+=nBufLen;	
	
	memcpy(lpBuf,"\t050:167\t058:0\t\003",16);       lpBuf+=16;	

	nBufLen=lpBuf-lsendBuf;			
	fPacknum(lsendBuf+4);    
	memset(m_sendBuf,0,MAX_SENDBUF);
	memcpy(m_sendBuf,lsendBuf,nBufLen);
/*	if(Send(lsendBuf, nBufLen)==SOCKET_ERROR)
	{
		fGetSockErr(degTemp);   	PRINTOUT(degTemp) ;		
//		if(WaitForSingleObject(m_hExit,0)==WAIT_OBJECT_0)
//		{ iRet=0xff;goto end;}
		PRINTOUT("Submit-FAILED:send packet failed.retrying...."); 
		if(fConnect(m_smscInfo.SMSCIP,m_smscInfo.uPort)<1)		
		{  iRet=0xff; goto end;}
		SetEvent(m_hTB);
		if(fLogin(m_smscInfo.usrName,m_smscInfo.passWd)<1)
		{  iRet=0xff; goto end;}		 
		ResetEvent(m_hTB);
		if(Send(lsendBuf, nBufLen)==SOCKET_ERROR)
		{  iRet=-3; goto end;}		 
		PRINTOUT("retry  +OK."); 
	}
*/
	if(send(m_hSocket,(const char*)lsendBuf,nBufLen,0)==SOCKET_ERROR)
	{
		if(send(m_hSocket,(const char*)lsendBuf,nBufLen,0)==SOCKET_ERROR)//重发
		{
			PRINTOUT("FAILED: Send Short Message ,send packet failed.disconnect..."); 
			fDisconnect();
			return 0xff;
		}
	}

	//Receive
	//if(!bResp)        { iRet=1; goto end;}
	lpBuf=recvBuf;  memset(recvBuf,0,MAX_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,dRevLen,lmsgType,lpackNum);
			if(offset>-1)  lpBuf=lpBuf+offset-1;
			if( (lmsgType==53)&&(lpackNum==((m_msgNum+256)-2)%256) )
				break;
			if(lmsgType==99)  {iRet=1; goto end;}
			break;
		}
		if(WaitForSingleObject(m_hExit,0)==WAIT_OBJECT_0)  break; 
		Sleep(10);
		if(timeout++>MAX_SUBTIME_NOKIA)      
		{iRet=-4; PRINTOUT("Submit -FAILED recv resp timeout");	goto end;	}
	}

	//PROC
	lpBuf+=6;	
	{
	BYTE* lpTemp=(BYTE*)memchr(lpBuf,9,MAX_RECVBUF-7);
	while( (lpTemp!=NULL) && (lpTemp[3]!=3) )
	{
		lpTemp+=1;
		char cTemp[4]="\0\0\0";  memcpy(cTemp,lpTemp,3);
		switch(int(atoi(cTemp)))
		{
		case 21:
			{
			char destadd[MAX_ADD]="\0";
			int  addlen=(BYTE*)memchr(lpTemp+4,9,MAX_ADD)-(lpTemp+4);
			memcpy(destadd,lpTemp+4,addlen);
			}
			break;
		case 60:
			iRet=1;
			break;
		case 901:
			iRet=-6;
			break;
		case 900:
			iRet=-6;
			fShowSmeErr(lpTemp);	
			{PRINTOUT("Submit -FAILED.") ;     }
			break;
		}			
		lpTemp=(BYTE*)memchr(lpTemp,9,MAX_RECVBUF-7);
	}
	}
end:
	SetEvent(m_hTB);
	if(iRet==1)	        {PRINTOUT("Submit +OK.") ;  m_iErrCount=0;}
	else                {PRINTOUT("Submit -FAILED.") ; }
	if(iRet<0)
	{
		sprintf(degTemp,"Submit -FAILED. Error count %d",++m_iErrCount);
		PRINTOUT(degTemp) ;
		if(	m_iErrCount>MAX_ERRCOUNT)       
		{
			m_iErrCount=0;
			iRet=0xff;
			//iRet=0xffff;				
			fLogout();
			PRINTOUT("发送错误次数据过多,已断开连接");	  //此处应报警?????????????????
		}
//		m_bConnected=0;
	}
//	g_log.LogtoFile("\r\n");
	return iRet;
}


/*******************************************************************************
return 
0 : no login or socket connect
-1: send buf failed
-4: receive response timeout
-5: login be rejected
>0: success
*******************************************************************************/
int CNokiaSock::fLogout()
{
	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("Logouting.....") ;
//	if(fWaitforSend(MAX_LOGOUTTIME_NOKIA)!=TRUE)
//	{  PRINTOUT("logout -FAILED: wait failed"); iRet=-4; goto end;}
	if( (!m_bAlive) ) {iRet=0;PRINTOUT("logout -FAILED no login."); goto end;}

	//send
	memset(lpBuf,0,MAX_SENDBUF);
	memcpy(lpBuf,"\00202: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("logout -FAILED:send packet failed!"); 
		iRet=-1; goto end;
	}	

	//receive
    #if 1
	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>-1)  lpBuf=lpBuf+offset-1;

⌨️ 快捷键说明

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