ImageVerifierCode 换一换
格式:DOCX , 页数:18 ,大小:2.04MB ,
资源ID:7418151      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/7418151.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(杭州电子科技大学 研究生 嵌入式大作业.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

杭州电子科技大学 研究生 嵌入式大作业.docx

1、杭州电子科技大学 研究生 嵌入式大作业 嵌入式系统及应用基于TCP协议的文件传输的应用设计院系: 电子信息学院 姓名: 学号: 日期: 2016年1月1日 摘要:本文研究了网络环境下基于 TCP 的文件传输的方法,在Linux环境下运用套接字和TCP协议实现了文件的传输,从客户端向已知IP地址的服务器端发送文件,每次传输为1Kbyte且传输过程中发送端和接收端需要通过相互协作来控制数据的传输,而不能简单地利用循环。关键词:TCP协议;Linux;文件传输1、引言TCP/IP(Transmission Control Protocol/Internet Protocol) 即传输控制协议/网间协

2、议,是一个工业标准的协议集,它是为广域网(WAN)设计的。它是由ARPANET网的研究机构发展起来的。有时我们将TCP/IP描述为互联网协议集InternetProtocolSuite,TCP和IP是其中的两个协议(后面将会介绍)。由于TCP和IP是大家熟悉的协议,以至于用TCP/IP或IP/TCP这个词代替了整个协议集。这尽管有点奇怪,但没有必要去争论这个习惯。例如,有时我们讨论NFS是基于TCP/IP时,尽管它根本没用到TCP(只用到IP和另一种交互式协议UDP,而不是TCP)。TCP/IP的标准在一系列称为RFC的文档中公布。文档由技术专家、特别工作组、或RFC编辑修订。公布一个文档时,

3、该文档被赋予一个RFC编号,如RFC959(FTP的说明文档)、RFC793(TCP的说明文档)、RFC791(IP的说明文档)等。最初的RFC一直保留而从来不会被更新,如果修改了该文档,则该文档又以一个新号码公布。因此,重要的是要确认你拥有了关于某个专题的最新RFC文档。通常在RFC的开头部分,有相关RFC的更新(update)、修改(errata)、作废(obsolete)信息,提示读者信息的时效性2、TCP简介及连接原理 TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。本文主要时结合

4、TCP传输文件的高效性,通过套接字,实现在linux系统下传输文件,其中包括服务端和客户端,做到实时显示传输进度、传输文件大小等功能。 TCP/IP定义了电子设备如何连入因特网,以及数据如何在它们之间传输的标准。协议采用了4层的层级结构,每一层都呼叫它的下一层所提供的协议来完成自己的需求。通俗而言:TCP负责发现传输的问题,一有问题就发出信号,要求重新传输,直到所有数据安全正确地传输到目的地。而IP是给因特网的每一台联网设备规定一个地址。 TCP的上一层是应用层,TCP向应用层提供服务,TCP数据传输实现了从一个应用程序到另一个应用程序的数据传递。应用程序通过编程调用TCP并使用TCP服务,提

5、供需要准备发送的数据,用来区分接收数据应用的目的地址和端口号。通常应用程序通过打开一个socket来使用TCP服务,TCP管理到其他socket的数据传递。 TCP对话通过3次握手来初始化,是数据段的发送和接收同步,确定其一次可接收的数据量,并建立虚连接。下面描述了3次握手的简单过程。1. A-B:主机A向主机B发送连接请求,报文中包括SYN控制标志,但没有数据。主机B收到SYN后,将其状态转化为SYN-RECEIVED。2. B-A:主机B向主机A发送建立连接请求,并带有对主机A的SYN确认。主机A收到该消息后,将其状态变为ESTABLISHED。3. A-B:主机B收到主机A发来的确认消息

6、后,也将其自身状态转变为ESTABLISHED。至此,一条TCP连接建立完毕,接下来就可在两台主机间传输数据了。3、socket简介Socket接口是TCP/IP网络的API,其定义了很多函数和例程,程序员可以用他们来开发TCP/IP网络上的应用程序。要掌握Internet上的TCP/IP网络编程,必须理解socket接口。在linux系统中,所有的I/O操作都是通过读写文件的描述符而产生的,socket是一种特殊的文件描述符。当得到一个socket之后,就可以用send()和recv()系统调用与其他程序通信。当然也可以使用read()和write()等系统操作调用而与其他程序进行通信。4、

7、典型TCP通信过程5、服务端与客户端简介服务端:主要功能是监听客户端的连接,在有客户端请求连接的时候接受或者拒绝连接。接收客户端的连接后,接收客户端发来的数据,接收的数据分为指令和数据,根据对应的指令执行不同的操作,比如接收连接请求或者拒绝请求、完成传输、断开连接等。服务端程序先建立一个socket,然后绑定端口号、地址等,然后开始监听。当有客户端连接时,同意连接请求,并接收客户端发来的数据,然后根据数据执行相对应的动作,接收到文件名后把文件名保存在文件名缓存中,并以此文件名建立文件。服务端接收到的文件都保存在./recv文件夹中,如果当前目录没有此文件夹,程序会新建一个recv文件夹。然后程

8、序会把接收到的数据写在该文件中,当收到完成指令后,服务端完成传输工作,并结束程序,如下图。客户端:负责发送文件到服务端。客户端程序由发送子程序、接收子程序和主程序组成。发送子程序负责连接服务端、发送数据;接收子程序负责连接服务端、接收数据。主程序负责整个程序的调度和控制,完成数据的发送和客户机的相关内容显示,如下图所示。6、程序部分*client.c* 学号:162040197 姓名:许超 程序内容:客户端程序*client.c*#include #include #include #include #include #include #include #include #include #i

9、nclude #include #include #include #define SERVPORT 2222#define BACKLOG 10#define MAX_CONNECTED_NO 10#define MAXDATASIZE 1024char server_ip20;void TCP_Send(char *buf,int len) int sockfd,sendbytes; struct hostent *host; struct sockaddr_in serv_addr; /获取服务器IP地址 if(host=(struct hostent *)gethostbyname(s

10、erver_ip)=NULL) perror(get host by name :); exit(1); /建立套接字 if(sockfd=socket(AF_INET,SOCK_STREAM,0)=-1) perror(socket error:); exit(1); serv_addr.sin_family=AF_INET; serv_addr.sin_port=htons(SERVPORT); /将服务器IP地址转换 if(inet_pton(AF_INET,server_ip,&serv_addr.sin_addr) = 0) printf(%sis not a valid IPadd

11、ressn,server_ip); exit(1); bzero(&(serv_addr.sin_zero),8); /连接服务器 if(connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(struct sockaddr)=-1) perror(connect error:); exit(1); /发送数据 if(sendbytes=send(sockfd,buf,len,0)!=len) perror(send error:); exit(1); close(sockfd);int TCP_Recv(char *buf,int len) i

12、nt sockfd,sendbytes,recvbytes; struct hostent *host; struct sockaddr_in serv_addr; /获取服务器IP地址 if(host=(struct hostent *)gethostbyname(server_ip)=NULL) perror(get host by name :); exit(1); /建立套接字 if(sockfd=socket(AF_INET,SOCK_STREAM,0)=-1) perror(socket error:); exit(1); serv_addr.sin_family=AF_INET;

13、 serv_addr.sin_port=htons(SERVPORT); /将服务器IP地址转换 if(inet_pton(AF_INET,server_ip,&serv_addr.sin_addr) = 0) printf(%sis not a valid IPaddressn,server_ip); exit(1); bzero(&(serv_addr.sin_zero),8); /请求连接服务器 if(connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(struct sockaddr)=-1) perror(connect error:

14、); exit(1); /接收数据 if(recvbytes=recv(sockfd,buf,len,0)=-1) perror(recv error:); exit(1); close(sockfd); return recvbytes;int main(int argc,char *argv) char bufMAXDATASIZE; char name40; int fd,size,recvbytes; unsigned int filelen; strcpy(name,argv1); /从命令第二个字符串中获取传输文件的名字 strcpy(server_ip,argv2); /从命令第

15、三个字符串中获取服务器IP地址 if(argc1) fprintf(stderr,Please enter the servers host name!n ); exit(1); printf(The Servers IP address is:%snPORT is:%dn,server_ip,SERVPORT); TCP_Send(Start,6); printf(请求已发送,等待许可n); TCP_Send(name,sizeof(name); recvbytes=TCP_Recv(buf,MAXDATASIZE); if(strcmp(buf,Yes)=0) printf(请求接收,开始

16、传输!n); if(fd=open(argv1,O_RDONLY,0666)0) perror(open file error); exit(1); printf(文件名:%sn,argv1); /计算所传送文件的大小 filelen=lseek(fd,0,SEEK_END); if(filelen1024) printf(文件大小:%d Bytes!n,filelen); else if(filelen r); else if(size=0) TCP_Send(Over,5); /客户端发送“over”作为发送结束标志 printf(n发送文件成功!n); close(fd); exit(0

17、); else printf(服务器拒绝请求!n); exit(0);*server.c* 学号:162040197 姓名:许超 程序内容:服务端程序*server.c*#include #include #include #include #include #include #include #include #include #include #include #include #include #define SERVPORT 2222#define BACKLOG 10#define MAX_CONNECTED_NO 10#define MAXDATASIZE 1024 /定义每次发送

18、的长度为1k struct sockaddr_in server_sockaddr,client_sockaddr; int sin_size,recvbytes,fd,size,flag=1; int sockfd,client_fd; char bufMAXDATASIZE;/接收数据 int TCP_Recv(char *buf) int re; if(client_fd=accept(sockfd,(struct sockaddr*)&client_sockaddr,&sin_size)=-1) perror(accept error); exit(1); if(re=recv(cli

19、ent_fd,buf,MAXDATASIZE,0)=-1) perror(recv error); exit(1); close(client_fd); return re;/发送数据void TCP_Send(char *buf,int len) if(client_fd=accept(sockfd,(struct sockaddr*)&client_sockaddr,&sin_size)=-1) perror(accept error); exit(1); if(send(client_fd,buf,len,0)=-1) perror(send error); exit(1); close

20、(client_fd);int main(void) if(sockfd=socket(AF_INET,SOCK_STREAM,0)=-1) perror(socket error); exit(1); printf(socket success!nsockfd=%dn,sockfd); server_sockaddr.sin_family=AF_INET; server_sockaddr.sin_port=htons(SERVPORT); server_sockaddr.sin_addr.s_addr=INADDR_ANY; bzero(&(server_sockaddr.sin_zero)

21、,8); /端口与IP绑定 if(bind(sockfd,(struct sockaddr*)&server_sockaddr,sizeof(struct sockaddr)=-1) perror(bind error); exit(1); printf(bind success!n); /监听 if(listen(sockfd,BACKLOG)=-1) perror(listen error); exit(1); printf(listening.n); sin_size=sizeof(struct sockaddr_in); while(1) recvbytes=TCP_Recv(buf)

22、; if(strcmp(buf,Over)=0) /收到“Over”则结束接收 close(fd); close(sockfd); printf(文件接收成功!n); exit(0); else if(strcmp(buf,Start)=0) /收到“Start”则开始接收 char name40; char path60=./recv/; char yn; recvbytes=TCP_Recv(name); printf(是否愿意接收文件-%s(Y/N)?请输入:n,name); scanf(%c,&yn); if(yn=y)|(yn=Y) DIR * mydir = NULL; struc

23、t dirent * myitem = NULL; TCP_Send(Yes,4); /发送Yes表明同意客户端发送数据 if(mydir=opendir(path)=NULL) if(mkdir(path, 0777) 0) printf(mkdir error!n); exit(1); if(fd=open(strcat(path,name),O_RDWR|O_CREAT|O_TRUNC,00700)=-1) perror(open file error); exit(1); printf(成功写入文件!n); else if(yn=N)|(yn=n) printf(拒绝接收文件!继续监听!n); TCP_Send(No,3); /发送No表明拒绝客户端发送数据 bzero(buf,MAXDATASIZE); else write(fd,buf,recvbytes); close(fd); close(sockfd); exit(0);7、程序运行截图

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1