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