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

📄 iocppacket.h

📁 iocp vc例子,自己是学DELPHI
💻 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 + -