最近一直在研究基于WINSOCK的文件传输,文件传输时会出现各种各样的情况处理起来其实也挺麻烦的这里不一一说明,大家看代码吧,这是最新版 飞秋 http://www.freeeim.com/ 的代码,这个是飞秋文件传输模拟实现代码,完整代码可以网上搜索获取。
#ifndef _XEIM_SEND_FILE_LOGIC
#define _XEIM_SEND_FILE_LOGIC
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "afxmt.h" // CCritical section..
#include <winsock2.h>
#include "XEIM_SendFiles.h"
#include <map>
using namespace std;
// 飞秋文件发送接收缓冲大小
#define FILE_BUFFER_LENGTH 512
typedef struct _recvProcData{
SOCKET sock;
LPVOID logic;
} recvProcData;
// 飞秋文件收发流程
// 1. 用户发送一个文件,程序把文件信息发给接收人,等待接收人确认接收。
// 2. 用户收到一个文件,确认接收,AddRecvFile 建立接收线程,获取侦听的端口并返回。
// 3. 发送方收到接收方的确认接收后,根据对方提供的端口建立文件发送链接。
// 飞秋(FEIQ)整个程序的文件收发管理模块
class XEIM_SendFileLogic
{
private:
map<UINT, XEIM_SendFiles *> m_mapFiles; // 文件列表
UINT m_nFileCount; // 文件列表UID,用于 m_mapFiles;
inline void DeleteData(UINT nIndex);
XEIM_SendFiles * m_pFileInfo;
public:
// 删除列表里的一个文件
BOOL RemoveFileInfo(UINT nMapIndex);
BOOL m_bListen;
UINT m_nThreads; // 当前线程数
SOCKET m_sockListen; // 侦听线程
CCriticalSection m_csThread; // 线程同步器
CCriticalSection m_csFiles; // 文件列表同步器
XEIM_SendFileLogic();
~XEIM_SendFileLogic();
void CloseListenThread();
// 开始接收文件,启动侦听线程
UINT StartRecvFile();
// 开始发送文件
UINT StartSendFile(UINT nDestIndex, UINT nMapIndex);
UINT GetFileSize(LPCTSTR lpszFileName);
// 当前几个文件正在处理,不包括列表里其他未处理文件
UINT GetThreadCount();
// 获取文件列表长度
UINT GetFileCount();
// 获取发送文件信息
XEIM_SendFiles *GetSendFileInfo(UINT nMapIndex);
// 通过 map Index 获取文件信息
XEIM_SendFiles *GetFileInfoByMapIndex(UINT nMapIndex);
// 确认接收文件时用的,获取接收文件信息的MPA ID
UINT GetRecvFileInfoMapIndex(UINT nDestIndex, LPCTSTR lpszUID);
// 添加一个发送文件
UINT AddSendFile(UINT nFileSize, // 文件大小
LPCTSTR szFilePathName, // 文件路径
LPCTSTR szFileName, // 文件名
LPCTSTR szUID // 对方的 UID
);
// 添加一个接收文件
UINT AddRecvFile(UINT nFileSize, // 文件大小
UINT nDestIndex, // FILE DEST UID
LPCTSTR szFileName, // 文件名
LPCTSTR szUID // 对方的 UID
);
// 飞秋侦听线程
static DWORD CALLBACK ListenThreadProc(LPVOID lParam);
static DWORD CALLBACK SendThreadProc(LPVOID lParam); // 文件接收
static DWORD CALLBACK RecvThreadProc(LPVOID lParam); // 文件发送
};
#endif // _XEIM_SEND_FILE_LOGIC
飞秋_常用正则表达式集锦 - 镇定 - CSDN博客
【飞秋】OpenExpressApp对建模支持的初步计划 - 镇定 - CSDN博客
飞秋跨网段通讯方法_FreeEIM