基于TCP的文件传输程序

《计算机网络系统实践》报告设计题目:网络文件传输学生姓名:郑波学号:44专业班级:计算机科学与技术13-2班2015年12月一、设计要求1、实现单线程文件传输功能2、在以上的基础上,掌握多线程技术,在文件网络传输时,可选择单线程或多线程3、加入异常控制机制,增强程序的鲁棒性(Robust)4、了解如何提高套接字传输的速率,以及如何加强传输的稳定性二、开发环境与工具Windows7下Microsoft Visual Stuio三、设计原理1、网络传输协议TCP/IP协议栈中的两个协议:TCP(Transmission Control Protocol):传输控制协议UDP(User Datagrm Protocal):用户数据报协议TCP是面向连接的通信协议,TCP提供两台计算机之间的可靠无错的数据传输。

应用程序利用TCP进行通信时,源和目标之间会建立一个虚拟连接。

该连接一旦建立,两台计算机之间就可以把数据当做一个双向字节流进行交换。

UDP是无连接的通信协议,UDP不保证可靠数据的传输,但能够向若干个目标发送数据,接受发自若干个源的数据。

就是说,如果一个主机向另外一台主机发送数据,这个数据就会立即发出,而不管另外一台主机是否已准备接收数据。

如果另外一台主机接收到了数据,它不会确认收到与否。

本次工程目的是传输文件,显然需要用TCP建立连接,而TCP连接需要“三次握手”。

2、三次握手三次握手具体过程:1、客户端主动与服务器联系,TCP首部控制位中的SYN设置为1,发送带有SYN的TCP段,并把初始序号告诉对方2、服务端收到带有SYN的报文,记录客户端的初始序号,选择自己的初始序号,设置控制位中的SYN和ACK。

因为SYN占用一个序号,所以确认序号设置为客户端的初始序号加1,对客户端的SYN进行确认3、服务端的报文到达客户端,客户端设置ACK控制位,并把确认好设为服务器的初始序号加1,以确认服务器的SYN报文段,这个报文只是确认消息,告诉服务器已经成功建立了连接四、系统功能描述及软件模块划分1、系统功能描述软件实现了点对点的文件传输。

传输前的接收提醒以及传输过程中的控制。

2、软件模块划分本程序可以划分成以上三个模块:传输控制模块,文件传输模块和服务连接模块。

其中:服务连接模块用来建立客户端到服务器的连接文件传输模块主要用两个线程:_SendThread和_ListenThread来完成,实现发送和接收文件的功能。

传输控制模块主要通过封装好的可串行化信息类CMessage互相传递两端的文件操作消息,响应“暂停传输”,“关闭连接”等功能五、设计步骤1、服务连接模块先要建立起客户端与服务器之间的连接,大致过程如下:①服务器启动:if(m_nServerType == SERVER){|*.*||",this);"另存为");strcpyif()==IDOK){if(m_bIsWait==FALSE){MessageBox(_T("对方已经取消文件发送"), _T("警告"), MB_ICONEXCLAMATION);return ;}m_bIsClient=FALSE;m_strPath=();客园博客,2012..计算机网络教程.高等教育出版社,2008. 深入详解. 户端服务器的消息控制。

②客户端服务器建立连接的过程 答:使用MFC 的CSocket 类简化接字,Listen()连接,服务器OnAccept 响应,并使用另外创建的套接字开始与客户端通信。

③程序的鲁棒性怎么样答:程序在创建套接字,连接服务器等操作时用了比较多的错误检测与提示,比如在套接字创建过程:对Create()的返回值进行分析,如果是0则代表创建失败,立即调用GetLastError()分析错误原因,并使用MessageBox 弹出提醒用户。

另外也使用了TRY …CATCH 块,增强程序的错误检测和恢复能力。

十一、设计体会1、之前写的程序大多都是“单机”的,这次工程的实践让我更加深入地了解了互联网程序的编写,认识了Socket 套接字的使用。

2、通过编写程序,在应用层面理解了TCP 的“三次握手”,深切体会到了基于TCP 连接的传输稳定性。

3、在设计时遇到了阻塞和非阻塞的选择,好在工程实现的时候,由于微软对Win_Sock 的封装,结合CSocket 、CSocketFile 、CArchive 三个类的使用,很好地简化了两端的通信问题,从而可以放心地把传输数据作为阻塞方式放到新开的线程中。

4、在工程初步完成的时候,把程序放到两台不处于一个局域网内的机子上,发现不能连接。

通过课本的翻阅和网上资料的查询,了解了NAT 以及NAT穿越技术,知道了许多基于互联网的技术都需要用到“NAT穿孔”。

5、文件传输涉及到了很多的异常处理,在之前编写的大部分程序要么没有异常处理,要么单纯地使用if else解决,在本次工程中用到了一些TRY CATCH 块,体会到了异常处理机制的重要性。

路由器配置实验一、实验目的1. 认识路由器的端口、型号2.掌握路由器的路由配置3. 理解网络互联的基本原理二、实验环境与设备本实验在 PC 机上利用模拟软件 Packet Tracer V6 进行操作。

三、实验内容1. 路由器接口的配置2. 静态路由配置3. 默认路由配置4. 动态路由配置本次实验的主要任务是了解路由器的基本设置,和网络之间的连接关系。

通过这次的实验很好的掌握了各个网段之间的,各个路由器下的 pc 的连接情况。

通过对静态,默认,动态路由配置,使得各个路由器下的 PC 相互通信。

四、实验步骤1、路由器接口的配置创建拓扑结构图:(1)为主机 PC0,PC1,PC2 配置 IP 地址、子网掩码和默认网关。

配置情况如下:IP地址和子网掩码的配置:(2)为路由器的各个接口分配 IP 地址和子网掩码,交换机不用配置。

配置方法入下:WAN口配置:(3)查看路由器的路由表使用命令:show ip route 显示路由表中的路由信息。

保存此时路由器显示的路由信息,以便与后面的实验结果进行比较。

(C 表示直连路由)Router0 的路由表:Router1的路由表Router2的路由表(4)测试主机之间的连通性PC0 与 PC2 的连通性:可以看到PC0 ping不到PC2,可见PC0是不知道PC2的网段的PC1与PC2的连通性:根据网关发回的消息,同样PC1是ping不到PC2的2. 配置静态路由(1)在 Router0 中添加一条到网络的静态路由,命令如下:Router(config)#ip route (2)再去查看 Router0 路由表,与步骤(2)中的路由表进行对比,观察路由表的变化情况。

可以看到,路由器0多了一条S的路由信息,之后有目的为该IP的包到达路由器,路由器就能根据路由表做出路由。

(3)在 Router2 中添加一条到网络的路由后,路由表如下:Router(config)#ip route 同样,路由器1也增加了一条路由信息(4)测试 PC0 与 PC2 的连通性PC0 与 PC2 的连通性如下图:可以看到,添加静态路由后PC0与PC2接通(5)在 Router1 和 Router2 中各添加一条静态路由,以实现 PC1 与 PC2 的互通。

路由器1增加静态路由:路由器2增加静态路由:根据之前的实验,现在PC2和PC1应该能互相ping通了。

P1 与 P2 的连通性:由于来回经过两次路由器,TTL(128)-2=126(6)测试 PC0 与 PC1 的连通性可以看到,PC0 ping不到PC1. 查看 Router0 的路由表可知,其中不存在到达 PC1 所在网络()的路由,查看Router2 的路由表可知,其中不存在到达 PC0 所在网络()的路由,因此,PC0与 PC1 的连通性为不通。

(7)分别在 Router0 和 Router1 中添加静态路由,以实现 PC0 与 PC1 的互通。

PC0增加到PC1的路由:PC1增加到PC0的路由:此时PC0和PC1的连通性:可以看到,PC0和PC1终于能ping通了,可见若是配置静态路由,一边的路由器不能只配置与其相连的路由器的静态路由,若还想发至其他路由器所在的网络,同时也要配置到那个网络的静态路由。

3. 设置默认路由(1)首先删除 Router0 中到达 PC1 和 PC2 所在网络的静态路由:使用show ip route命令查看可知,删除已成功(2)在 Router0 中添加一条默认路由:(3)再测试 PC0 与 PC1,PC2 的连通性:可以看到,PC0在设置默认路由后,都能ping到PC2和PC1,原因是当PC0由数据包发送至PC1或者PC2,可是到达路由器0的时候,路由器0的路由表中没有相应的路由信息,这时候,默认路由就成为了一个“救命稻草”,路由器0会将所有的不匹配数据包都通过这个路由信息发送出去。

因为默认路由匹配的是路由器2,故路由器2自然能收到,而此时路由器2有路由器1的静态路由信息,所以PC1也就能收到了4. 动态路由协议 RIP 的配置(1)在 Router0 上配置 RIP 协议(2)在 Router1,Router2 上配置 RIP 协议Router2:Router1:(3)查看三个路由器的路由表,可看到各路由器学到的网段。

下图是运行 RIP协议后路由器中的路由信息:(R 为 RIP 动态路由)Router0:Router1:Router2:5)测试各主机间的连通性。

PC0 和 PC1 的连通性以及PC0 和 PC2 的连通性:PC1 和 PC2 的连通性五、实验总结通过思科的这款仿真软件,我切身地体会到了什么是最最基础的组网。

①通过简单地“拖拉”路由器、交换机、PC终端,还有这些原件之间的连接线,让我体会到了各种不同的网络部件所处的地位以及它们各自所起的作用②思科的这款软件非常强大,不仅有命令行,还有可视化的操作面板,在用两种方式配置路由器的过程中,让我真切地感受到了路由器就是一台实实在在的微型机,只是功能比较单一。

③在对路由器IP地址、子网掩码,PC网关地址配置的过程中,理解了网络互联的原理就在于“通过路由器的路由信息表找到对方的地址”。

④本实验涉及到了静态路由的配置、默认路由的配置以及RIP动态路由协议的配置,在分别使用这三种方法连接时,思考了三种方式的区别与联系,进一步理解了网与网之间的连接。

合集下载

Python实现TCP文件传输

Python实现TCP文件传输

Python实现TCP文件传输TCP (Transmission Control Protocol) 是一种可靠的传输协议,常用于在网络上传输数据。

通过使用Python的内置socket库,可以轻松实现TCP文件传输。

在TCP文件传输过程中,需要一个服务器和一个客户端。

服务器负责接收文件,而客户端负责发送文件。

下面是一个简单的Python程序,实现了TCP文件传输的服务器端:```pythonimport socket#服务器IP地址和端口号SERVER_HOST='127.0.0.1'#一次接收的最大数据量BUFFER_SIZE=4096# 创建一个socket对象server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)# 将服务器socket对象绑定到指定的IP地址和端口号上server_socket.bind((SERVER_HOST, SERVER_PORT))# 使服务器socket对象监听传入的连接server_socket.listen(5)print(f"服务器正在监听地址 {SERVER_HOST}:{SERVER_PORT}...") #接受客户端连接client_socket, address = server_socket.acceptprint(f"来自地址 {address} 的连接已建立!")#接收客户端发送的文件名file_name = client_socket.recv(BUFFER_SIZE).decode#打开文件,准备写入file = open(file_name, 'wb')#开始接收文件数据并写入文件while True:data = client_socket.recv(BUFFER_SIZE)if not data:breakfile.write(data)# 关闭文件和socket连接file.closeclient_socket.closeserver_socket.closeprint("文件接收完毕!")```在以上代码中,我们首先创建了一个服务器socket对象,并将其绑定到指定的IP地址和端口号上。

在Linux下基于TCP协议的文件传输程序汇总

在Linux下基于TCP协议的文件传输程序汇总

Linux下基于TCP/IP协议的文件传输程序【设计目的】通过Linux C编程,设计一个基于TCP/IP的文件传输系统,实现网络文件的收发【设计环境】Ubuntu 12.04【设计方案】(1)文件读写任意文件都可以二进制的方式进行读写,为了实现任意文件类型的传输,在读写文件的过程中,必须采用二进制的读写方式。

(2)传输协议为了保证数据的正确性,文件传输需要采用一种可靠的传输协议。

UDP协议实现比较简单,但UDP面向无连接,传输过程中,会出现丢包的情况,导致数据发送失败。

故采用面向连接的TCP/IP协议,防止传输过程中的数据丢失的情况。

(3)大文件的传输对于比较大的文件,应该进行分包操作,以防止占用过多的内存,导致文件发送失败。

【设计流程】如图1所示,服务器程序作为文件的发送方。

首先,服务器端输入要发送的文件。

然后,创建一个流式套接字(SOCK_STREAM),进行绑定。

绑定成功后,执行监听,当有客户发送连接请求,执行Accept(),接收来自客户端的请求。

连接建立后,首先服务器向客服端发送的文件的文件名及扩展名等信息。

信息发送完毕,服务器方将待发送的数据读入缓冲区,通过套接字将数据发送出去。

发送完成后退出,并显示发送完成的信息。

图1 服务器流程图如图2所示,客户端程序完成文件的接收操作。

首先,创建一个流式套接字。

套接字创建成功后,对该套接字进行绑定。

绑定成功后,向服务器方发送连接请求。

连接成功后,首先,接收服务器发送的文件信息。

接收成功后,开始数据的接收。

文件接收完毕,显示文件已接收完成。

图2 客户端流程图【设计测试】了验证设计的正确性,在Ubuntu 12.04系统上对可执行文件进行了回环测试。

步骤如下:(1)测试文件a.txt及服务器端文件源fileserver.c和可执行文件fileserver(2)客户端源文件及可执行文件(3)执行服务器端文件fileserver并输入要传输的文件a.txt,等待客户端连接(4)执行客户端文件fileclient,如果不输入IP地址将显示提示(5)执行客户端文件后,输入完整命令,文件传输文件完成(6)看到服务器端也显示文件传输完成服务器源码:#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <string.h>#include <sys/types.h>#include <sys/stat.h>#include <sys/socket.h>#include <netinet/in.h>#define PORT 6000#define LISTENQ 20#define BUFFSIZE 4096#define FILE_NAME_MAX_SIZE 512int main(int argc, char **argv[]){//输入文件名称char filename[FILE_NAME_MAX_SIZE];bzero(filename,FILE_NAME_MAX_SIZE);printf("Please input the file name you wana to send:");scanf("%s",&filename);getchar();//设置一个socket地址结构int sockfd,connfd;struct sockaddr_in svraddr,clientaddr;bzero(&svraddr,sizeof(svraddr));//把一段内存区的内容全部设置为0 svraddr.sin_family=AF_INET;svraddr.sin_addr.s_addr=htonl(INADDR_ANY);svraddr.sin_port=htons(PORT);//创建用于internet的流协议(TCP)socketsockfd=socket(AF_INET,SOCK_STREAM,0);if(sockfd<0){perror("socket");exit(1);}//把socket和socket地址结构绑定if(bind(sockfd,(struct sockaddr*)&svraddr,sizeof(svraddr))<0){perror("bind");exit(1);}//监听if(listen(sockfd,LISTENQ)<0){perror("listen");exit(1);}while(1)//服务器端一直运行{socklen_t length=sizeof(clientaddr);//等待请求connfd=accept(sockfd,(struct sockaddr*)&clientaddr,&length);if(connfd<0){perror("connect");exit(1);}//发送文件信息char buff[BUFFSIZE];int count;bzero(buff,BUFFSIZE);strncpy(buff,filename,strlen(filename)>FILE_NAME_MAX_SIZE?FILE_NAME_MA X_SIZE:strlen(filename));count=send(connfd,buff,BUFFSIZE,0);if(count<0){perror("Send file imformation");exit(1);}//读取文件并发送文件FILE *fd=fopen(filename,"rb");if(fd==NULL){printf("File :%s not found!\n",filename);}else{bzero(buff,BUFFSIZE);int file_block_length=0;while((file_block_length=fread(buff,sizeof(char),BUFFSIZE,fd))>0){printf("file_block_length:%d\n",file_block_length);if(send(connfd,buff,file_block_length,0)<0){perror("Send");exit(1);}bzero(buff,BUFFSIZE);}fclose(fd);printf("Transfer file finished !\n");}close(connfd);}close(sockfd);//关闭socketreturn 0;}客户端源码:#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <string.h>#include <sys/types.h>#include <sys/stat.h>#include <sys/socket.h>#include <netinet/in.h>#define PORT 6000#define LISTENQ 20#define BUFFSIZE 4096#define FILE_NAME_MAX_SIZE 512int main(int argc, char **argv[]){int clientfd;if(argc!=2)//判断参数是否完整{fprintf(stderr,"Usage:./fileclient <IP_Address>\n");exit(1);}struct sockaddr_in clientaddr;bzero(&clientaddr,sizeof(clientaddr));clientaddr.sin_family=AF_INET;clientaddr.sin_addr.s_addr=htons(INADDR_ANY);//INADDR_ANY表示自动获取本机地址clientaddr.sin_port=htons(0); //0表示让系统自动分配一个空闲端口//创建用于internet的流协议(TCP)socket,用clientfd代表客户机socketclientfd=socket(AF_INET,SOCK_STREAM,0);if(clientfd<0){perror("socket");exit(1);}//把客户机的socket和客户机的socket地址结构联系起来if(bind(clientfd,(struct sockaddr*)&clientaddr,sizeof(clientaddr))<0){perror("bind");exit(1);}//设置一个socket地址结构体struct sockaddr_in svraddr;bzero(&svraddr,sizeof(svraddr));if(inet_aton(argv[1],&svraddr.sin_addr)==0)//IP地址来自程序的参数{perror("inet_aton");exit(1);}svraddr.sin_family=AF_INET;svraddr.sin_port=htons(PORT);socklen_t svraddrlen=sizeof(svraddr);//向服务器发起连接,连接成功后client_socket代表了客户机和服务器的一个socket连接if(connect(clientfd,(struct sockaddr*)&svraddr,svraddrlen)<0){perror("connect");exit(1);}//接收文件信息char buff[BUFFSIZE];char filename[FILE_NAME_MAX_SIZE];bzero(filename, FILE_NAME_MAX_SIZE);int count;bzero(buff,BUFFSIZE);count=recv(clientfd,buff,BUFFSIZE,0);if(count<0){perror("recv");exit(1);}strncpy(filename,buff,strlen(buff)>FILE_NAME_MAX_SIZE?FILE_NAME_MAX_SI ZE:strlen(buff));printf("Preparing recv file : %s---from---%s \n",filename,argv[1]);//接收文件FILE *fd=fopen(filename,"wb+");精选文档if(NULL==fd){perror("open");exit(1);}bzero(buff,BUFFSIZE);int length=0;while(length=recv(clientfd,buff,BUFFSIZE,0)){if(length<0){perror("recv");exit(1);}int writelen=fwrite(buff,sizeof(char),length,fd);if(writelen<length){perror("write");exit(1);}bzero(buff,BUFFSIZE);}printf("Receieved file:%s from %s finished!\n",filename,argv[1]);fclose(fd);close(clientfd); //关闭socketreturn 0;}可编辑。

VB6基于TCP协议实现局域网内文件夹传送

VB6基于TCP协议实现局域网内文件夹传送

VB6基于TCP协议实现局域⽹内⽂件夹传送刚刚拿到这个需求时,为了实现⽅便(传送⽂件已经实现,传送⽂件夹采取压缩的话也只需传送⼀个⽂件),计划采取的实现⽅法是:调⽤压缩组件,将⽂件夹压缩成⼀个⽂件,传送到另⼀端;在接收时,解压缩此⽂件得到⽂件夹。

由此带来的问题是:没有⼀个免费的压缩⽂件夹的组件。

于是想到的策略是:⽤shell程序调⽤dos下的arj.exe压缩。

但是由于arj是dos⼯具,有⼀个⽂件名的问题:⽂件名长度超过8位(中⽂4位),就会⾃动截断。

针对这个问题:⼜想了⼀种很笨的解决办法:将传送前,遍历⽂件夹,记录所有⽂件和⽂件夹名,传送时附带传过去,接收端接收完⽂件,解压缩后,修改⽂件名。

经过这么⼀折腾,由⼀个问题带来很多的头痛的问题。

(陷⼊了怪圈)。

后来经过仔细考虑,觉得⽤上述⽅法传送⽂件夹,有很多的隐患。

⼀:如果⽂件夹很⼤或⽂件很多,发送前的压缩操作需要很长时间,⽤户可操作性太差;⼆:由于要压缩⽂件夹,就需要保存,删除临时⽂件,如果处理不得当,会错删⽂件;三:⽤arj需要修改⽂件和⽂件夹名字,改名算法如果不健壮同样是⼀个隐患。

综合考虑了以后,决定修改传送算法。

基本思路是:既然传送⼀个⽂件已经实现,传送⽂件夹的话,⽆⾮是在⼀个连接过程多进⾏⼏次传送⽂件的过程。

详细⽅法描述:发送⽂件夹之前,⾸先遍历⽂件夹,保存每个⼦⽂件夹和⽂件信息(包括⽂件相对于选中的⽂件夹的路径,⽂件⼤⼩,⽂件名);传送之前,先发送传送请求,附带待传送⽂件夹的总体信息(⽂件夹名和⽂件夹总⽂件⼤⼩),接收端收到请求信息后,保存这些信息,选择保存路径,并发送确认标志符。

发送端收到确认标志符,⾸先传送单个⽂件的信息(单个⽂件的⼤⼩,⽂件名);接收端收到后,保存单个⽂件⼤⼩,在本地创建⽂件,发送请求发送⽂件内容标志符。

发送端收到后开始发送⽂件体;接收端开始接收⽂件体,当保存单个⽂件⼤⼩和接收到的数据相等时,请求发送第⼆个⽂件的⽂件信息,依次下去。

计算机网络技术第四版课程设计

计算机网络技术第四版课程设计

计算机网络技术第四版课程设计一、设计题目本次计算机网络技术课程设计的题目是“基于TCP协议的文件传输程序实现”。

二、设计目的计算机网络技术是网络工程专业的核心基础课程之一,课程涉及到计算机网络领域的各个方向,例如网络协议、网络体系结构、路由协议、网络安全等。

通过本次课程设计,旨在让学生深入了解TCP协议的应用,掌握TCP协议的实现过程和技术要点,提高学生对计算机网络技术的理解和应用能力。

三、设计要求实现一个基于TCP协议的文件传输程序,要求如下:1.接收方和发送方分别处于不同的机器上。

2.文件传输过程通过TCP协议完成。

3.实现断点续传功能。

4.通过命令行界面输入传输文件的路径和传输模式(上传/下载)等必要信息。

四、设计流程1. 建立网络连接建立TCP连接是实现文件传输的第一步,需要使用Python的socket库实现。

按照TCP三次握手的规则,建立与对方的链接。

2. 传输文件使用Python的文件读取方式,将要传输的文件读取至内存中。

使用TCP协议,将文件分成多个数据块,依次传输至对方机器。

3. 断点续传在传输文件的过程中,可能会出现意外断开连接的情况。

为了实现断点续传功能,传输过程中需要保存已经传输的文件块,当重新建立连接后继续传输。

4. 命令行控制实现一个命令行界面,通过命令行输入文件传输的相关信息,例如待传输文件的路径、传输模式(上传/下载)等信息。

通过分析用户的操作,执行相应的文件传输操作,并在命令行上显示传输过程的相关信息。

五、技术要点1.Python Socket编程2.TCP协议3.文件读取和写入4.断点续传5.命令行控制六、设计结论通过本次基于TCP协议的文件传输程序实现的计算机网络技术课程设计,我们深入了解了TCP协议的应用过程,掌握了TCP协议的实现技术要点,并实现了文件传输过程中常见的断点续传功能和命令行控制。

这些技术点均是计算机网络技术课程中的重点内容,对我们深入学习和理解计算机网络技术的概念和应用具有重要的帮助和启示。

基于Tcp的文件传输

基于Tcp的文件传输

Linux下基于Tcp的文件传输一.服务器:#include <netinet/in.h>#include <sys/types.h>#include <sys/socket.h>#include <stdio.h>#include <stdlib.h>#include <time.h>#include <string.h>#define SERVER_PORT 6666#define LISTEN_QUEUE 20#define BUFFER_SIZE 1024int main(int argc,char **argv){struct sockaddr_in server_addr;bzero(&server_addr,sizeof(server_addr));//全部置零//设置地址相关的属性server_addr.sin_family=AF_INET;server_addr.sin_addr.s_addr=htons(INADDR_ANY);server_addr.sin_port=htons(SERVER_PORT);//创建套接字int server_socket=socket(AF_INET,SOCK_STREAM,0);if(server_socket<0){printf("socket create error\n");exit(1);}//绑定端口if(bind(server_socket,(struct sockaddr*)&server_addr,sizeof(server_addr))){printf("bind error\n");exit(1);}//服务器端监听if(listen(server_socket,LISTEN_QUEUE)){printf("Server listen error\n");exit(1);}//服务器端一直运行while(1){pid_t pid;struct sockaddr_in client_addr;socklen_t length=sizeof(client_addr);//accept返回一个新的套接字与客户端进行通信int new_server_socket=accept(server_socket,(structsockaddr*)&client_addr,&length);//1*begin********************************************************* *********************if(new_server_socket==-1){printf("accept error\n");continue;}else{printf("客户端%s连接成功\n",inet_ntoa(client_addr.sin_addr));pid=fork();//3*begin**运行子进程************************************************************* if(pid==0){int data_len,flag=0;char buffer[BUFFER_SIZE];// 定义文件流FILE *stream;bzero(buffer,BUFFER_SIZE);strcpy(buffer,"请输入要传输的文件的完整路径:");strcat(buffer,"\n");send(new_server_socket,buffer,BUFFER_SIZE,0);bzero(buffer,BUFFER_SIZE);//2*begin**服务器接受数据*********************************************if((stream=fopen("data","w"))==NULL){printf("file open error\n");exit(1);}else{bzero(buffer,BUFFER_SIZE);}// printf("正在接收来自%s的文件....\n",inet_ntoa(client_addr.sin_addr));//先将数据接受到缓冲区buffer中,再写入到新建的文件中while(data_len=recv(new_server_socket,buffer,BUFFER_SIZE,0)){flag++;if(flag==1){printf("正在接收来自%s的文件....\n",inet_ntoa(client_addr.sin_addr));}if(data_len<0){printf("接收错误\n");exit(1);}//向文件中写入数据int write_len=fwrite(buffer,sizeof(char),data_len,stream);if(write_len>data_len){printf("file write failed\n");exit(1);}bzero(buffer,BUFFER_SIZE);}if(flag>0)printf("%s的文件传送完毕\n",inet_ntoa(client_addr.sin_addr));if(flag==0)printf("%s的文件传输失败\n",inet_ntoa(client_addr.sin_addr));//2*end**服务器接受数据****************************************************// rename("data",inet_ntoa(client_addr.sin_addr));fclose(stream);rename("data",inet_ntoa(client_addr.sin_addr));exit(1);}//3*end**运行子进程**********************************************************else{close(new_server_socket);}}//1*end********************************************************** ****************************close(new_server_socket);}return 0;}二.客户端:#include <netinet/in.h>#include <sys/types.h>#include <sys/socket.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <time.h>#include <arpa/inet.h>#define SERVER_PORT 6666#define BUFFER_SIZE 1024int main(int argc,char **argv){if(argc!=2){printf("参数错误,清输入两个参数\n");exit(1);}FILE *stream;struct sockaddr_in server_addr;bzero(&server_addr,sizeof(server_addr)); //把一段内存区的内容全部设置为0server_addr.sin_family = AF_INET; //internet协议族server_addr.sin_addr.s_addr = inet_addr(argv[1]);server_addr.sin_port = htons(SERVER_PORT);int sfd;sfd=socket(AF_INET,SOCK_STREAM,0);if(sfd<0){printf("socket error\n");exit(0);}if(connect(sfd,(struct sockaddr*)&server_addr,sizeof(server_addr)) < 0) {printf("Can Not Connect To %s\n",argv[1]);exit(1);}char buffer[BUFFER_SIZE];bzero(buffer,BUFFER_SIZE);int length = recv(sfd,buffer,BUFFER_SIZE,0);if(length < 0){printf("Recieve Data From Server %s Failed!\n", argv[1]);exit(1);}printf("\n%s\n",buffer);bzero(buffer,BUFFER_SIZE);// fgets(buffer,1024,stdin);// char filename[100];gets(buffer);//打开文件流if((stream=fopen(buffer,"r"))==NULL){printf("the file was not opened\n");exit(1);}bzero(buffer,BUFFER_SIZE);printf("正在传输...\n");int len=0;//不断读取并发送数据while((len=fread(buffer,1,1024,stream))>0){// printf("len=%d\n",len);if(send(sfd,buffer,len,0)<0){printf("send file error\n");break;}bzero(buffer,BUFFER_SIZE);}if(fclose(stream)){printf("file close error\n");exit(1);}close(sfd);return 0;}。

简述tcp传输流程的过程

简述tcp传输流程的过程

简述tcp传输流程的过程下载温馨提示:该文档是我店铺精心编制而成,希望大家下载以后,能够帮助大家解决实际的问题。

文档下载后可定制随意修改,请根据实际需要进行相应的调整和使用,谢谢!并且,本店铺为大家提供各种各样类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,如想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by theeditor. I hope that after you download them,they can help yousolve practical problems. The document can be customized andmodified after downloading,please adjust and use it according toactual needs, thank you!In addition, our shop provides you with various types ofpractical materials,such as educational essays, diaryappreciation,sentence excerpts,ancient poems,classic articles,topic composition,work summary,word parsing,copy excerpts,other materials and so on,want to know different data formats andwriting methods,please pay attention!TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。

C#利用TCP实现文件传输

//服务器端程序using System.IO;using .Sockets;using ;namespace PictureServer{class Program{static void Main(string[] args){//在本机创建一个TcpListener,端口是8888,TcpListener listener = new TcpListener(IPAddress.Any, 8888);//开始监听,listener.Start();//循环,等待客户端连接while (true){const int bufferSize = 256;//接受客户端的连接,利用client保存连接的客户端TcpClient client = listener.AcceptTcpClient();//获取客户端的流streamNetworkStream clientStream = client.GetStream();byte[] buffer = new byte[bufferSize];int readBytes = 0;//将客户端流读入到buffer中readBytes = clientStream.Read(buffer, 0, bufferSize);//将从客户端流读取的数据保存到字符串request中string request = Encoding.ASCII.GetString(buffer).Substring(0, readBytes);//如果客户端的命令以LIST开头,if (request.StartsWith("LIST")){// LIST request - return list//利用类PictureHelper的函数GetFileListBytes,获取图片文件列表byte[] responseBuffer = PictureHelper.GetFileListBytes();//将服务器获取的图片文件列表写入到clientStream中clientStream.Write(responseBuffer, 0, responseBuffer.Length);}//如果客户端的请求命令以FILE开头,即获取单个图片文件else if (request.StartsWith("FILE")){// FILE request - return file// get the filename//获取请求的文件名字string[] requestMessage = request.Split(':');string filename = requestMessage[1];//利用File.ReadAllBytes函数将文件里面的文件filename读入到字节数组data中,byte[] data = File.ReadAllBytes(bine(@"C:Documents and SettingsAdministratorMy DocumentsMy Pictures", filename));// Send the picture to the client.//将data中的文件内容写入到客户端clientStream中,传回客户端clientStream.Write(data, 0, data.Length);}//关闭客户端流clientStream.Close();}}//静态类PictureHelper,public static class PictureHelper{//提供文件夹中的文件列表public static string[] GetFileList(){string[] files = Directory.GetFiles(@"C:Documents and SettingsAdministratorMy DocumentsMy Pictures");//去掉文件夹路径,只保留文件名// Remove the directory path from the filename.for (int i = 0; i < files.Length; i++){files[i] = Path.GetFileName(files[i]);}return files;}//将文件filename的内容读到字节数组中public static byte[] GetPictureBytes(string filename){FileInfo fileInfo = new FileInfo(filename);byte[] buffer = new byte[fileInfo.Length];using (FileStream stream = fileInfo.OpenRead()){stream.Read(buffer, 0, buffer.Length);}return buffer;}public static byte[] GetFileListBytes(){// LIST request - return liststring[] files = PictureHelper.GetFileList();StringBuilder responseMessage = new StringBuilder();foreach (string s in files){responseMessage.Append(s);responseMessage.Append(":");}byte[] responseBuffer = Encoding.ASCII.GetBytes(responseMessage.ToString());return responseBuffer;}}}}//////客户端程序using ;using .Sockets;using System.IO;private void buttonListPictures_Click(object sender, EventArgs e){const int bufferSize = 4096;// Connect to the server.//生成一个TcpClinetTcpClient client = new TcpClient();//生成服务器的IPHostEntry,因为我的服务器和客户端在同一台计算机上,所以此处用localhost,实际应用中,此处的localhost应用用服务器的ip地址代替,IPHostEntry host = Dns.GetHostEntry("localhost");// 连接到服务器的8888端口client.Connect(host.AddressList[0],8888);// Send a request to the server.//创建一个NetworkStream,NetworkStream clientStream = client.GetStream();//request是"LIST"string request = "LIST";//将request放入到字节数组requestBuffer中byte[] requestBuffer = Encoding.ASCII.GetBytes(request);//将请求写入到NetworkStream中,发送到服务器端clientStream.Write(requestBuffer, 0, requestBuffer.Length);//获取服务器端的回应// Read the response from the server.byte[] responseBuffer = new byte[bufferSize];//生成一个内存流memstreamMemoryStream memStream = new MemoryStream();int bytesRead = 0;do{//将网络流中的数据按256字节一组的顺序写入到memStream中bytesRead = clientStream.Read(responseBuffer, 0, bufferSize);memStream.Write(responseBuffer, 0, bytesRead);} while (bytesRead > 0);clientStream.Close();client.Close();//从内存流读取数据byte[] buffer = memStream.GetBuffer();string response = Encoding.ASCII.GetString(buffer);//将服务器返回的文件列表分解开,文件名保存到字符串数组fileName中string[] fileNames = response.Split(':');//将字符串数组填到ListBox中this.listFiles.DataSource = fileNames;}//获取单个图片文件,并显示之private void buttonGetPicture_Click(object sender, EventArgs e){const int bufferSize = 4096;TcpClient client = new TcpClient();IPHostEntry host = Dns.GetHostEntry("localhost");client.Connect(host.AddressList[0],8888);NetworkStream clientStream = client.GetStream();try{//生成请求,以FIlE:开头,后接在listbox中选择的文件名string request = "FILE:" + this.listFiles.SelectedItem.ToString();byte[] requestBuffer = Encoding.ASCII.GetBytes(request);//将请求写入到clientStream中,发送到服务器端clientStream.Write(requestBuffer, 0, requestBuffer.Length);byte[] responseBuffer = new byte[bufferSize];MemoryStream memStream = new MemoryStream();int bytesRead = 0;do{//获取服务器端的回应,bytesRead = clientStream.Read(responseBuffer, 0, bufferSize); //服务器的回应写入到memStreammemStream.Write(responseBuffer, 0, bytesRead);} while (bytesRead > 0);clientStream.Close();client.Close();//从内存流中读取图片文件数据,显示在picturebox控件上pictureBox.Image = Image.FromStream(memStream);}catch (Exception exce){MessageBox.Show(exce.Message);}}。

TCP协议实现文件传输

TCP协议实现文件传输使用TCP协议实现传输文件程序分为发送端和接收端。

首先在传输文件数据之前,发送端会把将装有文件名称和文件长度等信息的数据包发送至接收端。

接收端收到文件名称和文件长度信息后会创建好空白文件。

接着开始传输文件数据。

下面介绍实现功能的主要过程:1.创建套接字、绑定、监听、连接、接受连接//创建TCP协议的套接字m_Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if(SOCKET_ERROR == m_Socket)AfxMessageBox("Create Socket Error! ", 0, 0);//绑定与监听SOCKADDR_IN addrSrv;addrSrv.sin_addr.s_addr = inet_addr(sIP);addrSrv.sin_family = AF_INET;addrSrv.sin_port = htons(Port);int ret = bind(m_Socket, (SOCKADDR *)&addrSrv, sizeof(SOCKADDR) );if(ret==SOCKET_ERROR)AfxMessageBox("Bind Socket Error!", 0, 0);//连接SOCKADDR_IN ServerAddr;ServerAddr.sin_addr.s_addr = inet_addr(ServerAddr_in);ServerAddr.sin_family = AF_INET;ServerAddr.sin_port = htons(ServerPort);int Result = connect(m_Socket, (struct sockaddr*)&ServerAddr, sizeof(struct s ockaddr));if(SOCKET_ERROR == Result)AfxMessageBox("Connet Failed!");//接受连接SOCKADDR_IN ClientAddr;int len =sizeof(SOCKADDR_IN);SOCKET ClientSock = accept(m_Socket, (struct sockaddr*)&ClientAddr, &len);if(SOCKET_ERROR == ClientSock)AfxMessageBox("Accept Failed!");2.声明宏和结构体声明套接字缓冲区和一次发送文件数据的缓冲区大小#define SOCKET_BUFF 80000 //套接字缓冲区大小#define PACK_BUFF 50000 //数据包缓冲区大小声明文件I/O缓冲区和最大文件路径长度#define FILE_NAME_MAX 100 //文件路径最大长度#define FILE_IO_BUFF PACK_BUFF //文件IO缓冲区//文件信息typedef struct _FileInfor{u_long ulFileLen;char sFileName[ FILE_NAME_MAX ];}_FileInfor;//数据包typedef struct _DataPack{char cType; //'D'为数据 'M'为文件信息int nPackLen;char sContent[ PACK_BUFF ]; //数据包缓冲区u_long nPosition; //数据在文件中的位置int nContentLen; //数据字节数_FileInfor FileInfor; //文件信息}_DataPack;3.发送端//发送线程需要的全局变量char sPath[FILE_NAME_MAX]; //文件地址u_long FileByteCount; //文件大小SOCKET ClientSocket; //(1)设置套接字发送缓冲区大小,在32位Windows XP环境下,系统为每个套接字分配的默认发送数据缓冲区为8192字节。

基于TCP协议通信的文件传输系统之服务端


• // 创建包含IP和端口号的网络节点对象;
• 上述三条语句可在按下启动服务按钮后创建一个用来负责监听的套接字 • 在创建好了一个套接字过后,服务端便可以监听客户端的连接请求了。我 们使用了一个集合的形式用来表示已连接上服务端的客户端相关信息:
• • • • • • • • • • • Dictionary<string, Socket> dict = new Dictionary<string, Socket>(); //做一个集合以便用来包含已有的套接字 Dictionary<string, Thread> dictThread = new Dictionary<string, Thread>(); //做一个集合以便用来包含已有的线程 在监听到一个客户端的连接请求过后,就将该客户端的信息添加到在线列表控件中直观显示, 同时也添加到线程的集合和套接字的集合: Socket sokConnection = socketWatch.Accept(); // 一旦监听到一个客户端的请求,就返回与该客户端通信的套接字 lbOnline.Items.Add(sokConnection.RemoteEndPoint.ToString()); // 向列表控件中添加客户端的IP信息; dict.Add(sokConnection.RemoteEndPoint.ToString(), sokConnection); // 将与客户端连接的套接字对象添加到原有套接字集合中;
基于TCP通信协议的文件传输系统
综述:本次编程中,我们小组从零起点实现了对C#中的Winform窗体应用 的创建,简单控件的使用,以及C#语言中的Thread类、FileStream类、Directory类、 IPAddress类、Socket类等类的简单使用。 我们小组的文件传输系统特点如下:1、基于TCP协议进行服务端和 客户端 的连接,需提供服务端本机IP地址;2、多个客户端可连接同一服务器;3、服务 端可主动选取客户端发送本地文件。 程序目前的缺点如下:1、发送文件不能超过100KB,大数据不能分包发 (还在解决中);2、客户端不能自动存入文件名和文件格式;。。。

(完整word版)基于TCP的文件传输实验报告.docx

综合课程设计报告基于 TCP协议的文件传输系统学生姓名:指导教师:所在系:所学专业:年级:2011年6月目录摘要⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯2 1、的相关知 (3)1.1 、通信的模式 (3)1.1.1 、的可靠性 (3)1.2.1 、 TCP/IP 的网体系构 (3)1.2.2 、 TCP/IP 网 (4)1.2 . 3、 TCP——控制 (4)2、winsock 控件 (5)2.1.1 、 winsock 的重要属性、方法和事件 (5)2.1.2 、 winsock 控件通信的工作原理 (7)3、程序与 (8)3.1 、程序 (8)3.1.1 、体 (8)3.1.2 、模 (9)3.2 、程序 (10)3.2.1 、工作原理 (10)3.2.2 、服器端主程序 (11)3.2.3 、客端主程序 (14)4、 (17)参考文献...........................................................................................................17.成定 (18)基于TCP协议的文件传输系统摘要随着网络的普及,网络编程显得尤其重要。

本实验使用Winsock 控件实现两台计算机间的文件传输,描述了Winsock 控件的使用方法及有关文件传输的算法。

随着计算机网络的迅速发展,人们的生活越来越离不开网络,如今网络编程已成为计算机发展的热点,而在众多的网络通信中,又以TCP/IP 协议最为流行。

本文讨论的Winsock 控件,提供了访问TCP/IP 网络的捷径,使用它可以不必了解TCP/IP 的细节和调用Winsock API ,只要设置好相应的属性和触发事件后的处理,就可以实现计算机之间的数据通信,进行文件传输了。

同时为了便于传输文件过程中的中断现象,在实验时应该充分考虑断点续传问题,即中断文件传输后已经传输的文件不丢失,等到再传时,能继续接着传送。

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