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

上传人:bei****lei 文档编号:124930868 上传时间:2022-07-25 格式:DOC 页数:9 大小:111KB
返回 下载 相关 举报
基于UDP的文件传输实验报告_第1页
第1页 / 共9页
基于UDP的文件传输实验报告_第2页
第2页 / 共9页
基于UDP的文件传输实验报告_第3页
第3页 / 共9页
点击查看更多>>
资源描述
数据库技术 实验报告 授课教师:张国富 苏兆品 zgf实验报告课程名称 数据库技术 学生姓名 * 学 号 * 专业班级 电子信息工程 指导教师 成 绩 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 #include #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 bufferMAX_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);elseprintf(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: %dn, i+, iBytesRead);Sleep(10);sendto(servsock, , 0, 0, (struct sockaddr*)&udpaddr, len);/关闭shutdown(servsock, 2);closesocket(servsock);WSACleanup();getchar();return 0;(2)接收端代码。#include stdafx.h#include #include #define MAX_LENGTH 1024*10int _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);/获取本机IP地址char PCname100 = ;char *IPaddress = NULL;gethostname(PCname, sizeof(PCname);printf(Local Hostname is %s.n, PCname);struct hostent FAR * lpHostEnt = gethostbyname(PCname);if (lpHostEnt = NULL)/产生错误printf(gethostbyname failed!n);return -1;/获取IPLPSTR lpAddr = lpHostEnt-h_addr_list0;if (lpAddr)struct in_addr inAddr;memmove(&inAddr, lpAddr, 4);/转换为标准格式IPaddress = inet_ntoa(inAddr);/将一个32位数字表示的IP地址转换成点分十进制IP地址字符串if (sizeof(IPaddress) = 0)printf(get host IP failed!n);elseprintf(Local HostIP is %s.n, IPaddress);/创建套接字/SOCKET servsock, clisock;SOCKET servsock;printf(Create Socket.n);servsock = socket(AF_INET, SOCK_DGRAM, 0);/数据报套接字int servport = 5555;int iSockErr = 0;/定义服务器地址结构sockaddr_in udpaddr, cliaddr;memset(&udpaddr, 0, sizeof(udpaddr);memset(&cliaddr, 0, sizeof(cliaddr);int clilen = sizeof(cliaddr);udpaddr.sin_family = AF_INET;udpaddr.sin_port = htons(servport);/将一个点分十进制IP地址字符串转换成32位数字表示的IP地址udpaddr.sin_addr.s_addr = inet_addr(IPaddress);/127.0.0.1/INADDR_ANY/绑定套接字到服务器地址结构printf(Binding.n);iSockErr = bind(servsock, (sockaddr *)&udpaddr, sizeof(udpaddr);if (iSockErr = SOCKET_ERROR)printf(Binding failed:%dn, WSAGetLastError();/根据不同的错误类型进行不同的处理exit(-3);/函数调用成功,进行其他处理char buff256 = 0;char bufferMAX_LENGTH = 0;int len = 0;/接收欢迎词memset(buffer, 0, sizeof(buffer);FILE *fp = NULL;errno_t err;err = fopen_s(&fp, 七里香.mp3, wb);int i = 0;while (1)len = recvfrom(servsock, buffer, sizeof(buffer), 0, (struct sockaddr*)&cliaddr, &clilen);if (len = SOCKET_ERROR) printf(recv error!n);break;else if (len = 0)printf(recv finished!n);break;bufferlen = 0;printf(received packet %d lenth: %dnn, i+, len);fwrite(buffer, 1, len, fp);sendto(servsock, buff, sizeof(buff), 0, (struct sockaddr*)&cliaddr, clilen);Sleep(8);/printf(%dn,&len);fclose(fp);/shutdown(clisock, 2);/closesocket(clisock);shutdown(servsock, 2);closesocket(servsock);WSACleanup();getchar();return 0;(3)简单的代码移植后接收端是否能正确接收?如果不能请分析原因,并尝试调整发送端读取数据的大小和延迟时间,以及接收端缓冲区的大小来解决数据丢包问题。给出参数调整的理由。答: 简单的代码移植可能不能正确接受,因为会出现丢包现象。丢包现象在UDP中是很常见的现象。在UDP文件传输中,文件将从client 端发向server端。与TCP不同的是,UDP不需要链接,可以直接传输,但是稳定性不好,容易丢包。调整client端中Sleep(10)的大小来解决这个问题,使client的延迟时间大于server的延迟时间,例如server的sleep(8)。
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!