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

📄 udptrsmtfile.h

📁 进行UDP的有效传输
💻 H
字号:
/*-----------------------------------UDPTrsmtFile.h--------------------------------------
 * 文件名:			UDPTrsmtFile.h
 * 作者:			黑客天使 - 4/12/2004
 * 最后修改日期:	6/12/2004
 * 实现功能:		用UDP协议实现点对点文件传输,采用滑动窗口机制,使文件传输可靠,正确。
					该类包含服务器端和客户端,使用该类前,应调用方法SetRunType,指定是该
					类是作为服务端运行还是客户端运行。
				
					接着调用SetFile指定要传输的文件或接收后要写入的文件
					如果是客户端,则还应该调用SetFileSize设置文件总大小

					凋用InitSocket初始化UDP套接字,
					调用SetSendSockAddr设置要接收方的IP和PORT
 					
 * CopyRight(C)		hackangel work-room
**------------------------------------------------------------------------------------*/

#pragma once
#pragma pack(1)

#include <winsock2.h>
#include "..\HICQ_Server\hsocket.h"
#include <queue>
using namespace std;

#define TransmitFile_Port	8889
#define Server_Send_Port	8889
#define Client_Recv_Port	8889
#define Client_Send_Port	8887
#define Server_Recv_Port	8887

#define File_End			 -1

#define MAXBUF_SIZE 1024 * 10
enum { Recv_Window_Size = 1, Send_Window_Size = 5, Sliding_Window_Size = 8 };
enum FLAGS { Flag_Ack, Flag_FileSize, Flag_ReSend, Flag_Sended_File_Size };

typedef struct st_SendBuf
{
	int index;
	DWORD dwLen;
	char buf[MAXBUF_SIZE];
}SendBuf, *LPSendBuf;

typedef struct st_RecvBuf
{
	FLAGS flag;
	union
	{
		int index;
		DWORD dwFileSize;
	};
}RecvBuf, *LPRecvBuf;

class CUDPTrsmtFile  
{
public:
	CUDPTrsmtFile();
	CUDPTrsmtFile(SOCKET sendsocket);
	CUDPTrsmtFile(CHsocket& hsendsocket);
	~CUDPTrsmtFile();

// attributes
protected:
	CHsocket m_hsocket;									// UDP套接字

	int		 m_nSendIndexHead;							// 发送窗口前沿
	int		 m_nSendIndexTail;							// 发送窗口后沿
	int		 m_nAckCount;								// 接收端确认过的数据包数

	int      m_nRecvIndex;								// 接收窗口前沿
	bool	 m_bServer;									// 值为true时该类作为服务器,值为false时该类作为客户端运行

	DWORD	 m_dwFileSize;								// 文件总大小
	DWORD	 m_dwSend;									// 已接收文件大小

	HANDLE	 m_hFile;
	HANDLE	 m_hEvent;									// 用于线程间的同步
	HANDLE	 m_hSendThread;								// 发送线程句柄
	HANDLE	 m_hRecvThread;								// 接收线程句柄

	CRITICAL_SECTION m_csIndex;							// 用于发送线程与接收线程间m_nSendIndexHead和m_nSendIndexTail的互斥
	CRITICAL_SECTION m_csQueue;							// 用于m_bufqueue的互斥

	queue<LPSendBuf> m_bufqueue;						// 保存发送的数据包,以备重发
	queue<LPSendBuf> m_bufLookaside;					// 保存已确认过的数据包的内存空间,以备再用。

// operation
protected:
	static DWORD CALLBACK SendThread(LPVOID lParam);	// 接收线程函数
	static DWORD CALLBACK RecvThread(LPVOID lParam);	// 发送线程函数
	
	bool		ServerSend(void);						// 线程内函数,用于服务器端的发包函数
	bool		ServerRecv(void);						// 线程内函数,用于服务器端的收包函数
	bool		ClientSend(void);						// 线程内函数,用于客户器端的发包函数
	bool		ClientRecv(void);						// 线程内函数,用于客户器端的收包函数
	bool		s_SendHoleMsg(void);					// 线程内函数,用于服务器端发送打洞消息
	bool		s_RecvHoleSuccessMsg(void);				// 线程内函数,用于服务器端接收打洞成功消息
	bool		c_RecvHole_SendHoleSuccessMsg(void);	// 线程内函数,用于客户端接收打洞消息、发送打洞成功消息,发送已接收文件大小

	LPSendBuf	GetBufFromLookaside(void);				// 得到已确认过的数据包的内存空间,若队列为空,则新配置一个结点

public:
	void		CreateSocket(unsigned int nPort);		// 初始化一UDP套接字
	void		SetSendSockAddr(const char* pszIP, unsigned int nPort);	// 设置要发送的目的地地址
	void		SetSocket(CHsocket& hsocket);			// 设置UDP套接字
	CHsocket&	GetSocket();							// 得到UDP套接字的引用

	void		SetRunType(bool bServer = true);		// 设置该类运用于服务器端或客户端
	bool		GetRunType(void) const;					// 得到运用类别
	void		SetFile(HANDLE hFile);					// 设置文件句柄
	void		SetFile(LPCTSTR lpszFileName);			// 设置文件路径
	void		SetFileSize(DWORD dwFileSize);			// 设置文件大小

	void		BeginTransmitting(void);				// 开始文件传输
	void		StopTransmitting(void);					// 停止文件传输
};

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -