基于select I/O模型的远程目录浏览与多线程文件下载
2007-03-17 22:00:56 来源:WEB开发网核心提示:本文示例源代码或素材下载 摘要:服务器端基于select I/O模型,为防止程序界面阻塞, 有一个子线程用于不断接收socket并select其中的处理,基于select I/O模型的远程目录浏览与多线程文件下载,客户端只有一个线程函数, 不过其利用率很高, 可用于远程目录交换, 请求文件大小, 创建若干线程来
本文示例源代码或素材下载
摘要:
服务器端基于select I/O模型。为防止程序界面阻塞, 有一个子线程用于不断接收socket并select其中的处理。客户端只有一个线程函数, 不过其利用率很高, 可用于远程目录交换, 请求文件大小, 创建若干线程来下载文件。文件传输有上传和下载,还有对等传输, 这个项目中, 传输文件具体指下载。
正文:
一 数据及数据结构
1 传送包, 客户端主线程给子线程传递的结构体
typedef struct{
char packetType; // 请求类型 r:request rootdriver d:directory f:file D::data
unsigned int length; //用于传送int类型
char content[2000]; //传送的内容
}DATA_PACKET;
请求类型:'r':服务器逻辑盘符, d; 盘符和文件夹下的文件夹和文件名, f':文件大小, D:文件内容。
在客户端请求下载文件, length末两位用于记录下载的线程总数, 前面的用于记录当前的线程序号。在服务器端这个反运算很容易实现。
在请求文件大小和请求下载时, content都用于保存请求文件的绝对路径.这个在服务器端做反运算要用自定义函数处理。
2 全局变量(用于线程间的通信)
char* pDrives; // 数据缓冲
CString arrFiles[200]; //文件目录字符串数组
CString savePath; //文件保存路径
long fSize=0l, ,recvFSize=0l; //文件大小,已经接收的文件大小
CString strIP; //IP
bool thrFlag=false; //下载线程创建置位
理论上讲, 在程序中应尽量避免使用全局变量,因为破坏程序结构, 君不见Java和C#完全面向类。但为了方便, 所以就用了全局变量, 且是应用程序级的, 这样线程间的通讯很方便。值得一提的是, 这里thrFlag很重要, 它涉及到确保线程创建一定正确的问题, 在后面“要注意的几点问题”中会更详细的讨论。
- ››基于IP地址的vsftp服务器
- ››基于MySQL 水平分区的优化示例
- ››基于CentOS5的Linux下pptp和openvpn的搭建及配置
- ››基于JavaScript的网页版塔防游戏
- ››基于Android平台 QQ大战360手机游戏爆红
- ››基于Windows Azure的云计算应用设计
- ››基于AES算法实现对数据的加密
- ››基于SoPC目标板Flash编程设计的创建及应用
- ››基于SolidWarks齿轮机构的运动分析与仿真
- ››基于Windwos Server 2008故障转移群
- ››基于JavaScript的REST客户端框架
- ››基于JavaScript和CSS的Web图表框架横向对比
更多精彩
赞助商链接