📄 udptrsmtfile.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 + -