📄 ylfcmppsock.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 + -