网络编程文件传输实验报告
更新时间:2023-09-13 16:36:01 阅读量: 教学研究 文档下载
《网络编程》 实验报告
课 程 名 称: 网络编程 实验项目名称: 网络编程 班 级: 实验室名称: 专 业: 网 络 工 程 任 课 教 师: 黄 梅 根 学 号: 姓 名: 基于TCP的网络文件传输实验报告
一、 实验目的
1、 熟悉TCP/IP协议的功能和网络操作
2、 编写小型的socket应用程序,初步了解windows环境下使用sockets
编程,实现点对点文本传输。
二、 实验原理
本程序是基于TCP/IP协议栈的网络编程,使用C语言,利用操作系统提供的套接字网络编程接口进行编写
TCP协议是其中重要的传输协议,为应用层提供可靠的 端到端的流传输服务.其中套接字取值sock_stream即为TCP的流传输服务
Windows socket包含了人们所熟悉的Berkeley Socket风格的函数库,也包含了一组针对windows的扩展库函数,以使程序员能充分的利用windows驱动消息机制进行编程。
Windows Sockets的规范本意在于提供给应用开发者一套简单的API,并让个网络应用软件开发商遵守该协议。此外在一个特定的版本windows基础上,Windows socket也定义了一个二进制借口(ABI),从此来保证Windows socket API应用程序能够在任何符合Windows socket协议的实现上工作。
三、 设计概述
1、 创建套接字
服务进程和客户进程在实现通信前必须创建各自的套接字,然后才能用相应的套接字进行发送接收操作,服务进程总是先于客户端进程启动,服务器端进程和客户端进程创建套接字。Socket()函数实现代码如下: SOCKET serSocket=socket(AF_INET,SOCK_STREAM,0);//创建了可识别套接字
2、 地址绑定
当调用socket()创建套接字后,服务器必须把套接字与自己的地址显式地建立联系,以便客户端向该IP地址和端口号的服务进程请求服务,这个过程是通过调用函数bind()实现的。bind()函数原型如下: int bind(SOCKET s ,const struct sockaddr FAR*name ,int namelen);
3、 服务器套接字置为监听模式
将服务器设置为监听工作方式后,使用API调用listen(): int listen(SOCKET s, int backlog);
第一个参数指定套接字。第二个参数指定了正在等待连接的最大队列长度。若无错误发生,则listen()函数返回0。
4、 建立连接,进行文件传输
调用gets(path)获得传输文件的路径和存放文件路径,这个过程中还需调用send()函数和recv()函数,共同协调实现文件传送。
四、 源代码
服务器端
#include
#pragma comment(lib,\#define SIZE 1024*8 void main() {
//创建套接字
WORD myVersionRequest; WSADATA wsaData;
myVersionRequest=MAKEWORD(1,1); int err;
err=WSAStartup(myVersionRequest,&wsaData); if (!err) {
printf(\已打开套接字\\n\
} else {
//进一步绑定套接字
printf(\嵌套字未打开!\ return; }
SOCKET serSocket=socket(AF_INET,SOCK_STREAM,0);//创建了可识别套接字
//需要绑定的参数 SOCKADDR_IN addr;
addr.sin_family=AF_INET;
addr.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//ip地址 addr.sin_port=htons(6000);//绑定端口
bind(serSocket,(SOCKADDR*)&addr,sizeof(SOCKADDR));//绑定完成
listen(serSocket,5);//其中第二个参数代表能够接收的最多的连接数
////////////////////////////////////////////////////////////////////////// //开始进行监听
//////////////////////////////////////////////////////////////////////////
SOCKADDR_IN clientsocket; int len=sizeof(SOCKADDR); SOCKET serConn; char sendBuf[50];
serConn=accept(serSocket,(SOCKADDR*)&clientsocket,&len);//如果这里不是accept而是conection的话。。就会不断的监听 sprintf(sendBuf,\%s to bejing\找对对应的IP并且将这行字打印到那里 //发送欢迎信息
send(serConn,sendBuf,strlen(sendBuf)+1,0);
FILE *fp;
lable1: printf(\客户端已打开\\n请输入存放文件地址:\\n\char path[100]={\int i=0;
while(path[i]!='\\0') {
if(path[i]=='/') path[i]='\\\\'; i++; }
gets(path);
if((fp=fopen(path,\{
printf(\文件未打开\\n\ goto lable1; } else {
printf(\文件已打开 开始文件传输......\\n\
//发送开始标志
send(serConn,\开始传送\开始传送\ //得到文件大小
char datalength[20]; long int length=0;
recv(serConn,datalength,21,0); length=atol(datalength);
printf(\得到文件大小: %d\\n\ //开始传送
double cent=0.0;
char receiveBuf[SIZE]; long int x=0; while (1) {
x=x+SIZE; if(x cent=(double)x*100.0/(double)length; printf(\已接收: %4.2f%\\n\ recv(serConn,receiveBuf,SIZE+1,0); fwrite(receiveBuf,1,SIZE,fp); } else { recv(serConn,receiveBuf,length+SIZE-x+1,0); printf(\文件接收完毕\\n\ fwrite(receiveBuf,1,length+SIZE-x,fp); fclose(fp); break; } } } closesocket(serConn);//关闭 WSACleanup();//释放资源的操作 system(\ } 客户端 #include #pragma comment(lib,\ #define SIZE 1024*8 void main() { FILE *fp; int err; int length=0; SOCKET clientSocket; SOCKADDR_IN clientsock_in; char receiveBuf[100]={\ char ip_addr[16]={\WORD versionRequired; WSADATA wsaData; versionRequired=MAKEWORD(1,1); err=WSAStartup(versionRequired,&wsaData);//协议库的版本信息 if (!err) { printf(\客户端嵌套字已经打开!\\n\} else { printf(\客户端的嵌套字打开失败!\\n\ return;//结束 } clientSocket=socket(AF_INET,SOCK_STREAM,0); printf(\请输入主机IP:\\n\scanf(\//连接服务器 clientsock_in.sin_addr.S_un.S_addr=inet_addr(ip_addr); clientsock_in.sin_family=AF_INET; clientsock_in.sin_port=htons(6000); connect(clientSocket,(SOCKADDR*)&clientsock_in,sizeof(SOCKADDR));//开始连接 recv(clientSocket,receiveBuf,101,0); printf(\char path[100]={\gets(path); int i=0; do { printf(\请输入文件地址:\\n\ gets(path); while(path[i]!='\\0') { if(path[i]=='/') path[i]='\\\\'; i++; } i=0; if((fp=fopen(path,\ { i=1; printf(\文件未打开\\n\ } }while(i); fseek(fp,0L,SEEK_END); length=ftell(fp); printf(\待传送文件大小: %d\\n\ printf(\文件已经打开 等待主机消息......\\n\//得到主机开始传送消息 recv(clientSocket,receiveBuf,101,0); printf(\ if(strcmp(receiveBuf,\开始传送\{ //传送文件长度 char sendBuf[20]; ltoa(length,sendBuf,10); send(clientSocket,sendBuf,21,0); fseek(fp,0L,SEEK_SET); //传送文件 long int y=0; double cent; char trans[SIZE]; while(!feof(fp)) { fread(trans,1,SIZE,fp); y=y+SIZE; if(y cent=(double)y*100.0/(double)length; printf(\已发送: %4.2f%\\n\ send(clientSocket,trans,SIZE+1,0); } else { send(clientSocket,trans,length+SIZE-y+1,0); closesocket(clientSocket); WSACleanup(); } } fclose(fp); } printf(\文件发送完毕\\n\system(\} 五、 实验结果及分析: 客户端运行结果 服务器端运行结果 六、 心得体会:网络编程的实验课虽然只有八次,但是我们充分了解了 各种网络编程和winsock控件的知识,了解了TCP/IP协议的相关知识以及其中两个重要协议TCP UDP的特点与差异,进一步学习了文件传输等知识,创建套接字 监听 传输 关闭等过程,直到最后写出C/S模式的文件传输程序 感觉我们巩固了教材的内容 实践的能力也得到了提高 不足之处就是自己粗心大意,在写代码时候 参数 注解等经常注明的不够好,希望以后能养成良好的编程习惯
正在阅读:
网络编程文件传输实验报告09-13
大气污染控制工程课程设计05-28
SFDA-GCP考试真题和答案(考试系统可查原题80%以上)01-15
农场游记作文600字07-11
毕淑敏散文精选02-19
国家心理咨询师-个人成长报告06-17
李俊中学2011—2012学年度第一学期期末质量检测七年级英语试题 -04-14
公司差旅费用管理与报销制度04-22
学科组建设成效奖颁奖词07-27
- 公务员上岸同学告诉你,怎样走出面试中常见的十大误区
- 作表率,我们怎么办(办公室主任)
- 乘务员安全责任书
- 增员面试流程
- 河南省焦作市规模以上租赁和商务服务业企业应付职工薪酬数据洞察报告2019版
- 最新4社区工作者面试题
- 个人简历表
- 男教工体检必检项目
- 河南省兰考县规模以上租赁和商务服务业企业应付职工薪酬数据洞察报告2019版
- 兼职译员测试稿
- 河南省开封市规模以上租赁和商务服务业企业应付职工薪酬数据洞察报告2019版
- 永州职业技术学院校园总体规划-永州职业学院
- 最新5、培训科长笔试题(答案)
- 2019雅商酒店境外人员登记培训稀有资料,不可错过
- 小学教师求职简历范文
- 红酒知识与礼仪
- 春节给领导拜年的短信拜年词
- 2019年上半年中小学教师资格证结构化面试真题1
- 20XX年县干部培训工作目标
- 硬笔试听课
- 网络编程
- 传输
- 实验
- 文件
- 报告
- 最新精品高考历史一轮复习高频考点专攻练十近代中国的新方向与近代化的曲折发展 - - 1919 - 1949年人民版
- 医用冷疗项目可行性研究报告 - 图文
- C语言调试时出现的错误及调整方法
- 2015年度浙江龙游广源木业有限公司销售收入与资产数据报告 - 图文
- 数量化选股策略之十一:分析师预测因子分析
- 食品质量与卫生安全管理手册
- 浅谈股骨干骨折中医诊断
- 单元整体教学设计:为学生“量身定制”
- 软件分析设计课程设计 - 患者监护系统 - 实验报告
- 1-4m框架涵基坑开挖安全专项施工方案0
- 财务分析案例集1(实用)
- 2014年物流师考试该注意哪些每日一讲(8月19日)
- 数学人教版七年级上册〈有理数大小的比较〉
- 保安岗位职责制度
- 浅探初中化学原创习题的命制 - 7
- 操作系统课程设计报告—PV操作
- 论古代书画的品评标准(jf)
- 2018全球与中国市场意大利面酱深度研究报告(目录) - 图文
- 电子电工类综合理论第一次月考试卷
- 省档案局关于印发《湖北省国家综合档案馆业务建设规范》的通知