- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
基于select IO模型的远程目录浏览与多线程文件下载
基于select I/O模型的远程目录浏览与多线程文件下载
2008年04月08日 星期二 18:43
摘要:??? 服务器端基于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很重要, 它涉及到确保线程创建一定正确的问题, 在后面“要注意的几点问题”中会更详细的讨论。
3 目录树类CExtnTreeCtrl::CTreeCtrl该类继承于CTreeCtrl类, 主要扩展获得树的某个项目在整棵树的完整路径, 以便把这个路径规格化后能向服务器请求文件。在这里还实现了将一个完整路径转为文件名的函数。对于如何构造这棵树, 有一个很方便高效的办法:双击树,把双击的项作为根.如果为盘符或文件夹, 就发送请求给服务器, 待服务器返回, 自动填充在这个项下。如果为文件, 则该项名有扩展名, 将请求下载。这个办法操作起来方便, 而且还提高了系统性能, 至少在局域网是这样。如果就一次从服务器中请求整个文件系统的目录内容, 肯定会慢很多。
4.参数设置对话框类 CSetParam这个类用于设置下载的线程数目, 和默认的保存文件夹路径。这个类会写一个“Setting.ini”文件在C盘以保存参数。具体来说,如果用户一直都没有设置这些参数的话, 那么GetPrivateProfileString(...)试图读取C:\Setting.ini文件会返回默认的线程数0, 和一个不是表示路径的字条串“defaultpath”, 这时, 下载程序会自动设置参数, 分别为3, “C:\”。
二 几个要注意的问题1 MFC与Windows API就多线程编写网络程序而言, 如果使用MFC的CAsyncSocket或CSocket, 主线程给子线程传参量是一个非常头痛的问题, 如果用Windows API实现就灵活多了。在文件操作方面, CFile还不错。尽管如此, 我还是用了Windows API函数, 为了设计满足要求。
2 socket传送字符串或字符串数组理论上, send是底层函数, 只要指定缓冲区首地址指针和缓冲区大小, 不管什么狗屎垃圾它都会帮你把这片内存的内容send 出去。然而, 如果是字符串数组甚至字符串, 或者包含这两者其中之一的封包, 内容是被 send 走了, 接收端缓冲区也显示接收到了, 不过不是你想要的内容, 再看字符串(数组)还是空空然。山重水复, 得找出路才有柳暗花明。 转转思维, 用另一种做法吧。在Windows中, 文件名是不能含有 |,,,%.... 等特殊字符的.由于恰好要传的内容为目录字符串数组, 所以把字条串数组转为字符数组, 每个字符串用一个特殊字符隔开就OK了。
3. 确保连续创建线程正确
您可能关注的文档
最近下载
- 中级商务汉语第五课 了解行情.ppt VIP
- 签约工作室及签约主播协议5篇.docx VIP
- 停车场规划设计规则 .doc VIP
- 2026四川甘孜州新龙县招聘新龙县国资公司总经理及副总经理2笔试备考试题(浓缩300题)附答案.docx VIP
- 基于SpringBoot+Vue的校园服务平台的设计与实现-论文.doc VIP
- T CRHA 034—2024 成人体外膜肺氧合(ECMO)护理规范.pdf VIP
- 城市轨道交通车辆电气组装与布线工艺全套教学课件.pptx
- 新疆2022系列标准设计图集新22S3 室外排水工程.docx VIP
- 2022初级实务第六章(晋级群 ).docx VIP
- 钢结构施工主要施工方案及施工技术措施.doc VIP
原创力文档


文档评论(0)