欢迎来到天天文库
浏览记录
ID:9886670
大小:1014.51 KB
页数:26页
时间:2018-05-12
《visual_c++网络编程技术-03》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、文件传输授课教师:网络编程——导入在电子教室软件系统中,教师经常需要通过教师机向所有学生下发文件,传递授课资料,有时也需要学生将完成的作业上传到教师机,这就涉及到一个文件传输的问题,本章我们就通过一个简单的文件传输程序。本章要点文件传输功能分析设计文件操作编程技术多线程编程技术文件下发程序实现功能需求分析包含两个程序,一个发送端程序,一个接收端程序。发送端程序可以由用户选择要发送的文件。发送端程序可以指定发送对象,可以是一个IP范围,也可以是某个IP地址。接收端程序可以由用户指定接收到的文件的存放地址。界面设计关键技术分析文件传输的本质用
2、一句话概括就是:发送方将文件数据读出来,然后调用套接字的发送函数将数据传输到接收方,接收方调用套接字接收函数接收数据,然后重新建立文件并将数据写入文件。文件传输流程发送文件功能的实现接收文件功能的实现流程代码详解——文件操作CFile类:CFile类是MFC文件类的基类,提供非缓冲方式的二进制磁盘输入、输出功能;并直接通过派生类来支持文本文件和内存文件。提供访问本地文件内容的功能,不支持访问网络文件的功能。使用CFile操作文件的基本过程是:定义CFile对象—〉打开要操作的文件—〉对文件/写文件—〉关闭文件文件操作——Open()函数该
3、函数的功能是打开指定文件。BOOLCFile::Open(LPCTSTRlpszFileName,UINTnOpenFlags,CFileException*pException)参数lpszFileName:带完整路径的文件名,指定要打开的文件。参数nOpenFlags:指定文件打开方式,可以是多个标志的组合。文件操作——Read()函数该函数的功能是从文件中读取文件内容。virtualUINTCFile::Read(void*lpBuf,UINTnCount);参数lpBuf:存放读出的文件内容的空间地址。参数nCount:从文件读出
4、的最大字节数。文件操作——Write()函数该函数的功能是向文件中写数据virtualvoidWrite(constvoid*lpBuf,UINTnCount);参数lpBuf:存储要写入文件的数据的空间地址。参数nCount:要写入文件的数据的字节数。文件操作——Close()函数功能是关闭文件句柄。文件操作完毕必须调用Close()函数关闭文件。第一步程序扩展——实现较大文件的传输上面文件传输实例的功能并不强大,但是它的实现过程很简单,说明了文件传输的原理。它忽略了真实文件的大小——在上面的代码中,为了从文件中读取数据,首先获得文件长
5、度,然后开辟一段和文件长度匹配的内存作为文件缓冲。但现在很多文件动辄几百兆字节,往往无法一次开辟如此大的内存容纳如此多的数据。所以对于大文件传输,这段代码显然不合适。解决方法:分段缓冲文件数据。实现方法详见代码第二步程序扩展——同时向多个目标传输文件教师机通常需要控制整个教室所有的学生机,需要进行一对多的文件传输需要用户在界面上指出需要发送文件的对象(例如学生机的IP地址范围)考虑传输效率,需要采用多线程技术。什么是多线程技术?多线程是为了同步完成多项任务多线程不是为了提高运行效率,而是为了通过提高资源使用效率来提高系统的效率。线程是一组
6、指令的集合,或者是程序的特殊段,它可以在程序里独立执行,也可以把它理解为代码运行的上下文。线程负责在单个程序里执行多任务。通常由操作系统负责多个线程的调度和执行。实现发送文件功能的主线程流程多线程实现代码在本程序中,多线程编程涉及三处代码,第一处是创建一个新线程,使用CreateThread函数:CreateThread(NULL,0,SendFileThread,(LPVOID)pMeg,NULL,NULL);函数CreateThread是微软在WindowsAPI中提供的,可用于建立新线程。CreateThread将在主线程的基础上创
7、建一个新线程。多线程实现代码第二处是定义线程函数:ULONGWINAPISendFileThread(LPVOIDp);SendFileThread是线程的名字,可根据需要自行定义应该定义在对应的头文件中,且一定要定义为全局的。多线程实现代码第三处是线程函数的实现:ULONGWINAPISendFileThread(LPVOIDp){//此处写实现线程具体功能的代码}线程的参数传递考虑到在创建每个新线程时,需要将待发送文件的地址和发送对象的IP地址传递给新线程,因此需要传递两个字符串参数给线程,按照创建线程函数的定义,只能传递一个指向结构
8、的指针,因此需要定义一个结构体,专门存放需要传递给线程的数据。结构体定义如下:typedefstruct{charip[15];//文件传递目的地IPcharfileAddr[50];//带路
此文档下载收益归作者所有