基于udp的文件传输实验报告

合集下载

基于UDP的文件传输实验报告

基于UDP的文件传输实验报告

基于UDP的文件传输实验报告实验报告成绩2015年6月8 日实验名称:基于UDP的文件传输1.实验目的(1)熟练掌握Socket编程;(2)分析UDP与TCP的异同。

2.实验设备和条件硬件环境:PC机操作系统:Windows 或者Linux语言环境:Visual C++ ,VS,GCC,Java均可3.实验要求参考TCP文件传输demo, 基于UDP实现send.mp3文件的传输,并测试接收到的文件与发送的文件是否一致。

请各位同学于第15周星期三或星期四上课时将纸质版(双面打印)上交!4.实验内容:测试数据与实验结果(可以抓图粘贴)(1)发送端代码。

#include"stdafx.h"#include<Winsock2.h>#include<stdio.h>#define MAX_LENGTH 1024int_tmain(int argc, _TCHAR* argv[]){WORD wVersionRequested;WSADATA wsaData;wVersionRequested = MAKEWORD(2, 2);if (WSAStartup(wVersionRequested, &wsaData) != 0)//初始化ws2_32.dll动态库{printf("WSAStartup() failed!\n");//Winsock初始化错误exit(-1);}if (wsaData.wVersion != wVersionRequested){printf("The version of Winsock is not suited!\n");//Winsock版本不匹配WSACleanup();//结束对ws2_32.dll的调用exit(-2);}//说明ws2_32.dll正确加载printf("Load ws2_32.dll successfully!\n");//创建套接字SOCKET servsock;printf("Create Socket...\n");servsock = socket(AF_INET, SOCK_DGRAM, 0);//数据报套接字int servport = 5555;int iSockErr = 0;//定义服务器地址结构sockaddr_in udpaddr;int len = sizeof(udpaddr);memset(&udpaddr, 0, sizeof(udpaddr));udpaddr.sin_family = AF_INET;udpaddr.sin_port = htons(servport);//将一个点分十进制IP地址字符串转换成32位数字表示的IP地址udpaddr.sin_addr.s_addr = inet_addr("172.16.4.94");////INADDR_ANY//读取mp3文件FILE *fp = NULL;errno_t err;err = fopen_s(&fp, "七里香.mp3", "rb");if (fp == NULL){printf("Open File Failed!\n");getchar();exit(-5);}char buffer[MAX_LENGTH] = "\0";char *bufptr = buffer;int i = 0;while (!feof(fp)){int iBytesRead = fread(bufptr, 1, MAX_LENGTH, fp);int iRet = sendto(servsock, buffer, sizeof(buffer), 0, (struct sockaddr*)&udpaddr, len);if (iRet != SOCKET_ERROR){iRet = recvfrom(servsock, buffer, sizeof(buffer), 0, (struct sockaddr*)&udpaddr, &len);}else{printf("send file failed!\n");break;}if (iRet == SOCKET_ERROR){//closesocket(clisock);printf("send file failed!\n");break;}else if (iRet == 0){printf("send mp3 file successfully!\n");break;}if (iBytesRead == 0){printf("send mp3 file successfully!\n");break;}//printf("%d", &len);printf("send packet %d lenth: %d\n", i++, iBytesRead);Sleep(10);}sendto(servsock, "", 0, 0, (struct sockaddr*)&udpaddr, len);//关闭shutdown(servsock, 2);closesocket(servsock);WSACleanup();getchar();return 0;}(2)接收端代码。

基于UDP的文件传输

基于UDP的文件传输

报告编号:11 综合课程设计报告基于UDP协议的文件传输系统的设计与实现学生姓名:指导教师:所在系:电子系所学专业:电子信息工程年级:08级电子(2)班2011 年6 月目录摘要 (3)1 实验的相关知识 (4)1.1通信的模式 (4)1.2 UDP协议 (4)1.3 Winsock控件 (4)1.3.1 Winsock控件重要属性、方法和事件 (5)1.3.2 Winsock控件通信的工作原理 (7)2 实验原理 (7)3 实验步骤 (7)3.1总体规划 (8)3.2模块设计 (8)3.3创建窗体 (8)3.4程序设计 (10)3.5系统运行 (11)4实验结论 (12)参考文献 (13)基于UDP的文件传输的系统的设计与实现摘要该实验的任务是实现文件的传输,并且是基于UDP协议的。

所有文件在该协议下可以实现发送并正确接收。

此时需要了解的是UDP的数据包一次最多只能发送8K,所以我们想到通过拆包和创建窗体的方法来实现文件的传输。

拆包主要是规定每个数据包的大小,然后计算具体的文件所需要的包数,创建窗体的目的是编写程序来进行分包发送和接收。

通过系统运行窗体我们可以知道UDP不仅可以传送和接收小文件,还可以传输和接收较大的文件。

通过实验可知UDP是不可靠的无连接传输,所以在传输过程中会发生丢包的情况,但大部分情况下传输还是比较好的。

关键词:UDP协议发送文件接收文件拆包 Winsock控件1 实验的相关知识1.1通信的模式由于是实现点对点的文件传输,因此在程序中我们使用的是C/S的模式来实现通信。

对于C/S的模式,即分为客户端和服务端。

服务端用来接收客户端的连接,实现两端之间互相传输文件。

采用C/S的模式可以更好的体现程序的功能设计思想,充分调用在LAN中的server和client两方面的处理能力,极大的减少网络上的信息流通量。

C/S体系结构有可能提供一种开放式的、易伸缩扩展的分布式计算机环境,并保护硬件等投资。

实验二 UDP通信实验 试验报告

实验二 UDP通信实验  试验报告

网络程序设计实验报告实验名称:_________ UDP通信___________实验类型:_________验证型实验________指导教师:__________贾浩_______________专业班级:_______信安0904______ ___姓名:_______谌军_____ ________学号:__________20092036__________电子邮件:______448149700@______实验地点:_______东6A4-17_______________实验日期:2012 年 3 月29 日实验成绩:__________________________一、实验目的1.进一步理解Winsock编程接口的调用方法。

2.了解UDP协议的工作原理,掌握UDP服务端程序和客户端程序的编写过程,熟悉程序的测试方法二、实验过程1.调试实验带的代码,使之能运行。

2.修改代码使服务端和客户端能互发信息,并能正确接受到。

3.进一步修改代码,当任何一方发送字符“bye”程序就结束错误1.客户端的字符比较函数放错位置了,本来是放在接受函数之后,我没注意放在了发送函数之后,所以客户端发送了BYE之后,客户端并不能结束程序。

三、实验结果UDPServerUDPClient四、讨论与分析1.能否在接收数据之间不进行bind()调用?如果能,请说明可能的情况。

答:能,首先调用的是Sendto函数,系统会自动为程序绑定。

因此即便调用recvfrom也可以。

2.能否使用connect()连接对方?为什么?答:能客户创建套接字即可调用connect()连接对方服务器监听套接字,当服务器端的accept函数返回后,connect函数也返回。

此时客户端使用Socket函数创建的套接字,服务器使用accept函数创建的套接字,双方就可以通讯了五、实验者自评(主要从实验态度、方法、效果上给一个客观公正的自我评价)这次实验比较简单,运行的时候要先运行服务端,再运行客户端。

通信软件实验报告基于UDP文件传输程序设计与实现

通信软件实验报告基于UDP文件传输程序设计与实现

基于UDP的文件传输程序设计与实现(服务端)一、程序设计思路1.UDP(User Datagram Protocol,用户数据报协议)简介UDP为无连接的通信协议,其主要目的在于处理传输少量的数据。

与TCP 不同的是,UDP在传输数据之前不需要建立通信链接。

仅须设置计算机间的IP 及使用相同的端口,即可互相传输信息,因此UDP只提供单向的数据传输,如图1.1所示:图1.1 UDP通信协议由于UDP不须先建立连接,这样节省了TCP建立连接所需的时间,因此适合于在主机间做单向的数据传输。

但UDP不提供数据错误的侦测以及数据重送等功能,因此并不确保数据能完整发送。

2.java实现UDP程序思路UDP程序使用数据报的形式出现,需要使用以下两个类。

●数据报的内容:DatagramPacket。

●发送和接收数据报:DatagramSocket。

在开发TCP程序的时候,是先有服务端,之后再进行客户端的开发。

而UDP 要运行的时候,则应该先运行客户端,之后再运行服务端。

在运行UDP程序的时候先运行客户端,阻塞等待服务端发过来的信息,服务端开启后,向目标端发送信息之后便关闭了服务端,并不阻塞等待客户端的响应。

二、实现关键技术点1.服务端界面布局服务端界面使用的是边框布局管理器,边框布局管理器是每个JFrame的内容窗格的默认布局管理器。

流布局管理器完全控制每个组件的放置位置,边框布局管理器则不然,它允许为每个组件选择一个放置位置。

可以选择把组件放在内容窗格的中部、北部、南部、东部或者西部。

一般来讲是先放置边缘组件,剩余的可用空间由中间组件占据。

当容器缩放时,边缘组件的尺寸不会改变,而中部组件的大小会发生变化。

在添加组件时可以指定BorderLayout类中的CENTER、NORTH、SOUTH、EAST和WEST常量。

图2.1给出了服务器的界面布局:图2.1 UDP文件传输系统界面布局2.文件选择器Swing中提供了JFileChooser类,它可以显示一个文件对话框,其外观与本地应用程序中使用的文件的对话框基本一样。

局域网文件传输实验报告

局域网文件传输实验报告

局域⽹⽂件传输实验报告局域⽹⽂件传输实验报告实验名称:编写局域⽹内进⾏⽂件传输的⼩⼯具实验⽬的:通过编写局域⽹内⽂件传输的⼯具,熟悉基于UDP的Socket编程,熟悉Winsock的相关内容。

对套接字编程有⼀定的理解和应⽤。

实验内容:本⼩组最终结果实现的实验内容:完成基本任务要求:输⼊对⽅IP 地址,对⽅如果存在,可以给对⽅发送⽂件。

完成扩展任务要求:1.⼯具具有图形交互界⾯;2.局域⽹内使⽤该⼯具的两台主机可以互相进⾏⽂字通信;3.⾃动按照⼀定频率扫描局域⽹内其他开启了该⼯具的主机,并在界⾯上⽤列表显⽰出来;4.传输⽂件和⽂字内容时,直接选择界⾯上已经显⽰出来的存活主机,不需要⼿动输⼊IP 地址。

实验准备说明:操作系统:Windows XP开发语⾔:C++,MFC开发平台:Microsoft Visual C++ 6.0由于开发图形界⾯时需要⽤到MFC,因此对缺乏MFC编译运⾏环境的VC6可能需要加载相应的动态链接库DLL⽂件。

加载⽅法:将DLL⽂件置放于系统链接库路径。

即:C:\WINDOWS\system32实验设计与开发:程序设计思路:程序所采⽤基于TCP/IP协议的Winsock编程原理,编程模型采⽤客户机/服务器(Client/Server)⽅式,为了⽅便使⽤,设计将客户机和服务器合⽽为⼀。

在通信的时候主要可以分为两个部分,⼀个部分是⽤于传送控制信息,例如发送⽂件的请求,⽂件的名称、⼤⼩等,由于这⽅⾯的数据量⽐较⼩,为了⽅便起见采⽤了MFC所提供的CSocket类的串⾏化技术来实现;⽽另⼀个部分就是⽂件的传输部分,对于⽂件的传输,由于数据量相对来说⽐较⼤,所以分别写了两个线程,⼀个⽤于发送,⼀个⽤于接收。

在添加附加功能聊天时,将聊天相关内容作为⼩⽂件传输,并将其显⽰在相应的控件中。

这两个部分在具体实现的时候分别建⽴有⾃⼰的套接字(Socket)。

程序代码内容⼤体分为图形界⾯和后台交互两个模块,在最开始设计开发时原本准备以此作为分⼯,但实际图形界⾯代码较少,⽽且主要的复杂点在于事件响应和句柄绑定,⽐较容易解决,总体⼯作量较少,因此图形界⾯后来是共同讨论开发,设计完成后根据具体的控件响应分⼯相关联的后台交互代码开发。

udp实验报告

udp实验报告

udp实验报告UDP实验报告引言:UDP(User Datagram Protocol)是一种无连接的传输协议,它在网络通信中扮演着重要的角色。

本实验旨在通过对UDP协议的实际应用,深入了解其特点和工作原理。

一、UDP的特点UDP与TCP相比,具有以下几个显著特点:1. 无连接:UDP在发送数据之前不需要建立连接,因此传输效率更高。

2. 不可靠:UDP不提供可靠的数据传输保证,数据包可能丢失、顺序错乱或重复。

3. 高效:UDP的头部开销较小,适用于对实时性要求较高的应用场景。

4. 简单:UDP的实现相对简单,占用的系统资源较少。

二、UDP的应用场景UDP广泛应用于以下场景:1. 实时通信:如音频、视频传输、实时游戏等。

由于UDP的低延迟特性,适合于对实时性要求较高的应用。

2. DNS(Domain Name System):域名解析过程中,UDP用于快速传输查询请求和响应。

3. SNMP(Simple Network Management Protocol):网络管理中,UDP用于传输管理信息。

4. TFTP(Trivial File Transfer Protocol):简单文件传输协议,基于UDP实现。

三、实验目的本实验旨在通过编写UDP程序,验证UDP协议的特点和应用场景。

四、实验环境与工具1. 操作系统:Windows 102. 编程语言:Python3. 开发工具:PyCharm4. 网络模拟器:GNS3五、实验步骤1. 设计并实现一个基于UDP的简单聊天程序,包括客户端和服务器端。

2. 在GNS3网络模拟器中配置两台虚拟机,分别作为客户端和服务器端。

3. 在客户端和服务器端分别运行聊天程序,并进行通信测试。

4. 分析测试结果,验证UDP协议的特点。

六、实验结果与分析通过测试,我们得到了以下实验结果:1. UDP传输速度较快:在实时聊天过程中,消息几乎是即时传输的,延迟较低。

2. 数据包丢失现象:由于UDP不提供可靠的传输保证,部分数据包可能会丢失,导致聊天内容不完整。

udp实验报告 计算机网络

udp实验报告 计算机网络

udp实验报告计算机网络
《UDP实验报告-计算机网络》
一、实验目的
本实验旨在通过对UDP协议的实验,加深对计算机网络中传输层协议的理解,
掌握UDP协议的特点、优缺点以及适用场景。

二、实验环境
本次实验使用了一台服务器和一台客户端,它们通过局域网连接,并且安装了
相应的网络调试工具和UDP通信软件。

三、实验内容
1. UDP协议的特点
UDP是用户数据报协议,是一种无连接的、不可靠的传输协议。

它不需要建立
连接,也不保证数据的可靠性和顺序性,因此传输效率较高。

2. UDP协议的优缺点
优点:UDP协议的头部开销小,传输效率高;适用于实时性要求较高的应用场景,如视频会议、在线游戏等。

缺点:UDP协议不提供可靠性保证,容易丢包;不支持拥塞控制和流量控制,
对网络负载和稳定性要求较高。

3. UDP协议的适用场景
UDP适用于实时性要求高、数据量较小、对可靠性要求不高的应用场景,如音频、视频的实时传输,以及一些简单的网络通信协议。

四、实验结果
通过对UDP协议的实验,我们成功地实现了服务器和客户端之间的UDP通信,
实时传输了一些简单的文本数据,并观察到了UDP协议的特点和优缺点。

五、实验总结
本次实验使我们更深入地了解了UDP协议的特点、优缺点以及适用场景,对于今后的网络应用开发和调试工作具有重要的参考价值。

六、实验感想
通过本次实验,我们对计算机网络中的传输层协议有了更深入的理解,也增强了我们对网络通信技术的兴趣,希望能够在未来的学习和工作中更好地应用所学知识。

基于UDP的文件传输.

基于UDP的文件传输.

计算机网络综合课程设计报告基于UDP协议的文件传输系统的设计与实现学生姓名:指导教师:所在系:电子信息系所学专业:电子信息工程年级:2013 年6 月目录基于UDP的文件传输的系统的设计与实现 (3)一、实验的相关知识 (4)1.1通信的模式 (4)1.2 UDP协议 (4)1.3 Winsock控件 (4)1.4 Winsock控件重要属性、方法和事件 (5)1.6 commomdialog控件 (8)1.7 timer控件 (9)三、实验步骤 (11)3.1总体规划 (11)3.2模块设计 (11)3.3创建窗体 (12)3.4程序设计 (14)3.5系统运行 (18)四、实验结论 (19)五、参考文献 (20)基于UDP的文件传输的系统的设计与实现摘要:该实验的任务是实现文件的传输,并且是基于UDP协议的。

所有文件在该协议下可以实现发送并正确接收。

此时需要了解的是UDP的数据包一次最多只能发送8K,所以我们想到通过拆包和创建窗体的方法来实现文件的传输。

拆包主要是规定每个数据包的大小,然后计算具体的文件所需要的包数,创建窗体的目的是编写程序来进行分包发送和接收。

通过系统运行窗体我们可以知道UDP不仅可以传送和接收小文件,还可以传输和接收较大的文件。

通过实验可知UDP是不可靠的无连接传输,所以在传输过程中会发生丢包的情况,但大部分情况下传输还是比较好的。

关键词:UDP协议;发送文件;接收文件;拆包;Winsock控件一、实验的相关知识1.1通信的模式由于是实现点对点的文件传输,因此在程序中我们使用的是C/S的模式来实现通信。

对于C/S的模式,即分为客户端和服务端。

服务端用来接收客户端的连接,实现两端之间互相传输文件。

采用C/S的模式可以更好的体现程序的功能设计思想,充分调用在LAN中的server和client两方面的处理能力,极大的减少网络上的信息流通量。

C/S 体系结构有可能提供一种开放式的、易伸缩扩展的分布式计算机环境,并保护硬件等投资。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一实验目的1了解udp文件传输的具体内容2明白发送窗口,接收窗口的定义3理解发送端的发送线程,以及发送端的接收线程4掌握接收端的接收线程二实验内容基于udp协议的文件传输,以及相关代码三实验步骤1发送窗口发送窗口用来对发送端进行流量控制。

发送窗口的大小Wt 代表在还没有收到对方确认的条件下,发送端最多可以发送的数据帧的个数。

2接收窗口接收窗口用来控制接收数据帧。

只有当接收到的数据帧的发送序号落在接收窗口内,才允许将该数据帧收下,否则一律丢弃。

接收窗口的大小用Wr 来表示,在连续ARQ 协议中,Wr = 1。

在接收窗口和发送窗口间存在着这样的关系:接收窗口发生旋转后,发送窗口才可能向前旋转,接收窗口保持不动时,发送窗口是不会旋转的。

这种收发窗口按如此规律顺时钟方向不断旋转的协议就犯法为滑动窗口协议。

发送端的发送线程:int ret;int nPacketCount = 0;DWORD dwRet;SendBuf sendbuf;DWORD dwRead;DWORD dwReadSize;SendBuf* pushbuf;//计算一共要读的文件次数,若文件已读完,但客户端没有接收完,//则要发送的内容不再从文件里读取,而从m_bufqueue 里提取nPacketCount = m_dwFileSize / sizeof(sendbuf.buf);//若不能整除,则应加1if(m_dwFileSize % sizeof(sendbuf.buf) != 0)++nPacketCount;SetEvent(m_hEvent);CHtime htime;//若已发送大小小于文件大小并且发送窗口前沿等于后沿,则继续发送//否则退出循环if(m_dwSend < m_dwFileSize) // 文件没有传输完时才继续传输{while(1){dwRet = WaitForSingleObject(m_hEvent, 1000);if(dwRet == WAIT_FAILED){return false;}else if(dwRet == WAIT_TIMEOUT){//重发::EnterCriticalSection(&m_csQueue); // 进入m_bufqueue 的排斥区ret = m_hsocket.hsendto((char*)m_bufqueue.front(), sizeof(sendbuf));::LeaveCriticalSection(&m_csQueue); // 退出m_bufqueue 的排斥区if(ret == SOCKET_ERROR){cout << "重发失败,继续重发" << endl;continue;}ResetEvent(m_hEvent);continue;}//若发送窗口大小 < 预定大小 && 已读文件次数(nReadIndex) < 需要读文件的次数(nReadCount),则继续读取发送//否则,要发送的内容从m_bufqueue 里提取if(m_dwSend < m_dwFileSize){dwReadSize = m_dwFileSize - m_dwSend;dwReadSize = dwReadSize < MAXBUF_SIZE ? dwReadSize : MAXBUF_SIZE;memset(sendbuf.buf, 0, sizeof(sendbuf.buf));if(!ReadFile(m_hFile, sendbuf.buf, dwReadSize, &dwRead, NULL)){//AfxMessageBox("读取文件失败,请确认文件存在或有读取权限.");cout << "读取文件失败,请确认文件存在或有读取权限." << endl;return false;}m_dwSend += dwRead;sendbuf.index = m_nSendIndexHead;m_nSendIndexHead = (m_nSendIndexHead + 1) % Sliding_Window_Size; // 发送窗口前沿向前移一格sendbuf.dwLen = dwRead;//保存发送过的数据,以便重发::EnterCriticalSection(&m_csQueue); // 进入m_bufqueue 的排斥区pushbuf = GetBufFromLookaside();memcpy(pushbuf, &sendbuf, sizeof(sendbuf));m_bufqueue.push(pushbuf);if(m_dwSend >= m_dwFileSize) // 文件已读完,在队列中加一File_End 标志,以便判断是否需要继续发送{pushbuf = GetBufFromLookaside();pushbuf->index = File_End;pushbuf->dwLen = File_End;memset(pushbuf->buf, 0, sizeof(pushbuf->buf));m_bufqueue.push(pushbuf);}::LeaveCriticalSection(&m_csQueue); // 退出m_bufqueue 的排斥区}::EnterCriticalSection(&m_csQueue); // 进入m_bufqueue 的排斥区if(m_bufqueue.front()->index == File_End) // 所有数据包已发送完毕,退出循环{::LeaveCriticalSection(&m_csQueue); // 退出m_bufqueue 的排斥区break;}else if(m_bufqueue.size() <= Send_Window_Size) // 发送窗口小于指定值,继续发送{ret = m_hsocket.hsendto((char*)m_bufqueue.front(), sizeof(sendbuf));if(ret == SOCKET_ERROR){::LeaveCriticalSection(&m_csQueue); // 退出m_bufqueue 的排斥区cout << "发送失败,重发" << endl;continue;}//延时,防止丢包Sleep(50);}else // 发送窗口大于指定值,等持接收线程接收确认消息{ResetEvent(m_hEvent);}::LeaveCriticalSection(&m_csQueue); // 退出m_bufqueue 的排斥区}}发送端的接收线程:int ret;RecvBuf recvbuf;while(m_hFile != NULL){ret = m_hsocket.hrecvfrom((char*)&recvbuf, sizeof(recvbuf));if(ret == SOCKET_ERROR){//AfxMessageBox("接收确认消息出错");::EnterCriticalSection(&m_csQueue);if(m_bufqueue.front()->index == File_End) // 文件传输完毕{::LeaveCriticalSection(&m_csQueue);break;}::LeaveCriticalSection(&m_csQueue);cout << "接收确认消息出错: " << GetLastError() << endl;return false;}if(recvbuf.flag == Flag_Ack && recvbuf.index == m_nSendIndexTail) {m_nSendIndexTail = (m_nSendIndexTail + 1) % Sliding_Window_Size; //该结点已得到确认,将其加入旁视列表,以备再用::EnterCriticalSection(&m_csQueue);m_bufLookaside.push(m_bufqueue.front());m_bufqueue.pop();::LeaveCriticalSection(&m_csQueue);SetEvent(m_hEvent);}}接收端的接收线程:int ret;DWORD dwWritten;SendBuf recvbuf;RecvBuf sendbuf;int nerror = 0;// 设置文件指针位置,指向上次已发送的大小SetFilePointer(m_hFile, 0, NULL, FILE_END);//若已接收文件大小小于需要接收的大小,则继续while(m_dwSend < m_dwFileSize){//接收memset(&recvbuf, 0, sizeof(recvbuf));ret = m_hsocket.hrecvfrom((char*)&recvbuf, sizeof(recvbuf));if(ret == SOCKET_ERROR){return false;}//不是希望接收的,丢弃,继续接收if(recvbuf.index != (m_nRecvIndex) % Sliding_Window_Size){nerror++;cout << recvbuf.index << "error?" << m_nRecvIndex << endl;continue;}if(!WriteFile(m_hFile, recvbuf.buf, recvbuf.dwLen, &dwWritten, NULL)){//AfxMessageBox("写入文件失败");cout << "写入文件失败" << endl;return false;}//已接收文件大小m_dwSend += dwWritten;//发送确认消息sendbuf.flag = Flag_Ack;sendbuf.index = m_nRecvIndex;ret = m_hsocket.hsendto((char*)&sendbuf, sizeof(sendbuf));if(ret == SOCKET_ERROR){return false;}//接收窗口前移一格m_nRecvIndex = (m_nRecvIndex + 1) % Sliding_Window_Size;}四实验小结通过本次的实验,我掌握了基于udp协议实现文件传输的具体内容,也掌握也相关的代码,发送端和接收端的相关知识,udp存在不可靠性,所以用他传输文件,要保证文件不丢失,因为我们要设计相关的代码,从而实现可靠的传输。

相关文档
最新文档