📄 iocppacket.h
字号:
// IocpPacket.h: interface for the CIocpPacket class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_IOCPPACKET_H__33A3DC03_80EC_4CE0_87B1_D6117D04C7B0__INCLUDED_)
#define AFX_IOCPPACKET_H__33A3DC03_80EC_4CE0_87B1_D6117D04C7B0__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#define MINPACKETLEN sizeof(int) //数据包最小字节数
#define PACKETTAG MAKEWORD(PACKET_LOTAG, PACKET_HITAG) //网络标识
enum PACKETTYPE
{
PACKETTYPE_NONE=0,
PACKETTYPE_WRITE,
PACKETTYPE_READ
};
//传输数据内容如下
//包头长度+包头数据+包数据+[文件数据]...
class AFX_EXT_CLASS CIocpPacket
{
public:
CIocpPacket();
virtual ~CIocpPacket();
private:
int m_nBufLen; //数据总长度
int m_nTranLen; //传输的长度,是(MAXBUFLEN-KEYLEN)的整数倍
int m_nHeaderLen; //包头长度
private:
int ComputeTranSize(int nBufLen); //计算传输的长度
public:
WORD m_wType; //类型
ULONG m_ulKey; //主键
BOOL m_bSyncSend; //是否同步命令标识
public:
void ResetPacket(); //清空数据
int Clone(CIocpPacket* pPacket); //克隆对象
int WriteData(const BYTE* szData, int nDataLen); //写入数据
int ReadData(BYTE* szData, int nDataLen, int nReadedLen=0); //读出数据
BOOL IsReady(); //判断数据包是否完整
BOOL IsOver(int nSize); //判断数据是否发完
BOOL IsPacketValid()
{return (!m_bHeaderSerialize || m_pkHeader.m_wTag==PACKETTAG);}; //判断是否有效的包
void InitSendData(); //初始化发送数据
private:
//包头信息
CIocpPacketHeader m_pkHeader;
CMemFileEx m_memHeader;
BOOL m_bHeaderSerialize; //发送表示序列化进m_memHeader,接收表示序列化进m_pkHeader
//包中的数据信息
CMemFileEx m_memPacket;
//文件操作控制
private:
BOOL m_bDeleteAfterSend; //发送后删除文件标识
int m_nFileIndex; //文件在数组中的序号
int m_nFileCurrentLength; //文件当前已读写的长度
CFile m_fReadWrite; //文件读写对象
CString m_strDefaultPath; //默认文件接收路径
public:
void SetDefaultPath(CString strDefaultPath)
{if (!strDefaultPath.IsEmpty()) m_strDefaultPath = strDefaultPath;}; //设置默认路径
int GetPacketFileCount() {return m_pkHeader.m_aFullName.GetSize();}; //获得文件个数
int AddPacketFile(CString strFullName) {return m_pkHeader.AddPacketFile(strFullName);} //添加传输文件
void ClosePacketFile()
{if (m_fReadWrite.m_hFile!=CFile::hFileNull)
m_fReadWrite.Close();}; //关闭文件句柄
BOOL GetPacketFile(int nIndex, CString& strFullName)
{return m_pkHeader.GetPacketFile(nIndex, strFullName);}; //接收端获取文件
void DeleteAllFile() //发送或接收数据后删除文件
{m_pkHeader.DeleteAllFile(m_wType, m_bDeleteAfterSend);};
void SetDeleteAfterSend(BOOL bDeleteAfterSend=TRUE) {m_bDeleteAfterSend = bDeleteAfterSend;}; //
public:
void SetPacketHeader(const CIocpPacketHeader& srcHeader, BOOL bWithFile=TRUE)
{
m_pkHeader = srcHeader;
if (!bWithFile)
{ m_pkHeader.m_aFullName.RemoveAll();
m_pkHeader.m_aFileName.RemoveAll();
m_pkHeader.m_aFileLength.RemoveAll(); };
};
CIocpPacketHeader& GetPacketHeader() {return m_pkHeader;};
CMemFileEx& GetPacketMem() {m_memPacket.SeekToBegin(); return m_memPacket;};
//传输进度控制
private:
int m_nDoneLength; //已发送或接收长度
int m_nLastInfoLength; //上次通知进度更新的长度
int m_nOneInfoLength; //通知进度更新的最小长度
public:
BOOL NeedInfoProgress(int& nTranLen, int& nDoneLen); //判断是否需要通知进度
};
#endif // !defined(AFX_IOCPPACKET_H__33A3DC03_80EC_4CE0_87B1_D6117D04C7B0__INCLUDED_)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -