《计算机网络系统实践》课程设计报告-多线程网络文件传输_第1页
《计算机网络系统实践》课程设计报告-多线程网络文件传输_第2页
《计算机网络系统实践》课程设计报告-多线程网络文件传输_第3页
《计算机网络系统实践》课程设计报告-多线程网络文件传输_第4页
《计算机网络系统实践》课程设计报告-多线程网络文件传输_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

30/30《计算机网络系统实践》报告设计题目设计题目:多线程网络文件传输学生姓名:学号:专业班级:计算机科学与技术20XX年1月设计要求实现单线程文件传输实现多线程文件传输增加异常控制,增强程序的鲁棒性了解使用winsocket编程了解文件传输过程开发环境与工具工具Visualstudio20XXQT5C++系统win8.18g内存cpui73632qm设计原理利用QT设计简单的图形界面利用winsocket编程TCP方式实现网络通信(阻塞方式)利用windows线程函数和临界区实现多线程控制四、系统功能描述及软件模块划分客户端:有简单的GUI,可以选择存储路径,服务端IP,通信端口PORT,多线程或单线程,向服务端发起下载请求,并开始下载服务端:有简单的GUI,可以选择显示文件路径,选择通信端口PORT,选择多线程或单线程,一旦开启,进入阻塞状态,知道客户端连入,开始传输文件五、设计步骤//客户端单线程接收函数voidClient::getready(){ WORDsocketVersion=MAKEWORD(2,0); if(WSAStartup(socketVersion,&wsaData)!=0) { QMessageBox::warning(this,tr("Warning"), tr("Initsocketdllerror!"),QMessageBox::Yes); exit(1); } //创建socket SOCKETc_Socket=socket(AF_INET,SOCK_STREAM,0); if(SOCKET_ERROR==c_Socket) { QMessageBox::warning(this,tr("Warning"), tr("CreateSocketError!"),QMessageBox::Yes); exit(1); } //指定服务端的地址 sockaddr_inserver_addr; boolok; u_shortus_port=port.toUShort(&ok,10); char*cip; QByteArrayQBA=ip.toLatin1(); cip=QBA.data(); server_addr.sin_family=AF_INET; server_addr.sin_addr.S_un.S_addr=inet_addr(cip); server_addr.sin_port=htons(us_port); if(SOCKET_ERROR==::connect(c_Socket,(SOCKADDR*)&server_addr,sizeof(server_addr))) { QMessageBox::warning(this,tr("Warning"), tr("CanNotConnectToServerIP!"),QMessageBox::Yes); exit(1); } charbuffer[BUFFER_SIZE]; memset(buffer,0,BUFFER_SIZE); char*cpath; QByteArrayQBAp=path.toLatin1(); cpath=QBAp.data(); FILE*fp=fopen(cpath,"wb");//windows下是"wb",表示打开一个只写的二进制文件 if(NULL==fp) { QMessageBox::warning(this,tr("Warning"), tr("FileCanNotOpenToWrite"),QMessageBox::Yes); exit(1); } else { memset(buffer,0,BUFFER_SIZE);//初始化缓冲区 intlength=0;//开始接收文件 while((length=recv(c_Socket,buffer,BUFFER_SIZE,0))>0) { if(fwrite(buffer,sizeof(char),length,fp)<length) { QMessageBox::warning(this,tr("Warning"), tr("FileWriteFailed!"),QMessageBox::Yes); break; } memset(buffer,0,BUFFER_SIZE); } lalbelMSS->setText("Transformpleted"); } fclose(fp); closesocket(c_Socket); lalbelMSS->setText("Transformpleted"); //释放winsock库 WSACleanup();}//server端线程函数1,主要用于多线程传输时分块发送文件DWORDWINAPIServer::GetFileProc1(LPVOIDlparam){ Server*p=(Server*)lparam; sockaddr_inserver_addr1;//设置默认地址信息并初始化socket server_addr1.sin_family=AF_INET; server_addr1.sin_addr.s_addr=INADDR_ANY; server_addr1.sin_port=htons(5679); SOCKETm1_Socket=socket(AF_INET,SOCK_STREAM,0); sockaddr_inclient_addr1; bind(m1_Socket,(sockaddr*)&server_addr1,sizeof(server_addr1)); listen(m1_Socket,5); intclient_addr_len1=sizeof(client_addr1); SOCKETm1_New_Socket=accept(m1_Socket,(sockaddr*)&client_addr1,&client_addr_len1);//此处阻塞 charbuffer1[BUFFER_SIZE]; memset(buffer1,0,BUFFER_SIZE); EnterCriticalSection(&cs);//设置临界区 char*cpath; QByteArrayQBAp=p->path.toLatin1(); cpath=QBAp.data(); intFileLen_t=p->FileLen;//获得主线程通信时获得的文件长度 intSeek=0; FILE*fp=fopen(cpath,"rb");//windows下是"rb",表示打开一个只du的二进制文件 LeaveCriticalSection(&cs); if(NULL==fp) { exit(1); } else { memset(buffer1,0,BUFFER_SIZE); intlength=0; while(FileLen_t>0){ EnterCriticalSection(&cs); int length=fread(buffer1,sizeof(char),BUFFER_SIZE,fp); LeaveCriticalSection(&cs); if(FileLen_t>length) { send(m1_New_Socket,buffer1,length,0); } else { send(m1_New_Socket,buffer1,FileLen_t,0); } Sleep(100); memset(buffer1,0,BUFFER_SIZE); FileLen_t=FileLen_t-length; } } closesocket(m1_New_Socket); closesocket(m1_Socket); fclose(fp); }六、关键问题及其解决方法多线程传输文件时,不可以多个socket使用一个端口来发送,否则会出现错误,需要每个线程都创建自己的socket连接来保证文件的顺序。Windows创建线程函数Createthread中的线程函数在类中(使用QT写界面,主类是一个继承了QT的类)要声明为静态函数,要获得类中的变量,需要传递类指针,并用Server*p=(Server*)lparam;重新作为类指针。使用临界区来保护共享变量,防止各线程同时访问写入时出错。利用fseek定位各线程数据块在文件中的位置。七、设计结果 用TCP协议的文件传输系统,有简单的图形界面,可以选择文件和存贮文件路径,在传输文件时可以选择多线程还是单线程传输,如果传输过程出错,可以跟据出错的步骤,弹出不同的提示对话框,但由于文件传输时基于阻塞方式的,如果服务端开启后没有客户端连接会陷入阻塞。思考题:我编写的程序是基于阻塞的,缺点是若客户端没有被连接则会陷入未响应这个程序目前传送前的通信内容只有文件长度,可以加入文件名称等内容来增强用户体验。已经实现了多线程的文件传输。八、软件使用说明服务端点击chooseyourfile按钮选择要传输的文件,文件路径会显示在下方,载PORT出输入用处通信的端口号,点击confirm按钮确认,点击threads进行多线程发送货点击listen进行单线程发送;客户端点击chooseyourfile选择存储路径和文件名称,在IP和PORT输入主机的IP地址和用于通信的端口号,点击confirm确认内容,点击threads进行多线程接收或accept进行单线程接收。九、参考资料QT5官方帮助文档网络上一些介绍winsocket通信的文章一些API相关说明十、验收时间及验收情况1月3日星期天樊玉琦老师验收老师提出了网卡是串行传输数据的,多线程怎么加快文件传输速度的问题,由于这方面网络上资料比较少,我个人认为,发送数据数先读在发,可能多线程是利用了读的时间,别的线程发送,发送时,别的线程在读,这样分时的方式加快文件传送速度的。十一、设计体会这次课程设计,我花了一个多星期来学习相关内容,很多东西都是我本来不会的,比如QT,windowsC++多线程,线程函数在类中如何控制等,在完成了这个比较完整的课程设计后,但是由于网上资料较少,我暂时还没有学会将VS20XX中的带QT库的文件生成可执行文件,所以只能上交项目文件…这次实验让我比较深刻的体会了winsocket网络通信的原理,也让我发现了影响网络传输速度的程序方面的因素,比如发送缓冲区的大小,线程数等。计算机网络是很复杂的,各种因素和各种协议,传输方式都影响着网络通信的质量,在网络渗透在生活的各个方面的今天,对于一个学习计算机的人来说,掌握好网络方面的知识更加的重要。

路由器配置实验实验目的1.认识路由器的端口、型号2.掌握路由器的路由配置3.理解网络互联的基本原理实验环境与设备本实验在PC机上利用模拟软件PacketTracerV6进行操作。实验内容1.路由器接口的配置 2.静态路由配置3.默认路由配置4.动态路由配置本次实验的主要任务是了解路由器的基本设置,和网络之间的连接关系。通过这次的实验很好的掌握了各个网段之间的,各个路由器下的pc的连接情况。通过对静态,默认,动态路由配置,使得各个路由器下的PC相互通信。四、实验步骤1.路由器接口的配置创建如图所示的拓扑结构图。(1)为主机PC0,PC1,PC2配置IP地址、子网掩码和默认网关为路由器的各个接口分配IP地址和子网掩码,交换机不用配置。(3)查看路由器的路由表使用命令:showiproute显示路由表中的路由信息。保存此时路由器显示的路由信息,以便与后面的实验结果进行比较。(4)测试主机之间的连通性2.配置静态路由(1)在Router0中添加一条到网络192.168.3.0的静态路由,命令如下:Router(config)#iproute192.168.3.0255.255.255.0172.16.1.1(2)再去查看Router0路由表,与步骤中2的路由表进行对比,观察路由表变化情况。(3)在Router2中添加一条到网络192.168.1.0的路由后,路由表如下:Router(config)#iproute192.168.1.0255.255.255.0172.16.1.2(4)测试PC0与PC2的连通性(5)在Router1和Router2中各添加一条静态路由,以实现PC1与PC2的互通。(6)测试PC0与PC1的连通性(7)请分别在Router0和Router1中添加静态路由,以实现PC0与PC1的互通。请在实验报告中记录你所使用的配置命令、主机间的连通性测试结果以及Router0和Router1的路由表(以截图形式)。3.设置默认路由(1)首先删除Router0中到达PC1和PC2所在网络的静态路由,参考在Router0中添加一条默认路由再测试PC0与PC1,PC2的连通性。4.动态路由协议RIP配置(1)查看三个路由器的路由表信息,可看到此时路由表中只有直连路由C。在Router0上配置RIP协议在Router1,Router2上配置RIP协议的命令同上。查看三个路由器的路由表,可看到各路由器学到的网段。测试各主机间的连通性五.实验心得通过使用CiscoPacket

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论