WEB开发网
开发学院软件开发VC 基于select I/O模型的远程目录浏览与多线程文件下... 阅读

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

1 2 3 4 5 6  下一页

Tags:基于 select 模型

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接