基于UDP的文件传输实验报告
更新时间:2023-09-17 02:37:01 阅读量: 高中教育 文档下载
《数据库技术 》实验报告 授课教师:张国富 苏兆品 zgf@hfut.edu.cn
实验报告
课程名称 《数据库技术》
学生姓名 ***
学 号 ********
专业班级 电子信息工程
指导教师
成 绩
2015年6月 8 日
《数据库技术 》实验报告 授课教师:张国富 苏兆品 zgf@hfut.edu.cn
实验名称: 基于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 \ #include
#define MAX_LENGTH 1024
int _tmain(int argc, _TCHAR* argv[]) {
exit(-1);
if (WSAStartup(wVersionRequested, &wsaData) != 0)//初始化ws2_32.dll动态库 {
printf(\);//Winsock初始化错误 wVersionRequested = MAKEWORD(2, 2); WSADATA wsaData; WORD wVersionRequested;
《数据库技术 》实验报告 授课教师:张国富 苏兆品 zgf@hfut.edu.cn
}
if (wsaData.wVersion != wVersionRequested) { }
//说明ws2_32.dll正确加载
printf(\); //创建套接字 SOCKET servsock; printf(\);
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(\);////INADDR_ANY
printf(\);//Winsock版本不匹配 WSACleanup();//结束对ws2_32.dll的调用 exit(-2);
//读取mp3文件 FILE *fp = NULL; errno_t err;
err = fopen_s(&fp, \七里香.mp3\, \); if (fp == NULL){ }
char buffer[MAX_LENGTH] = \;
printf(\); getchar(); exit(-5);
《数据库技术 》实验报告 授课教师:张国富 苏兆品 zgf@hfut.edu.cn
char *bufptr = buffer; int i = 0; while (!feof(fp)) { }
sendto(servsock, \, 0, 0, (struct sockaddr*)&udpaddr, len);
int iBytesRead = fread(bufptr, 1, MAX_LENGTH, fp);
int iRet = sendto(servsock, buffer, sizeof(buffer), 0, (struct sockaddr*)&udpaddr, len); if (iRet != SOCKET_ERROR) { } else { }
if (iRet == SOCKET_ERROR) { }
else if (iRet == 0) { }
if (iBytesRead == 0) { }
//printf(\
printf(\, i++, iBytesRead); Sleep(10);
printf(\); break;
printf(\); break;
//closesocket(clisock); printf(\); break;
printf(\); break;
iRet = recvfrom(servsock, buffer, sizeof(buffer), 0, (struct sockaddr*)&udpaddr, &len);
《数据库技术 》实验报告 授课教师:张国富 苏兆品 zgf@hfut.edu.cn
}
//关闭
shutdown(servsock, 2); closesocket(servsock); WSACleanup(); getchar(); return 0;
(2)接收端代码。
#include \ #include
#define MAX_LENGTH 1024*10
int _tmain(int argc, _TCHAR* argv[]) {
//说明ws2_32.dll正确加载
printf(\); }
exit(-2);
WSACleanup();//结束对ws2_32.dll的调用 if (wsaData.wVersion != wVersionRequested) {
printf(\);//Winsock版本不匹配 }
exit(-1);
if (WSAStartup(wVersionRequested, &wsaData) != 0)//初始化ws2_32.dll动态库 {
printf(\);//Winsock初始化错误 wVersionRequested = MAKEWORD(2, 2); WSADATA wsaData; WORD wVersionRequested;
《数据库技术 》实验报告 授课教师:张国富 苏兆品 zgf@hfut.edu.cn
//获取本机IP地址 char PCname[100] = { \ }; char *IPaddress = NULL;
gethostname(PCname, sizeof(PCname)); printf(\, PCname);
struct hostent FAR * lpHostEnt = gethostbyname(PCname); if (lpHostEnt == NULL) { } //获取IP
LPSTR lpAddr = lpHostEnt->h_addr_list[0]; if (lpAddr) { }
//创建套接字
//SOCKET servsock, clisock; SOCKET servsock; printf(\);
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;
struct in_addr inAddr;
memmove(&inAddr, lpAddr, 4); //转换为标准格式
IPaddress = inet_ntoa(inAddr);//将一个32位数字表示的IP地址转换成点分十进制IP地址字符串 if (sizeof(IPaddress) == 0) else
printf(\, IPaddress); printf(\); //产生错误
printf(\); return -1;
《数据库技术 》实验报告 授课教师:张国富 苏兆品 zgf@hfut.edu.cn
udpaddr.sin_port = htons(servport);
//将一个点分十进制IP地址字符串转换成32位数字表示的IP地址
udpaddr.sin_addr.s_addr = inet_addr(IPaddress);//\ //绑定套接字到服务器地址结构 printf(\);
iSockErr = bind(servsock, (sockaddr *)&udpaddr, sizeof(udpaddr)); if (iSockErr == SOCKET_ERROR) { }
//函数调用成功,进行其他处理 char buff[256] = \;
char buffer[MAX_LENGTH] = \; int len = 0; //接收欢迎词
memset(buffer, 0, sizeof(buffer)); FILE *fp = NULL; errno_t err;
err = fopen_s(&fp, \七里香.mp3\, \); int i = 0; while (1) {
len = recvfrom(servsock, buffer, sizeof(buffer), 0, (struct sockaddr*)&cliaddr, &clilen); if (len == SOCKET_ERROR) { }
else if (len == 0) { }
buffer[len] = 0;
printf(\, i++, len);
printf(\); break;
printf(\); break;
printf(\, WSAGetLastError());//根据不同的错误类型进行不同的处理 exit(-3);
《数据库技术 》实验报告 授课教师:张国富 苏兆品 zgf@hfut.edu.cn
}
return 0; getchar(); } fclose(fp);
//shutdown(clisock, 2); //
closesocket(clisock); shutdown(servsock, 2); closesocket(servsock); WSACleanup();
Sleep(8);
//printf(\
sendto(servsock, buff, sizeof(buff), 0, (struct sockaddr*)&cliaddr, clilen);
fwrite(buffer, 1, len, fp);
(3)简单的代码移植后接收端是否能正确接收?如果不能请分析原因,并尝试调整发送端读取数据的大小和延迟时间,以及接收端缓冲区的大小来解决数据丢包问题。给出参数调整的理由。
《数据库技术 》实验报告 授课教师:张国富 苏兆品 zgf@hfut.edu.cn
答: 简单的代码移植可能不能正确接受,因为会出现丢包现象。丢包现象在UDP中是很常见的现象。在UDP文件传输中,文件将从client 端发向server端。与TCP不同的是,UDP不需要链接,可以直接传输,但是稳定性不好,容易丢包。调整client端中Sleep(10)的大小来解决这
个问题,使client的延迟时间大于server的延迟时间,例如server的sleep(8)。
正在阅读:
基于UDP的文件传输实验报告09-17
公司口号_公司口号大全、标语、霸气07-31
蔡文姬简介02-09
江西农业大学仪器分析实验思考题04-05
天空生气了作文450字07-03
择吉禁忌11-27
妈妈有一双闲不住的手作文550字07-11
分式概念及意义知识讲解04-10
九型人格讲义11-18
- 上海大众、一汽大众、东风日产车型与VIN代号对照表
- 第2章服装原型及原型制作
- 江苏省工商行政管理系统经济户口管理办法及四项制度
- 纪检监察业务知识试题2
- 传感器综合题答案
- 北京第二外国语学院翻硕招生人数及学费
- 初三新编英语教材下册
- 公司庆中秋、迎国庆联欢会客串词
- 向区委常委会汇报安全生产工作材料
- 2006年GCT英语模拟试题(三)及答案解析
- 经济法概念的早期使用
- 我爱做家务课堂教学设计
- 学校安全工作月报表、消防安全排查表、消防隐患排查台账
- 成本会计毕业论文
- 班级文化建设论文
- 2018年天津市高考文科试题与答案汇总(Word版) - 图文
- 铁路论文
- 2017年嵌入式系统设计师考试时间及地点
- 1.111--灾害与突发公共卫生事件应急预案
- 起爆点主图 注意买入 拉升 逃顶源码指标通达信指标公式源码
- 传输
- 基于
- 实验
- 文件
- 报告
- UDP
- 仁华课本一年级奥数12-17讲
- (衡水金卷调研卷)2018年普通高等学校招生全国统一考试模拟试题英语二
- 微机原理上机实验2
- 力学1-全国中学生物理竞赛专题模拟练习试卷及参考答案
- 2015新版人教版六年级数学下册教学计划
- 冀教版2016-2017学年度二年级数学下册期末模拟试卷(含答案)
- 劳务纠纷答辩状、证据目录、代理词
- 中国尼龙绸雨披行业市场调查研究报告(目录) - 图文
- 《黑暗之魂3》宝石虫位置在哪,宝石虫位置一览 - 图文
- 2011-2012江苏省泰兴市七年级上学期数学期末试题及答案
- 2018年党员个人自查报告精选合集
- 空气纵掠平板换热系数测量实验指导书-赵辉-20150617(1)
- 六年级数学上册《第四单元测试卷》(附答案)
- 食品化学重点复习资料(2)
- 企业审计部门工作总结范文
- 燃气轮机复习题 (DOC)
- 新世纪大学英语综合教程1-第二版-课文详解-Lecture Notes - U2
- xxx镇20xx年扶贫开发工作总结 -
- 5月17每日一练
- 期中考试