基于select I/O模型的远程目录浏览与多线程文件下载

http://tech.ddvip.com   2007年03月17日    社区交流

本文详细介绍基于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很重要, 它涉及到确保线程创建一定正确的问题, 在后面“要注意的几点问题”中会更详细的讨论。

作者:李建成    责编:豆豆技术应用

正在加载评论...