📄 entity_base.h
字号:
#ifndef _BASE_ENTITY_H
#define _BASE_ENTITY_H
#include "common.h"
//#include "ServerSocket.h"
#define SERVER_SOCKET TRUE
extern int iRecvSock;
enum TCP_STATUS
{
E_UNCONNECTED = 0x00,
E_CONNECTED = 0x01
};
enum FAILURE_CAUSE
{
E_SEND_SUCCESS = 0x00,
E_TCP_FAILURE = 0x01,
E_MSGLEN_ERROR = 0x02,
E_TCPWR_ERROR = 0x03
};
#define MSG_HEAD_LENGTH 4
DWORD WINAPI MainTcpThread(LPVOID lpParam);
class TcpSock
{
public:
TcpSock() {};
~TcpSock()
{
TerminateThread(m_MainHandle,0);
//CloseHandle(m_MainHandle);
};
BOOL InitServerSocket(int nBindPort)
{
sockaddr_in SockAddr;
m_hMainSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (m_hMainSocket == INVALID_SOCKET)
{
//m_ErrorNo=INVALID_SOCKET;
return FALSE;
}
SockAddr.sin_addr.s_addr = htonl(INADDR_ANY);
SockAddr.sin_family=AF_INET;
SockAddr.sin_port=htons(nBindPort);
if(SOCKET_ERROR==bind(m_hMainSocket,(sockaddr*)&SockAddr,sizeof(SockAddr)))
return FALSE;
if(SOCKET_ERROR==listen(m_hMainSocket,SOMAXCONN))
return FALSE;
//DWORD dwThreadId;
//m_MainHandle = CreateThread(NULL, 0, MainTcpThread, this, 0, &dwThreadId);
//if(m_MainHandle == NULL)
// return FALSE;
return TRUE;
}
BOOL InitClientSocket(char* pServerIp,int lnPort)
{
strcpy(m_Ip,pServerIp);
nPort = lnPort;
m_Status = E_UNCONNECTED;
//创建主线程
DWORD dwThreadId;
m_MainHandle = CreateThread(NULL, 0, MainTcpThread, this, 0, &dwThreadId);
if(m_MainHandle == NULL)
return FALSE;
return TRUE;
};
BOOL Init(char* pServerIp,int lnPort, BOOL bType=TRUE)
{
//m_bAlreadyReset = FALSE;
m_bType = bType;
if(bType == SERVER_SOCKET)
return InitServerSocket(lnPort);
else
return InitClientSocket(pServerIp,lnPort);
};
BOOL ConnectToHost()
{
//m_bAlreadyReset = FALSE;
if(m_hSocket != -1)
Reset();
m_hSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (m_hSocket == INVALID_SOCKET)
return FALSE;
sockaddr_in SockAddr;
SockAddr.sin_addr.s_addr = inet_addr(m_Ip);
SockAddr.sin_family=AF_INET;
SockAddr.sin_port=htons(nPort);
if(connect(m_hSocket,(sockaddr*)&SockAddr,sizeof(SockAddr))==SOCKET_ERROR)
{ return FALSE; }
m_Status = E_CONNECTED;
return TRUE;
};
int ReceiveMsg(char szBuf[],UINT BufLen)
{
int nret,nleft,index;
ZeroMemory(szBuf, BufLen);
nret = recv(m_hSocket, szBuf, MSG_HEAD_LENGTH, 0);
if (nret != MSG_HEAD_LENGTH)
{
LogInf("pSocket->ReceiveMsg return 111111 \r\n");
return SOCKET_ERROR;
}
#ifdef NET_charS_SEQ
nleft=ntohl(*(DWORD*)szBuf)-MSG_HEAD_LENGTH;
#else
nleft=*(DWORD*)szBuf-MSG_HEAD_LENGTH;
#endif
if(nleft>1024)
{
LogInf("pSocket->ReceiveMsg return 222222 \r\n");
return SOCKET_ERROR;
}
index=MSG_HEAD_LENGTH;
while(nleft>0)
{
nret = recv(m_hSocket,&szBuf[index],nleft,0);
if (nret == SOCKET_ERROR)
return SOCKET_ERROR;
index+=nret;
nleft-=nret;
}
return( nret );
};
_UC Api_SendMsg(char Buff[],int BufLen,bool isRecv) //发送消息函数
{
if(m_Status == E_UNCONNECTED) return E_TCP_FAILURE;
if(BufLen>1024) return E_MSGLEN_ERROR;
int ret,nLeft,idx;
nLeft = BufLen;
idx = 0;
while(nLeft > 0)
{
ret = send(m_hSocket, &Buff[idx], nLeft, 0);
if( (ret == 0)||(ret== SOCKET_ERROR))
return E_TCPWR_ERROR;
nLeft -= ret;
idx += ret;
}
return E_SEND_SUCCESS;
};
void Reset()
{
//f(m_bAlreadyReset == TRUE) return ;
if(m_hSocket == -1) return ;
shutdown(m_hSocket,SD_BOTH);
closesocket(m_hSocket);
m_hSocket = -1;
m_Status = E_UNCONNECTED;
//m_bAlreadyReset = TRUE;
};
virtual void OnTcpDisConnected(){};
virtual void OnTcpConnected(){};
virtual BOOL OnTcpDataInd(char Buff[],int BufLen){return TRUE;};
public:
HANDLE m_MainHandle;
char m_Status;
SOCKET m_hSocket;
SOCKET m_hMainSocket;
BOOL m_bType;
//OOL m_bAlreadyReset;
char m_Ip[40];
int nPort;
};
//仅仅实现一个接口
class TBase_Entity:public TcpSock
{
public:
TBase_Entity(){};
~TBase_Entity()
{
TerminateThread(m_MainHandle,0);
//CloseHandle(m_MainHandle);
};
//初始化
BOOL Init(char* pServerIp,int nPort, BOOL bType=TRUE)
{
m_TcpConnected = FALSE;
m_LlcConnected = FALSE;
iSendLinkTestCount = 0;
iRcvLinkTestCount = 0;
if(FALSE == TcpSock::Init(pServerIp,nPort,bType))
{
LogErrPara("TCP entity to server [%s] create failure!\r\n",pServerIp);
return FALSE;
}
return TRUE;
};
//与TCP接口--上行
void OnTcpConnected() //TCP连接建立
{
m_TcpConnected = TRUE;
m_LlcConnected = FALSE;
m_bLinkStatusChanged = true;
};
void OnTcpDisConnected() //TCP连接中断
{
m_TcpConnected = FALSE;
m_LlcConnected = FALSE;
iSendLinkTestCount = 0;
iRcvLinkTestCount = 0;
m_bLinkStatusChanged = true;
};
bool LinkStatusChanged()
{
return(m_bLinkStatusChanged);
};
void ResetLinkStatus()
{
m_bLinkStatusChanged = false;
};
//与TCP接口--下行
void RstTcp() //复位TCP连接
{
Reset();
};
int SendToTcp(char *cBuff, int iLen,bool isRecv=false) //发送消息到TCP
{
LogMsg(cBuff);
if(E_SEND_SUCCESS != Api_SendMsg(cBuff, iLen,isRecv))
{
LogErr("Data send error!\r\n");
RstTcp();
return FALSE;
}
return TRUE;
};
//本地协议处理
virtual BOOL OnTcpDataInd(char Buff[],int BufLen) = 0; //收到TCP消息
virtual int Login() = 0 ; //登陆服务器
virtual int Logout()= 0 ; //退出服务器
virtual BOOL SendLinkTest() = 0; //每30S发送一次
public:
BOOL m_TcpConnected;
BOOL m_LlcConnected;
bool m_bLinkStatusChanged;
int iSendLinkTestCount;
int iRcvLinkTestCount;
T_MSG_QUE<128, 1024> MsgQue;
};
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -