// NetWorkOper.h: interface for the CNetWorkOper class. // ////////////////////////////////////////////////////////////////////// #if !defined(AFX_NETWORKOPER_H__8C009DCD_7958_4C3F_8A25_EF1668377DFD__INCLUDED_) #define AFX_NETWORKOPER_H__8C009DCD_7958_4C3F_8A25_EF1668377DFD__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 #include "TcpClient.h" #include "cpp\socket\StdThread.h" #include using namespace std; #define MAX_SND_BUF 450 #define MAX_RCV_CTRLBUF 1500 typedef struct ST_SEND_DATA_INFO { BYTE ucDstType; UINT uiDevID; char* pData; WORD wDataLen; ST_SEND_DATA_INFO() { ucDstType = 0; uiDevID = 0; pData = 0; wDataLen = 0; } }STSendDataInfo; typedef struct ST_RESP_DATA_INFO { char* pData; //用于接收数据的缓存地址 int* pRecvLen; //实际接收数据的长度 int iMaxRcvLen; //缓存的最大长度 int iTimeout; //数据超时时间 ST_RESP_DATA_INFO() { pData = NULL; pRecvLen = NULL; iMaxRcvLen = 0; iTimeout = 0; } }STRespDataInfo; enum EN_NETWORK_OPER_TYPE { EN_NETWORK_SEND = 0, EN_NETWORK_RECV }; typedef struct ST_CTRL_CMD_INFO { BYTE ucDataType; //表示响应状态 char* pData; //数据缓冲区地址 int iDataLen; //数据长度 }STCtrlCmdInfo,*LPSTCTRLCMDINFO; typedef struct ST_PACKET_BASE { BYTE ucCmd; UINT32 uiDevID; BYTE ucDevType; }STPacketBase,*LPSTPACKETBASE; typedef struct ST_REQUEST_PACKET { ST_PACKET_BASE clsPacketBase; HWND hWnd; DWORD dwMsgID; int iMaxRecvLen; int iTimeout; char* pData; WORD wDataLen; ST_REQUEST_PACKET() { clsPacketBase.uiDevID = 0xFFFFFFFF; //接受设备ID clsPacketBase.ucDevType = EN_DEV_CLOUND; //接收方类型 iTimeout = 120000; iMaxRecvLen = MAX_RECV_MEASURE; dwMsgID = WM_NET_RESPONSE; } }STRequestPacket,*LPEQUESTPACKET; typedef struct ST_RESPONSE_PACKET { ST_PACKET_BASE clsPacketBase; const char* pData; WORD wDataLen; }STResponsePacket,*LPRESPONSEPACKET; // enum EN_NETWORK_OPER_RES // { // EN_NETWORK_OPER_SUCCESS = 0, // EN_NETWORK_OPER_LINE_BREAK, // EN_NETWORK_OPER_TIMEOUT, // EN_NETWORK_OPER_SOCKET_ERROR, // EN_NETWORK_OPER_FAILED // }; typedef void (* PNOTIFY_FUNC)(LPARAM, LPARAM, LPVOID); typedef void (* PNOTIFY_DEV_FUNC)(LPVOID, LPARAM, LPVOID); class CNetWorkOper : public ConsumerThread, public ProducerThread { public: CNetWorkOper(); virtual ~CNetWorkOper(); bool Initialize(); bool StartConnect(CString strDstIP, int iPort); bool StartWork(); bool TransferOper(BYTE ucCmd, STSendDataInfo* pSendCtrl, bool bIsNeedResp, STRespDataInfo* pRespInfo, PNOTIFY_FUNC pNotifyFunc = NULL, LPVOID lpParam=NULL); bool GetLinkStatus(){return m_tcpClient->GetConnectStatus();} bool SendCtrlMsgDirect(BYTE ucCmd, UINT32 uiDevID, BYTE ucDevType, const char* pData, WORD wDataLen); int RecvMsgDirect(char* pData, int* pRecvLen, int iMaxRecvLen, int iTimeout); void RegisterDevNotify(PNOTIFY_DEV_FUNC pNotfiy,LPVOID pWnd){m_pDevNotifyFunc = pNotfiy;m_pDevNotfiyParam = pWnd;} void SetSuspendForThread(bool bIsSuspend);/*{m_bIsSuspend = bIsSuspend;}*/ bool SendLoginMsgBrocast();//发送广播的登录消息 bool ProcPlcStatus(char* pData, int iLen);//其实这里使用回调函数效果会更好 void ClearNotfiyFuncInfo(); void PutRequestPacket(const STRequestPacket& clsRequestPacket); void RegeditRealMsgCall(HWND hWnd); void UnRegeditRealMsgCall(HWND hWnd); CRITICAL_SECTION* GetNetCriticalSection() { return &m_netCs; } protected: //清空此次发送相关的信息 void ClearSendInfo(); // void ClearNotfiyFuncInfo(); // static UINT StartProcFunc(LPVOID lParam); void ReleaseData(void* pData); void ConsumeDataFromQue(void * pData); virtual void ThreadFunction();// 获取实时消息 public: CTcpClient* m_tcpClient; protected: bool m_bIsRunning; CWinThread* m_pThread; CRITICAL_SECTION m_MutexSec; bool m_bIsTransfer; STSendDataInfo m_stSendCtrlInfo; STRespDataInfo m_stRespDataInfo; bool m_bIsNeedResp; bool m_bIsNeedSend; BYTE m_ucCmd; PNOTIFY_FUNC m_pNotifyFunc; PNOTIFY_DEV_FUNC m_pDevNotifyFunc; LPVOID m_pNotifyParam; char m_chSendBuf[MAX_SND_BUF]; char m_chRcvCtrlBuf[MAX_RCV_CTRLBUF]; LPVOID m_pDevNotfiyParam; bool m_bIsSuspend; bool m_bIsGetDevAddr; //是否获得 主机地址,用于WIFI直连 CRITICAL_SECTION m_netCs; CRITICAL_SECTION m_realHwndCs; list m_listRealHwnd; }; #endif // !defined(AFX_NETWORKOPER_H__8C009DCD_7958_4C3F_8A25_EF1668377DFD__INCLUDED_)