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

📄 entity_base.h

📁 短信网管的原代码。用于与sp通信
💻 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 + -