📄 nokiasock.cpp
字号:
// 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 + -