Files
geomative/GeomativeStudio/h/NetWorkOper.h
T
coco df489d5640 a
2026-07-03 16:05:30 +08:00

176 lines
4.5 KiB
C++

// 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 <list>
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<HWND> m_listRealHwnd;
};
#endif // !defined(AFX_NETWORKOPER_H__8C009DCD_7958_4C3F_8A25_EF1668377DFD__INCLUDED_)