计算机网络课程设计报告文件传输协议的简单实现
《计算机网络系统实践》课程设计报告-网络文件传输

《计算机网络系统实践》报告设计题目:网络文件传输学生姓名:专业班级:计算机科学与技术2016 年 1 月一、设计要求1. 实现单线程文件传输功能;2. 在以上基础上,掌握多线程技术,在文件网络传输时,可选择单线程或多线程;3. 加入异常控制依据,增强程序的鲁棒性(Robust);4. 了解如何提高套接字传输的速率,以及如何加强传输的稳定性。
二、开发环境与工具Eclips+java三、设计原理1.文件共享传输方式原理:主要采用TCPIP协议访问资源,一般是利用名字解析NETBIOS,dns,wins获得对方的IP地址,获取对方共享资源列表,当点击共享资源时候,客户机对服务器端点发出建立会话请求,这发生在传输层。
为了在服务端和客户端之间传送TCP数据,必须先建立一个虚拟电路,也就是TCP连接,建立TCP连接的标准过程是这样的:第一步,请求端(客户端)发送一个包含SYN标志的TCP报文,SYN即同步(Synchronize),同步报文会指明客户端使用的端口以及TCP连接的初始序号;第二步,服务器在收到客户端的SYN报文后,将返回一个SYN+ACK的报文,表示客户端的请求被接受,同时TCP序号被加一,ACK即确认(Acknowledgement)。
第三步,客户端也返回一个确认报文ACK给服务器端,同样TCP序列号被加一,到此一个TCP连接完成。
以上的连接过程在TCP协议中被称为三次握手(Three-way Handshake)。
会话连接建立后,对方检查共享资源的设置,通过注册表中的共享级别。
2.客户端:通过ss.socket()这个方法获取服务器的socket对象,并同过BufferReader来获取通道中的字节流中的内容3.服务器:将要发送的文件事先封装到通道内,并通过BufferWriter写入通道中四、系统功能描述及软件模块划分网络文件传输所实现的主要功能:网络文件传输主要由两个方面组成:1.客户端 2.服务器1.客户端:接受服务器发来的文件2.服务器:发送要发送的文件五、设计步骤1.服务器端的设计:①创建服务器对象ServerSocket ss = new ServerSocket (11111);②循环等待客户端的连接,若有客户端访问,就单独为它创建一个线程While(true){Socket s = ss.accept();New thread(new UserThread(s).start());}③封装字节流BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));④给出反馈bwServer.write(“文件上传成功”);⑤释放资源bw.close();2.客户端的设计①创建客户端对象Sockert s = new Socket();②封装文件BufferedWriter bw = new BUfferWriter(newOutputStreamWriter(s.getOutputStream()));③从通道中接受并反馈String client = brClient.readLine();System.out.println(client);④释放资源s.colse();六、关键问题及其解决方法1.怎样实现多线程的问题:While(true){Socket s = ss.accept();New thread(new UserThread(s).start());}2.怎样让// 封装通道内的流BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));// 封装文本文件// BufferedWriter bw = new BufferedWriter(new// FileWriter("Copy.java"));// 为了防止名称冲突String newName = System.currentTimeMillis() + ".txt";BufferedWriter bw = new BufferedWriter(new FileWriter(newName));String line = null;while ((line = br.readLine()) != null) { // 阻塞bw.write(line);bw.newLine();bw.flush();}客户端与服务器端运用TCP协议进行连接七、设计结果1.功能:实现客户端与服务器之间进行文件的传输2.课后思考题①套接字有基于阻塞和非阻塞的工作方式,试问你编写的程序是基于阻塞还是非阻塞的?各有什么优缺点?我编写的程序是基于阻塞的。
计算机网络文件传输及管理系统课程设计报告

目录摘要 (3)第一章课程设计要求 (4)一、设计任务 (3)1.1.1 课程设计内容 (3)1.1.2、课程设计的基本要求 (3)二、设计基本思路及相关理论 (3)1.2.1、TCP/IP协议 (3)1.2.2、客户机/服务器模型 (4)1.2.3、设计基本思路 (4)第二章设计概要 (5)2.1 功能设计 (5)2.2 程序系统功能模块 (6)2.3 功能分析 (7)2.3.1 功能流程图: (7)2.3.2 程序主要功能说明 (7)第三章调试分析与测试结果 (23)3.1服务器端与客户端 (23)3.2文件管理的过程 (26)第四章设计总结 (28)参考文献 (28)课程设计评分表 (30)摘要网络的Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符。
Socket也具有一个类似于打开文件的函数调用Socket(),该函数返回一个整型的Socket描述符,随后的连接建立、数据传输等操作都是通过该Socket实现的。
Socket接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,程序员可以用它们来开发TCP/IP网络上的应用程序。
要学Internet上的TCP/IP网络编程,必须理解Socket接口。
Socket接口设计者最先是将接口放在Unix操作系统里面的。
如果了解Unix系统的输入和输出的话,就很容易了解Socket了。
常用的Socket类型有两种:流式Socket (SOCK_STREAM)和数据报式Socket(SOCK_DGRAM)。
流式是一种面向连接的Socket,针对于面向连接的TCP服务应用;数据报式Socket是一种无连接的Socket,对应于无连接的UDP服务应用。
Socket接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,程序员可以用它们来开发TCP/IP网络上的应用程序。
要学Internet上的TCP/IP网络编程,必须理解Socket接口。
网络编程文件传输实验报告

网络编程文件传输实验报告CKBOOD was revised in the early morning of December 17, 2020.基于TCP一、1、2、sockets 二、本程序是基于TCP/IP协议栈的网络编程,使用C语言,利用操作系统提供的套接字网络编程接口进行编写TCP协议是其中重要的传输协议,为应用层提供可靠的端到端的流传输服务.其中套接字取值sock_stream即为TCP的流传输服务Windows socket包含了人们所熟悉的Berkeley Socket风格的函数库,也包含了一组针对windows的扩展库函数,以使程序员能充分的利用windows驱动消息机制进行编程。
Windows Sockets的规范本意在于提供给应用开发者一套简单的API,并让个网络应用软件开发商遵守该协议。
此外在一个特定的版本windows基础上,Windows socket也定义了一个二进制借口(ABI),从此来保证Windowssocket API应用程序能够在任何符合Windows socket协议的实现上工作。
三、设计概述1、创建套接字服务进程和客户进程在实现通信前必须创建各自的套接字,然后才能用相应的套接字进行发送接收操作,服务进程总是先于客户端进程启动,服务器端进程和客户端进程创建套接字。
Socket()函数实现代码如下:SOCKET serSocket=socket(AF_INET,SOCK_STREAM,0);....\n");....\n");//得到主机开始传送消息recv(clientSocket,receiveBuf,101,0);printf("%s\n",receiveBuf);if(strcmp(receiveBuf,"开始传送")==0){//传送文件长度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<length){cent=(double)y*(double)length;printf("已发送:%%\n",cent); send(clientSocket,trans,SIZE+1,0); } else{ send(clientSocket,trans,length+SIZE-y+1,0);closesocket(clientSocket); WSACleanup(); } }fclose(fp);}printf("文件发送完毕\n");system("pause");}四、实验结果及分析:客户端运行结果服务器端运行结果五、心得体会:网络编程的实验课虽然只有八次,但是我们充分了解了各种网络编程和winsock控件的知识,了解了TCP/IP协议的相关知识以及其中两个重要协议TCP UDP的特点与差异,进一步学习了文件传输等知识,创建套接字监听传输关闭等过程,直到最后写出C/S模式的文件传输程序感觉我们巩固了教材的内容实践的能力也得到了提高不足之处就是自己粗心大意,在写代码时候参数注解等经常注明的不够好,希望以后能养成良好的编程习惯。
计算机网络课程设计报告文件传输协议的简单实现

课程设计课程名称计算机网络课程设计题目名称文件传输协议的简单设计与实现学生学院专业班级___ _学号学生姓名______ _________指导教师______ _____2010 年 1 月 5 日设计摘要关键词:SOCKET编程,FTPclient/server程序摘要:本课程设计包含了文件传输协议的简单设计与实现。
文件传送是各种计算机网络实现的基本功能,文件传送协议是一种最基本的应用层协议按照客户/服务器的模式进行工作,提供交互式的访问,是INTERNET使用最广泛的协议之一。
文件传输协议的简单设计与实现建立在计算机网络实验环境TCP/IP 网络体系结构之上,使用socket 编程接口编写两个程序,分别为客户程序(client.c)和服务器程序(server.c),实现下述命令功能:get , put, pwd, dir, cd, ?, quit 等,利用了已有网络环境设计并实现简单应用层协议。
本设计包括了具体设计任务,基本思路及所涉及的相关理论,设计流程图,调试过程中出现的问题及相应解决办法,实验运行结果,核心程序,个人体会及建议等。
目录1、文件传输协议的简单设计与实现------------------------------181. 1 具体设计任务----------------------------------------------18 1.2 基本思路及所涉及的相关理论--------------------------------181.2.1基本思路-------------------------------------------------182.2.2 相关理论--------------------------------------------18 1.3设计流程图------------------------------------------------191.4实验运行情况----------------------------------------------191.5 核心程序--------------------------------------------------222.5.1 服务器(sever)程序---------------------------------222.5.2 客户(client)程序----------------------------------291.6心得体会-----------------------------------------------------------------------------37参考文献--------------------------------------------------------382、文件传输协议的简单设计与实现2. 1 具体设计任务计算机网络实验环境建立在TCP/IP 网络体系结构之上。
计算机网络技术第四版课程设计

计算机网络技术第四版课程设计一、设计题目本次计算机网络技术课程设计的题目是“基于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协议的实现技术要点,并实现了文件传输过程中常见的断点续传功能和命令行控制。
这些技术点均是计算机网络技术课程中的重点内容,对我们深入学习和理解计算机网络技术的概念和应用具有重要的帮助和启示。
文件传送协议实验报告

一、实验目的1. 理解文件传送协议的基本原理和流程。
2. 掌握常用的文件传送协议,如FTP、TFTP等。
3. 学习使用文件传送协议进行文件的上传和下载。
4. 了解文件传送协议在实际应用中的优势和局限性。
二、实验环境1. 操作系统:Windows 102. 软件环境:Cygwin、FTP Server、FTP Client3. 网络环境:局域网三、实验内容1. FTP协议实验2. TFTP协议实验四、实验步骤1. FTP协议实验(1)搭建FTP服务器1)在Cygwin中安装FTP服务器。
2)配置FTP服务器,设置用户名和密码。
3)启动FTP服务器。
(2)使用FTP客户端连接FTP服务器1)在Cygwin中安装FTP客户端。
2)使用FTP客户端连接到FTP服务器。
3)登录FTP服务器。
(3)上传和下载文件1)在FTP客户端选择要上传的文件。
2)使用FTP客户端将文件上传到FTP服务器。
3)在FTP客户端选择要下载的文件。
4)使用FTP客户端将文件从FTP服务器下载到本地。
2. TFTP协议实验(1)搭建TFTP服务器1)在Cygwin中安装TFTP服务器。
2)配置TFTP服务器,设置共享目录。
3)启动TFTP服务器。
(2)使用TFTP客户端连接TFTP服务器1)在Cygwin中安装TFTP客户端。
2)使用TFTP客户端连接到TFTP服务器。
(3)上传和下载文件1)在TFTP客户端选择要上传的文件。
2)使用TFTP客户端将文件上传到TFTP服务器。
3)在TFTP客户端选择要下载的文件。
4)使用TFTP客户端将文件从TFTP服务器下载到本地。
五、实验结果与分析1. FTP协议实验实验结果表明,使用FTP协议可以方便地进行文件的上传和下载。
FTP服务器和客户端的配置较为简单,易于操作。
但在实际应用中,FTP协议存在以下局限性:(1)FTP协议不是加密传输,存在安全隐患。
(2)FTP协议传输速度较慢。
(3)FTP协议不支持断点续传。
计算机网络中的传输协议与实现

计算机网络中的传输协议与实现计算机网络是现代社会中最重要的基础设施之一,其靠的是一系列协议来保证网络的正常运行。
其中最重要的就是传输协议。
本文将探讨计算机网络中的传输协议与实现。
传输协议是计算机网络中的一种协议,它负责在不同计算机之间传输数据。
具体来说,传输协议主要分为两类:面向连接的传输协议和无连接的传输协议。
面向连接的传输协议是指在传输数据之前,发送端和接收端之间要先建立一条连接,然后再传输数据。
这种协议比较安全可靠,但是由于需要建立连接,速度较慢。
常见的面向连接的传输协议有TCP协议。
TCP协议是一种面向连接的传输协议,它是整个互联网传输层协议中最主要的一种。
TCP协议有以下特点:1.可靠性高:TCP协议在传输数据时会检测数据的完整性,如果数据在传输过程中发生了错误,TCP协议会重新发送数据,保证数据的正确性;2.面向连接:TCP协议在传输数据之前需要建立连接,这样可以保证数据传输的可靠性;3.流量控制:TCP协议可以根据网络状况自动控制数据的传输速率,使网络负载保持在合理的范围内。
无连接的传输协议是指在传输数据时,发送端和接收端之间不需要建立连接,直接发射数据包。
这种协议速度较快,但是由于不需要建立连接,数据传输的可靠性不如面向连接的传输协议。
常见的无连接的传输协议有UDP协议。
UDP协议是一种无连接的传输协议,它是整个互联网传输层协议中最基础的一种。
UDP协议有以下特点:1.传输速度快:UDP协议不需要建立连接,直接发送数据包,速度比较快;2.简单易实现:UDP协议的实现比较简单,开发者可以容易地实现它;3.面向无连接:UDP协议不需要建立连接,数据传输的可靠性比较低。
对于大多数应用程序而言,TCP协议能够满足其对传输协议的需求,但是对于实时视频和音频等需要实时传输的应用来说,UDP协议则更加适用。
因为对于实时传输来说,速度比可靠性更加重要,如果在处理实时数据时因为网络传输问题导致数据延迟过高,就会对应用的性能产生很大的影响。
文件传输协议的C语言实现

第ChpNum章文件传输协议的C语言实现1设计目的本设计旨在利用Winsock 简单实现FTP(File Transfer Protocol,文件传输协议)的客户端和服务器端程序。
通过完成此设计,了解Winsock API函数调用方法和一般网络应用程序的编程方法,理解FTP协议,掌握C语言设计FTP协议软件的基本技术,为将来开发其他通信协议软件打下坚实基础。
2 设计准备(1)连入同一局域网的PC,每人一台。
(2)PC装有Windows操作系统、Visual C++ 编译器及开发手册MSDN 。
3关键技术文件传输协议介绍FTP 是File Transfer Protocol(文件传输协议)的英文简称,用于Internet上的控制文件的双向传输。
在实现的层面上,FTP又可理解为一个可用于文件传输的客户机/服务器系统,该系统包括客户机端程序和服务器端程序,客户端和服务器端通信规则为FTP协议。
用户通过客户机程序向服务器程序发出命令请求,服务器程序执行用户所发出的命令,并将执行的结果返回到客户机。
比如说,用户发出一条命令,要求服务器向用户传送某一个文件的一份拷贝,服务器会响应这条命令,将指定文件送至用户的机器上。
客户机程序接收到这个文件,将其存放在用户目录中。
在通信协议的分层模型中,文件传输协议是在TCP(Transmission control Protocol,传输控制协议)之上的一个应用层协议,应用程序之间的通信需要用到传输层提供的字节流透明无误传输服务。
Windows操作系统具有TCP/IP协议栈,应用程序可通过Winsock API函数的调用实现端到端透明数据链接的建立。
Winsock API介绍因特网(Internet)最初是基于Unix的,而Sockets(套接字)是Unix第一个支持TCP/IP 协议栈的网络API,最早于1982年8月随BSD版Unix推出,常被称为Berkeley sockets (伯克利套接字)。
ftp文件传输协议课程设计报告大学论文

课程设计课程名称_计算机网络题目名称_文件传输协议的简单设计与实现学生学院_自动化学院专业班级_13级物联网工程1班学号_**********学生姓名梁建斌指导教师刘洪涛2015年12月25日摘要文件传送是各种计算机网络都实现的基本功能,文件传送协议是一种最基本的应用层协议按照客户/服务器的模式进行工作,提供交互式的访问。
本设计是基于Eclipse平台下使用Java实现的FTP文件传输。
实现基本的文件传输操作。
建立客户端和服务器、客户端基于TCP Socket进行数据传输,采用多线程进行数据传输,套接字来实现。
在实现过程中采用类与对象的思想进行规划,体验了一个软件开发过程的具体实现步骤。
关键字:Java网络编程FTP文件传输文件上传下载文件操作1目录一、实验目的 (3)二、实验内容和要求 (3)1、实验内容 (3)2、具体要求 (3)三、实验主要仪器设备和材料 (3)四、基本原理 (3)1.FTP系统模型 (3)2. 系统功能设计 (4)2.1总体设计 (4)基本功能 (4)2.2系统实现 (4)五、实现结构流程图 (5)六、整体实现的逻辑、数据结构 (5)1.客户端的抽象数据类型 (5)1.1FTPClient用户界面 (5)1.2FTPClient控制连接线程 (7)1.3FTPClient数据连接线程 (7)2. 服务器的抽象数据类型 (8)2.1 FTPServer的控制连接线程 (8)2.2FTPServer的数据连接线程 (9)七、具体的一些方法实现 (9)1. FTPClient用户界面 (10)2. FTPClient控制连接 (10)3. FTPClient数据传输 (12)4. FTPServer控制连接 (14)5. FTPServer数据传输 (14)八、测试结果客户端结果 (16)服务端结果 (16)九、课程设计心得 (17)十、参考文献 (18)2一、实验目的文件传送是各种计算机网络都实现的基本功能,文件传送协议是一种最基本的应用层协议按照客户/服务器的模式进行工作,提供交互式的访问,是INTERNET使用最广泛的协议之一。
文件传输协议的简单设计与实现

要求:用socket 编程接口编写两个程序,分别为客户程序(client.c)和服务器程序(server.c),该程序应能实现下述命令功能:get:取远方的一个文件put:传给远方一个文件pwd:显示远主当前目录dir:列出远方当前目录cd :改变远方当前目录?:显示你提供的命令quit :退出返回注意事项:这此命令的具体工作方式(指给出结果的形式)可以参照FTP 的相应命令,有余力的同学可以多实现几个命令。
使用Socket进行Client/Server程序设计的一般连接过程是这样的:Server端Listen(监听)某个端口是否有连接请求,Client端向Server端发出Connect(连接)请求,Server端向Client 端发回Accept(接受)消息。
一个连接就建立起来了。
Server端和Client端都可以通过Send,Write等方法与对方通信。
对于一个功能齐全的Socket,都要包含以下基本结构,其工作过程包含以下四个基本的步骤:(1)创建Socket;(2)打开连接到Socket的输入/出流;(3)按照一定的协议对Socket进行读/写操作;(4)关闭Socket.下面是源代码:/****************client.c****************/#include <winsock2.h>#include <stdio.h>#include <stdlib.h>#pragma comment(lib,"ws2_32.lib")#define DEFAULT_PORT 2302#define DEFAULT_BUFFER 2048#define DEFAULT_MESSAGE "This is a test of the emergency \ broadcasting system"char szServerip[128], // Server to connect toszMessage[1024]; // Message to send to severint iPort = DEFAULT_PORT; // Port on server to connect to//DWORD dwCount = DEFAULT_COUNT; // Number of times to send messageBOOL bSendOnly = FALSE; // Send data only; don't receiveint dirfun();int getfun();int putfun();int pwdfun();int cdfun();int mdfun();int delfun();int usafun();void usage(){printf("usage: client [-p:x] [-s:IP] [-n:x] [-o]\n\n");printf(" -p:x Remote port to send to\n");printf(" -s:IP Server's IP address or hostname\n");printf(" -n:x Number of times to send message\n");printf(" -o Send messages only; don't receive\n");ExitProcess(1);}void ValidateArgs(int argc, char **argv){int i;for(i = 1; i < argc; i++){if ((argv[i][0] == '-') || (argv[i][0] == '/')){switch (tolower(argv[i][1])){case 'p': // Remote portif (strlen(argv[i]) > 3)iPort = atoi(&argv[i][3]);break;case 's': // Serverif (strlen(argv[i]) > 3)strcpy(szServerip, &argv[i][3]);break;case 'n': // Number of times to send messageif (strlen(argv[i]) > 3)//dwCount = atol(&argv[i][3]);break;case 'o': // Only send message; don't receivebSendOnly = TRUE;break;default:usage();break;}}}}int main(int argc, char **argv){WSADATA wsd;SOCKET sClient;char szBuffer[DEFAULT_BUFFER];int ret;//unsigned int i;//int j;struct sockaddr_in server;struct hostent *host = NULL;char choice[5],choice2[40];// Parse the command line and load Winsock//argv[1]="-s:127.0.0.1";strcpy(szServerip, &argv[1][3]);//ValidateArgs(argc, argv);if (WSAStartup(MAKEWORD(2,2), &wsd) != 0){printf("Failed to load Winsock library!\n");return 1;}//strcpy(szMessage, DEFAULT_MESSAGE);//// Create the socket, and attempt to connect to the server//sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if (sClient == INV ALID_SOCKET){printf("socket() failed: %d\n", WSAGetLastError());return 1;}server.sin_family = AF_INET;server.sin_port = htons(iPort);printf("server.sin_port=%u\n",server.sin_port);server.sin_addr.s_addr = inet_addr(szServerip);//// If the supplied server address wasn't in the form// "c.ddd" it's a hostname, so try to resolve it//if (server.sin_addr.s_addr == INADDR_NONE){host = gethostbyname(szServerip);if (host == NULL){printf("Unable to resolve server: %s\n", szServerip);return 1;}CopyMemory(&server.sin_addr, host->h_addr_list[0],host->h_length);}if (connect(sClient, (struct sockaddr *)&server,sizeof(server)) == SOCKET_ERROR){printf("connect() failed: %d\n", WSAGetLastError());return 1;}//显示接通信息//////for(j=0;j<2;j++)//{ret = recv(sClient, szBuffer, DEFAULT_BUFFER, 0);if (ret == 0) // Graceful closereturn 0;else if (ret == SOCKET_ERROR){printf("recv() failed: %d\n", WSAGetLastError());return 0;}szBuffer[ret] = '\0';printf("%s\n",szBuffer);if(ret<15){ret = recv(sClient, szBuffer, DEFAULT_BUFFER, 0);if (ret == 0) // Graceful closereturn 0;else if (ret == SOCKET_ERROR){//printf("recv() failed: %d\n", WSAGetLastError());return 0;}szBuffer[ret] = '\0';printf("%s\n",szBuffer);}//printf("DEFAULT_BUFFER=%d\n",DEFAULT_BUFFER);}while(1){puts("------------------------------------------");printf("ftp> ");scanf("%s", choice);if(strncmp(choice,"dir",3)==0||strncmp(choice,"DIR",2)==0){dirfun(sClient);continue;}else if(strncmp(choice,"pwd",3)==0||strncmp(choice,"PWD",3)==0) {pwdfun(sClient);continue;}else if(strncmp(choice,"?",1)==0){usafun(sClient);continue;}else if(strncmp(choice,"quit",4)==0||strncmp(choice,"QUIT",2)==0) {break;}scanf("%s", choice2);if(strncmp(choice,"get",3)==0||strncmp(choice,"GET",3)==0){getfun(sClient,choice2);continue;}else if(strncmp(choice,"put",3)==0||strncmp(choice,"PUT",3)==0) {putfun(sClient,choice2);continue;}else if(strncmp(choice,"cd",2)==0||strncmp(choice,"CD",2)==0) {cdfun(sClient,choice2);continue;}else if(strncmp(choice,"md",2)==0||strncmp(choice,"MD",2)==0) {mdfun(sClient,choice2);}else if(strncmp(choice,"del",3)==0||strncmp(choice,"DEL",3)==0){delfun(sClient,choice2);continue;}//elseputs("输入错误,请重新输入");fflush(stdin);fflush(stdin);printf("\n");printf("\n");}closesocket(sClient);WSACleanup();return 0;}int dirfun(SOCKET sClient){int ret;char *MSG="dir$";char szBuffer[80];strcpy(szMessage, MSG);ret = send(sClient, szMessage, strlen(szMessage), 0);if (ret == 0)return 1;else if (ret == SOCKET_ERROR){printf("send() failed: %d\n", WSAGetLastError());return 1;}//printf("Send %d bytes\n", ret);//printf("bSendOnly=%d\n",bSendOnly);while(!bSendOnly){//读取流并显示//ret = recv(sClient, szBuffer, 80, 0);//printf("%s",szBuffer);ret = recv(sClient, szBuffer, 80, 0);if (ret == 0) // Graceful closeelse if (ret == SOCKET_ERROR){printf("recv() failed: %d\n", WSAGetLastError());return 1;}szBuffer[ret] = '\0';if(strncmp(szBuffer,"226 Close",strlen("226 Close"))==0){break;}printf("%s",szBuffer);if(strncmp(szBuffer,"500 Syntax error",strlen("500 Syntax error"))==0){break;}}return 0;}int getfun(SOCKET sClient,char filename[40]){int ret;FILE *fpre;char szBuffer[80];szMessage[0]='\0';strcat(szMessage, "get$");//strcat(szMessage, "\\");strcat(szMessage,filename);//printf("MSG[4]=%c\n",szMessage[4]);//szMessage[0]='g';szMessage[1]='e';szMessage[2]='t';////szMessage[4]='m';szMessage[5]='e';szMessage[6]='.';szMessage[7]='t';////szMessage[8]='x';szMessage[9]='t';szMessage[10]='\0';ret = send(sClient, szMessage, strlen(szMessage)+1, 0);if (ret == 0)return 1;else if (ret == SOCKET_ERROR){printf("send() failed: %d\n", WSAGetLastError());}printf("Send %d bytes\n", ret);ret = recv(sClient, szBuffer, 80, 0);/*if (ret == 0) // Graceful closebreak;else if (ret == SOCKET_ERROR){printf("recv() failed: %d\n", WSAGetLastError());break;}*/szBuffer[ret] = '\0';printf("%s\n",szBuffer);if(strncmp( szBuffer,"125 Transfering...",strlen("125 Transfering...") )==0) {if( (fpre=fopen(filename,"w")) == NULL ){printf("open errer");return 1;}printf("bSendOnly=%d\n",bSendOnly);while(!bSendOnly){//读取流并显示ret = recv(sClient, szBuffer, 80, 0);if (ret == 0) // Graceful closereturn 1;else if (ret == SOCKET_ERROR){printf("recv() failed: %d\n", WSAGetLastError());return 1;}szBuffer[ret] = '\0';//printf("%s",szBuffer);if(strncmp(szBuffer,"226 Transfer",strlen("226 Transfer"))==0){break;}if(strncmp(szBuffer,"500 Syntax error",strlen("500 Syntax error"))==0){break;}fprintf(fpre,"%s",szBuffer);}printf("%s\n",szBuffer);fclose(fpre);}return 0;}int putfun(SOCKET sClient,char filename[40]){int ret;//int i;FILE *fpse;//char *filename;//char *MSG="get\0me.txt";char szBuffer[80],temp_buffer[80];//sprintf(szMessage, "get\0","te.txt\0");szMessage[0]='\0';strcat(szMessage, "put$");strcat(szMessage,filename);ret = send(sClient, szMessage, strlen(szMessage)+1, 0);if (ret == 0)return 0;else if (ret == SOCKET_ERROR){printf("send() failed: %d\n", WSAGetLastError());return 1;}//printf("Send %d bytes\n", ret);//filename="me.txt";printf("filename=%s\n",filename);if( (fpse=fopen(filename,"r")) == NULL ){printf("open errer");return 1;}else{printf("The file %s found,ready to transfer.\n",filename);//i=0;while (fgets(temp_buffer,80,fpse)!=NULL){sprintf(szBuffer,"%s",temp_buffer);send(sClient, szBuffer, 80, 0);}}sprintf(szBuffer, "226 Transfer completed... \r\n");ret = send(sClient, szBuffer, strlen(szBuffer), 0);fclose(fpse);return 0;}int pwdfun(SOCKET sClient){int ret;char *MSG="pwd$";char szBuffer[160];strcpy(szMessage, MSG);ret = send(sClient, szMessage, strlen(szMessage), 0);if (ret == 0)return 1;else if (ret == SOCKET_ERROR){printf("send() failed: %d\n", WSAGetLastError());return 1;}printf("Send %d bytes\n", ret);printf("bSendOnly=%d\n",bSendOnly);while(!bSendOnly){//读取流并显示ret = recv(sClient, szBuffer, 160, 0);if (ret == 0) // Graceful closereturn 1;else if (ret == SOCKET_ERROR){printf("recv() failed: %d\n", WSAGetLastError());return 1;}szBuffer[ret] = '\0';printf("%s\n",szBuffer);if(strncmp(szBuffer,"226 Close",strlen("226 Close"))==0){break;}if(strncmp(szBuffer,"500 Syntax error",strlen("500 Syntax error"))==0) {break;}}return 0;}int cdfun(SOCKET sClient,char pathname[40]){int ret;szMessage[0]='\0';strcat(szMessage, "cd$");strcat(szMessage,pathname);ret = send(sClient, szMessage, strlen(szMessage)+1, 0);if (ret == 0)return 1;else if (ret == SOCKET_ERROR){printf("send() failed: %d\n", WSAGetLastError());return 1;}printf("Send %d bytes\n", ret);return 0;}int mdfun(SOCKET sClient,char pathname[20]){int ret;char szBuffer[160];//char *MSG="md$";szMessage[0]='\0';strcat(szMessage, "md$");//strcat(szMessage, "\\");strcat(szMessage,pathname);//strcpy(szMessage, MSG);ret = send(sClient, szMessage, strlen(szMessage)+1, 0);if (ret == 0)return 1;else if (ret == SOCKET_ERROR){printf("send() failed: %d\n", WSAGetLastError());return 1;}printf("Send %d bytes\n", ret);while(!bSendOnly){//读取流并显示ret = recv(sClient, szBuffer, 80, 0);if (ret == 0) // Graceful closereturn 1;else if (ret == SOCKET_ERROR){printf("recv() failed: %d\n", WSAGetLastError());return 1;}szBuffer[ret] = '\0';printf("%s",szBuffer);if(strncmp(szBuffer,"226 Close",strlen("226 Close"))==0){break;}if(strncmp(szBuffer,"500 Syntax error",strlen("500 Syntax error"))==0){break;}}return 0;}int delfun(SOCKET sClient,char name[20]){int ret;char szBuffer[80];szMessage[0]='\0';strcat(szMessage, "del$");strcat(szMessage,name);ret = send(sClient, szMessage, strlen(szMessage)+1, 0);if (ret == 0)return 1;else if (ret == SOCKET_ERROR){printf("send() failed: %d\n", WSAGetLastError());return 1;}printf("Send %d bytes\n", ret);while(!bSendOnly){ret = recv(sClient, szBuffer, 80, 0);if (ret == 0) // Graceful closereturn 1;else if (ret == SOCKET_ERROR){printf("recv() failed: %d\n", WSAGetLastError());return 1;}szBuffer[ret] = '\0';if(strncmp(szBuffer,"del ok",strlen("del ok"))==0){printf("del %s ok\n",name);break;}printf("%s",szBuffer);if(strncmp(szBuffer,"500 Syntax error",strlen("500 Syntax error"))==0) {break;}}return 0;}int usafun(){puts("------------------------------------------");puts("get:取远方的一个文件");puts("put:传给远方一个文件");puts("pwd:显示远主当前目录");puts("dir:列出远方当前目录");puts("md :在远方新建文件夹");puts("cd :改变远方当前目录");puts("?:显示你提供的命令");puts("quit :退出返回");return 0;}//int quit()/****************server.c****************/#include <stdio.h>#include <winsock.h>#include <stdlib.h>#pragma comment(lib,"ws2_32.lib")WSADATA wsd;char sbuffer[80],rbuffer[80];//send and receive buffersint n,bytes;//countersSOCKET newsocket,ns_data;struct sockaddr_in remoteaddr; //remoteaddr_data;int port_connect=0;//port connect flagchar path[80]="";char order[100]="";//SOCKET s_data_port;int sy_error=1; // use for indicate Syntax error//server functionsint sdirfun(SOCKET newsocket);int sgetfun(SOCKET newsocket);int sputfun(SOCKET newsocket);int spwdfun(SOCKET newsocket);int scdfun(SOCKET newsocket);int smdfun(SOCKET newsocket);int sdelfun(SOCKET newsocket);void HandleError(char *func);//server functions end//MAINint main(int argc, char *argv[]){struct sockaddr_in localaddr;//local address structureSOCKET s;//s_data;//welcome socket and welcome socket for data connection,and port connection for connect to clientint addr_inlen;//address lenght variableif (WSAStartup(MAKEWORD(2,2), &wsd) != 0){WSACleanup();printf("WSAStartup failed\n");}memset(&localaddr,0,sizeof(localaddr));//clear localaddrs = socket(PF_INET, SOCK_STREAM, 0);if (s <0){printf("socket failed\n");}localaddr.sin_family = AF_INET;if(argc == 2)localaddr.sin_port = htons((u_short)atoi(argv[1]));elselocaladdr.sin_port = htons(2302);localaddr.sin_addr.s_addr = INADDR_ANY;if (bind(s,(struct sockaddr *)(&localaddr),sizeof(localaddr)) < 0){printf("Bind failed!\n");}//INFINITE LOOPwhile (1){ // while loop 1//LISTENlisten(s,3);addr_inlen = sizeof(remoteaddr);//ACCEPT main connection (control connection)newsocket = accept(s,(struct sockaddr *)(&remoteaddr),&addr_inlen);if (newsocket == INV ALID_SOCKET) break;printf("connected to %s at port %d \n",inet_ntoa(remoteaddr.sin_addr),ntohs(localaddr.sin_port));//Respond with welcome message, FTP client requires thosesprintf(sbuffer,"200 Welcome \r\n");bytes = send(newsocket, sbuffer, strlen(sbuffer), 0);sprintf(sbuffer,"530 Log in \r\n");bytes = send(newsocket, sbuffer, strlen(sbuffer), 0);//INFINITE LOOPwhile (1) // while loop 2{n = 0;sy_error=1;while (1) // while loop 3{//RECEIVEbytes = recv(newsocket, &rbuffer[n], 1, 0);printf("rbuffer[%d]=%c\n",n,rbuffer[n]);if ((bytes < 0) || (bytes == 0))break;if (rbuffer[n] == '$'){rbuffer[n] = '\0';break;}if (rbuffer[n] != '\r')n++;} // end of while loop 3if ((bytes < 0) || (bytes == 0))break;printf("#The Server receives:# '%s' from client \n", rbuffer); //THE FTP COMMANDS HERE//LISTif(strncmp(rbuffer,"dir",3)==0){sdirfun(newsocket);}//当前目录if(strncmp(rbuffer,"pwd",3)==0){spwdfun(newsocket);}//改变目录if (strncmp(rbuffer,"cd",2)==0){scdfun(newsocket);}//GETif (strncmp(rbuffer,"get",3)==0){sgetfun(newsocket);}//PUTif (strncmp(rbuffer,"put",3)==0){sputfun(newsocket);}//MDif (strncmp(rbuffer,"md",2)==0){smdfun(newsocket);}if (strncmp(rbuffer,"del",3)==0){sdelfun(newsocket);}//QUITif (strncmp(rbuffer,"quit",4)==0){printf("quit \n");sprintf(sbuffer, "221 Bye bye ... \r\n");bytes = send(newsocket, sbuffer, strlen(sbuffer), 0);sy_error=0;break;}//Syntax errorif (sy_error==1){printf("command unrecognized, non-implemented!\n");sprintf(sbuffer, "500 Syntax error. \n");bytes = send(newsocket, sbuffer, strlen(sbuffer), 0);}} // end of while loop 2//CLOSE CONTROL SOCKETclosesocket(newsocket);printf("disconnected from %s at port %d, close control socket.\n",inet_ntoa(remoteaddr.sin_addr),ntohs(localaddr.sin_port));} // end of while loop 1//CLOSE WELCOME SOCKETclosesocket(s);printf("Welcome sockets close");return 0;}int sdirfun(SOCKET newsocket){char temp_buffer[80];printf("Equivalent to dir \n");order[0]='\0';strcat(order,"dir ");strcat(order,path);strcat(order," >tmp.txt");system(order);FILE *fin;fin=fopen("tmp.txt","r");sprintf(sbuffer, "125 Transfering... \r\n");bytes = send(newsocket, sbuffer, strlen(sbuffer), 0);while (fgets(temp_buffer,80,fin)!=NULL){sprintf(sbuffer,"%s",temp_buffer); //if (port_connect==0)send(newsocket, sbuffer, strlen(sbuffer), 0);}fclose(fin);sprintf(sbuffer, "226 Transfer completed... \r\n");bytes = send(newsocket, sbuffer, strlen(sbuffer), 0);system("del tmp.txt");//CLOSE the ns_data SOCKET or data port SOCKETif(port_connect==0){closesocket(ns_data);sprintf(sbuffer,"226 Close the data socket... \r\n");bytes = send(newsocket, sbuffer, strlen(sbuffer), 0);ns_data = socket(AF_INET, SOCK_STREAM, 0);}sy_error=0;return 0;}int sgetfun(SOCKET newsocket){printf("RETR mode.\r\n");int i=4,k=0;char filename[20],temp_buffer[80];// identify the filename from rbuffer after the word "RETR "while (1) // while loop 4{//RECEIVEbytes = recv(newsocket, &rbuffer[i], 1, 0);printf("rbuffer[i]=%c\n",rbuffer[i]);if ((bytes < 0) || (bytes == 0))break;filename[k]=rbuffer[i];if (rbuffer[i] == '\0'){ /*end on LF*/filename[k] = '\0';break;}if (rbuffer[i] != '\r'){i++;k++;/*ignore CR's*/}} // end of while loop 4order[0]='\0';strcat(order,path);if(strlen(path)>0)strcat(order,"\\");strcat(order,filename);char *p_filename=order;FILE *fp;if( (fp=fopen(p_filename,"r")) == NULL ){sprintf(sbuffer, "Sorry, cannot open %s. Please try again.\r\n",filename);bytes = send(newsocket, sbuffer, strlen(sbuffer), 0);sprintf(sbuffer, "226 Transfer completed... \r\n");bytes = send(newsocket, sbuffer, strlen(sbuffer), 0);return 1;}else{printf("The file %s found,ready to transfer.\n",filename);sprintf(sbuffer, "125 Transfering... \r\n");bytes = send(newsocket, sbuffer, strlen(sbuffer), 0);while (fgets(temp_buffer,80,fp)!=NULL){sprintf(sbuffer,"%s",temp_buffer); //if (port_connect==0)send(newsocket, sbuffer, strlen(sbuffer), 0);}//end of whilefclose(fp);sprintf(sbuffer, "226 Transfer completed... \r\n");bytes = send(newsocket, sbuffer, strlen(sbuffer), 0);}sy_error=0;return 0;}int sputfun(SOCKET newsocket){printf("Equivalent to put. \n");int i=4,k=0;char filename[20];// identify the filename from rbuffer after the word "RETR "while (1){bytes = recv(newsocket, &rbuffer[i], 1, 0);if ((bytes < 0) || (bytes == 0))break;filename[k]=rbuffer[i];if (rbuffer[i] == '\0'){ /*end on LF*/filename[k] = '\0';break;}if (rbuffer[i] != '\r'){i++;k++;/*ignore CR's*/}} // end of whileorder[0]='\0';strcat(order,path);if(strlen(path)>0)strcat(order,"\\");strcat(order,filename);printf("filename=%s,",order);char *p_filename=order;FILE *fpse;if( (fpse=fopen(order,"w")) == NULL ){printf("open errer");return 1;}else{printf("The file %s found,ready to transfer.\n",filename);while(1){//读取流并显示int ret;ret = recv(newsocket, rbuffer, 80, 0);if (ret == 0) // Graceful closereturn 0;else if (ret == SOCKET_ERROR){printf("recv() failed: %d\n", WSAGetLastError());return 0;}if(strncmp(rbuffer,"226 Transfer",strlen("226 Transfer"))==0){break;}fprintf(fpse,"%s",rbuffer);}printf("RBUFFER=%s",rbuffer);fclose(fpse);}sy_error=0;return 0;}int spwdfun(SOCKET newsocket){printf("Equivalent to pwd \n");//order[0]='\0';//strcat(order,"dir ");//strcat(order,path);//strcat(order,);system("cd >tmp.txt");FILE *fin;fin=fopen("tmp.txt","r+");sprintf(sbuffer, "125 Transfering... \r\n");bytes = send(newsocket, sbuffer, strlen(sbuffer), 0);char temp_buffer[160];while (fgets(temp_buffer,80,fin)!=NULL){temp_buffer[strlen(temp_buffer)-1]='\0';printf("temp_buffer=%s",temp_buffer);///////////////////////////////目录判定if(path[0]!='\0')sprintf(sbuffer,"%s\\%s",temp_buffer,path);elsesprintf(sbuffer,"%s",temp_buffer);///////////////////////////////if (port_connect==0)//send(ns_data, sbuffer, strlen(sbuffer), 0);send(newsocket, sbuffer, strlen(sbuffer), 0);}fclose(fin);sprintf(sbuffer, "226 Transfer completed... \r\n");bytes = send(newsocket, sbuffer, strlen(sbuffer), 0);system("del tmp.txt");//CLOSE the ns_data SOCKET or data port SOCKETif(port_connect==0){closesocket(ns_data);sprintf(sbuffer,"226 Close the data socket... \r\n");bytes = send(newsocket, sbuffer, strlen(sbuffer), 0);ns_data = socket(AF_INET, SOCK_STREAM, 0);}sy_error=0;return 0;}int scdfun(SOCKET newsocket){int i=3,k=0;char name[20],name2[20];int j,count=0;//path overfollowint pathlen;printf("Equivalent to cd \n");while (1){//RECEIVEbytes = recv(newsocket, &rbuffer[i], 1, 0);printf("rbuffer[i]=%c\n",rbuffer[i]);printf("bytes=%d\n",bytes);if ((bytes < 0) || (bytes == 0))break;name[k]=rbuffer[i];name2[k]=rbuffer[i];if (rbuffer[i] == '\0'){name[k] = '\0';name2[k] = '\0';break;}if (rbuffer[i] != '\r'){i++;k++;}}//end whileif(path[0]!='\0')strcat(path,"\\");strcat(path,name);if(strncmp(name2,"..",2)==0){pathlen=strlen(path);for(j=pathlen-1;j>=0;j--){if(path[j]=='\\'){path[j]='\0';count++;}if(count==2){//path[j]='\0';break;}}printf("%d=\n",j);path[j+1]='\0';}printf("path=%s",path);sy_error=0;return 0;}int smdfun(SOCKET newsocket) {char name[20];int i=3,k=0;printf("Equivalent to md \n");while (1) // while loop 3{//RECEIVEbytes = recv(newsocket, &rbuffer[i], 1, 0);printf("rbuffer[i]=%c\n",rbuffer[i]);printf("bytes=%d\n",bytes);if ((bytes < 0) || (bytes == 0))break;name[k]=rbuffer[i];if (rbuffer[i] == '\0'){ /*end on LF*/name[k] = '\0';break;}if (rbuffer[i] != '\r'){i++;k++;/*ignore CR's*/}}order[0]='\0';strcat(order,"md ");strcat(order,path);if(strlen(path)>0)strcat(order,"\\");strcat(order,name);system(order);//CLOSE the ns_data SOCKET or data port SOCKETif(port_connect==0){//closesocket(ns_data);sprintf(sbuffer,"226 Close the data socket... \r\n");bytes = send(newsocket, sbuffer, strlen(sbuffer), 0);//ns_data = socket(AF_INET, SOCK_STREAM, 0);}sy_error=0;return 0;}int sdelfun(SOCKET newsocket){int i=3,k=0;char name[20];printf("Equivalent to del \n");while (1){//RECEIVEbytes = recv(newsocket, &rbuffer[i], 1, 0);printf("rbuffer[i]=%c\n",rbuffer[i]);printf("bytes=%d\n",bytes);if ((bytes < 0) || (bytes == 0))break;name[k]=rbuffer[i];if (rbuffer[i] == '\0'){name[k] = '\0';break;}if (rbuffer[i] != '\r'){i++;k++;}}//end whileorder[0]='\0';strcat(order,"rd ");strcat(order,path);if(path[0]!='\0')strcat(path,"\\");strcat(order,name);system(order);sprintf(sbuffer,"del ok... \r\n");bytes = send(newsocket, sbuffer, strlen(sbuffer), 0);if (bytes == SOCKET_ERROR){HandleError("recv()");sy_error=1;return 1;}sy_error=0;return 0;}void HandleError(char *func){char info[65]= {0};_snprintf(info, 64, "%s: %d\n", func, WSAGetLastError());printf(info);}。
计算机网络通信程序设计__TCP文件传输程序

┊┊┊┊┊┊┊┊┊┊┊┊┊装┊┊┊┊┊订┊┊┊┊┊线┊┊┊┊┊┊┊┊┊┊┊┊┊目录一、实验名称:TCP文件传输程序 (2)二、实验要求 (2)三、总体规划 (2)1、网络传输协议的选择 (2)2、TCP协议在VC++中的实现 (2)3、传输数据的缓冲问题 (3)4、Socket的文件化管理 (3)5、数据的串行化问题 (4)6、接收数据判断是否传输完毕的方法 (4)四、实验运行测试 (4)五、心得体会 (7)六、程序源代码 (7)1、建立服务器侦听套接字的类CListenSocket的定义与实现 (7)2、建立数据传输套接字的类CTransSocket的定义与实现 (8)3、用于数据串行化的类CSave的定义与实现: (8)4、主对话框CTcpDlg类的定义与实现: (9)七、参考文献 (19)┊┊┊┊┊┊┊┊┊┊┊┊┊装┊┊┊┊┊订┊┊┊┊┊线┊┊┊┊┊┊┊┊┊┊┊┊┊一、实验名称:TCP文件传输程序二、实验要求1、设计一个应用程序,该应用程序能够实现网络中两台计算机之间传输文件。
2、一个程序既能够建立服务器又能够以终端的形式连接服务器。
3、终端或者服务器既能够发送文件又能够接收文件。
4、传送文件类型应为任何类型,文件大小为任意。
三、总体规划1、网络传输协议的选择在TCP/IP协议栈中,有两个高级协议是我们网络应用程序编写者应该了解的,它们"传输控制协议"(Transmission Control Protocol,简称TCP)和"用户数据报协议"(User Datagrm Protocol,简称UDP)。
TCP是面向连接的通信协议,TCP提供两台计算机之间的可靠无错的数据传输。
应用程序利用TCP进行通信时,源和目标之间会建立一个虚拟连接。
这个连接一但建立,两台计算机之间就可以把数据当作一个双向字节流进行交换。
UDP是无连接通信协议,UDP不保证可靠数据的传输,但能够向若干个目标发送数据,接收发自若干个源的数据。
计算机网络实验报告 tcp协议

计算机网络实验报告 tcp协议计算机网络实验报告:TCP协议一、引言计算机网络是现代社会中不可或缺的一部分,而其中最重要的组成部分之一就是传输控制协议(TCP)。
TCP协议是一种可靠的、面向连接的协议,它在保证数据可靠传输的同时,提供了流量控制和拥塞控制等重要功能。
本实验旨在深入了解TCP协议的原理和工作机制,通过实际操作和观察,进一步加深对TCP协议的理解。
二、实验目的1. 了解TCP协议的基本原理和工作机制;2. 熟悉TCP连接的建立和终止过程;3. 掌握TCP的流量控制和拥塞控制机制;4. 通过实验验证TCP协议的可靠性和效率。
三、实验环境本实验使用了一台运行着Linux操作系统的计算机,通过该计算机可以模拟TCP协议的各种操作和行为。
四、实验步骤1. TCP连接的建立在本实验中,我们使用了一个简单的客户端-服务器模型来模拟TCP连接的建立过程。
首先,在服务器端启动一个监听进程,等待客户端的连接请求。
然后,在客户端发起连接请求时,服务器接受该请求,并建立一个TCP连接。
在这个过程中,可以观察到TCP三次握手的过程,即客户端发送SYN包,服务器回应SYN+ACK包,最后客户端发送ACK包,完成连接的建立。
2. TCP连接的终止TCP连接的终止过程也是一个重要的实验内容。
在本实验中,我们通过发送一个特殊的FIN包来终止一个已建立的TCP连接。
在终止过程中,可以观察到TCP四次挥手的过程,即一方发送FIN包,另一方回应ACK包,然后另一方也发送FIN包,最后再回应ACK包,完成连接的终止。
3. TCP的流量控制TCP通过使用滑动窗口机制来实现流量控制。
在本实验中,我们可以通过调整滑动窗口的大小,观察到数据发送和接收的速度变化。
当滑动窗口的大小较小时,发送方发送的数据量较小,接收方的处理速度较慢;而当滑动窗口的大小较大时,发送方发送的数据量较大,接收方的处理速度较快。
通过实验可以验证TCP流量控制的有效性。
文件传输协议的简单设计与实现(课程设计)

文件传输协议的简单设计与实现
课程设计内容:
学会利用已有网络环境设计并实现简单应用层协议,掌握TCP/IP网络应用程序基本的设计方法和技巧,加深对C/S工作模式的认识。
用winsocket编程接口编写两个程序,分别为客户端程序(ftpclient)和服务器程序(ftpserver)。
程序应实现下述命令功能:
get: 获取服务器一个文件
put:给服务器传送一个文件
pwd: 显示服务器当前目录
cd: 改变服务器当前目录
?: 显示命令列表
quit:退出程序并返回
课程设计基本要求
(1)加深对网络原理的理解,提高综合运用本课程所学知识的能力
(2)培养查阅手册及文献资料的能力,培养独立思考,深入研究、分析问题、解决问题能力
(3)通过实际分析设计、编程调试,掌握计算机网络通信的基本规程,以及协议的利用方法,体会体系结构分层的思路。
(4)按要求编写课程设计报告书,能正确阐述设计和设计结果、正确绘制系统和程序框图。
(5)第15周提交课程设计报告。
《计算机网络系统实践》课程设计报告-多线程网络文件传输

《计算机网络系统实践》报告设计题目:多线程网络文件传输学生姓名:学号:专业班级:计算机科学与技术2016 年 1 月一、设计要求1.实现单线程文件传输2.实现多线程文件传输3.增加异常控制,增强程序的鲁棒性4.了解使用winsocket编程5.了解文件传输过程二、开发环境与工具工具Visual studio 2013 QT5 C++系统 win8.1 8g内存 cpu i7 3632qm三、设计原理利用QT设计简单的图形界面利用winsocket编程TCP方式实现网络通信(阻塞方式)利用windows线程函数和临界区实现多线程控制四、系统功能描述及软件模块划分客户端:有简单的GUI,可以选择存储路径,服务端IP,通信端口PORT,多线程或单线程,向服务端发起下载请求,并开始下载服务端:有简单的GUI,可以选择显示文件路径,选择通信端口PORT,选择多线程或单线程,一旦开启,进入阻塞状态,知道客户端连入,开始传输文件五、设计步骤//客户端单线程接收函数void Client::getready(){WORD socketVersion = MAKEWORD(2, 0);if (WSAStartup(socketVersion, &wsaData) != 0){QMessageBox::warning(this, tr("Warning"),tr("Init socket dll error!"), QMessageBox::Yes);exit(1);}//创建socketSOCKET c_Socket = socket(AF_INET, SOCK_STREAM, 0);if (SOCKET_ERROR == c_Socket){QMessageBox::warning(this, tr("Warning"),tr("Create Socket Error!"), QMessageBox::Yes);exit(1);}//指定服务端的地址sockaddr_in server_addr;bool ok;u_short us_port = port.toUShort(&ok, 10);char* cip;QByteArray QBA = ip.toLatin1();cip = QBA.data();server_addr.sin_family = AF_INET;server_addr.sin_addr.S_un.S_addr = inet_addr(cip);server_addr.sin_port = htons(us_port);if (SOCKET_ERROR == ::connect(c_Socket, (SOCKADDR*)&server_addr, sizeof(server_addr))){QMessageBox::warning(this, tr("Warning"),tr("Can Not Connect To Server IP!"), QMessageBox::Yes);exit(1);}char buffer[BUFFER_SIZE];memset(buffer, 0, BUFFER_SIZE);char* cpath;QByteArray QBAp = path.toLatin1();cpath = QBAp.data();FILE * fp = fopen(cpath, "wb"); //windows下是"wb",表示打开一个只写的二进制文件if (NULL == fp){QMessageBox::warning(this, tr("Warning"),tr("File Can Not Open To Write"), QMessageBox::Yes);exit(1);}else{memset(buffer, 0, BUFFER_SIZE); //初始化缓冲区int length = 0;//开始接收文件while ((length = recv(c_Socket, buffer, BUFFER_SIZE, 0)) > 0){if (fwrite(buffer, sizeof(char), length, fp) < length){QMessageBox::warning(this, tr("Warning"),tr("File Write Failed!"), QMessageBox::Yes);break;}memset(buffer, 0, BUFFER_SIZE);}lalbelMSS->setText("Transform Completed");}fclose(fp);closesocket(c_Socket);lalbelMSS->setText("Transform Completed");//释放winsock库WSACleanup();}//server端线程函数1,主要用于多线程传输时分块发送文件DWORD WINAPI Server::GetFileProc1(LPVOID lparam){Server*p = (Server *)lparam;sockaddr_in server_addr1;//设置默认地址信息并初始化socketserver_addr1.sin_family = AF_INET;server_addr1.sin_addr.s_addr = INADDR_ANY;server_addr1.sin_port = htons(5679);SOCKET m1_Socket = socket(AF_INET, SOCK_STREAM, 0);sockaddr_in client_addr1;bind(m1_Socket, (sockaddr*)&server_addr1, sizeof(server_addr1));listen(m1_Socket, 5);int client_addr_len1 = sizeof(client_addr1);SOCKET m1_New_Socket = accept(m1_Socket, (sockaddr *)&client_addr1, &client_addr_len1); //此处阻塞char buffer1[BUFFER_SIZE];memset(buffer1, 0, BUFFER_SIZE);EnterCriticalSection(&cs);//设置临界区char* cpath;QByteArray QBAp = p->path.toLatin1();cpath = QBAp.data();int FileLen_t = p->FileLen; //获得主线程通信时获得的文件长度int Seek =0;FILE * fp = fopen(cpath, "rb"); //windows下是"rb",表示打开一个只du的二进制文件LeaveCriticalSection(&cs);if (NULL == fp){exit(1);}else{memset(buffer1, 0, BUFFER_SIZE);int length = 0;while (FileLen_t > 0){EnterCriticalSection(&cs);int length = fread(buffer1, sizeof(char), BUFFER_SIZE, fp);LeaveCriticalSection(&cs);if (FileLen_t >length ){send(m1_New_Socket, buffer1, length, 0);}else{send(m1_New_Socket, buffer1, FileLen_t, 0);}Sleep(100);memset(buffer1, 0, BUFFER_SIZE);FileLen_t = FileLen_t - length;}}closesocket(m1_New_Socket);closesocket(m1_Socket);fclose(fp);}六、关键问题及其解决方法多线程传输文件时,不可以多个socket使用一个端口来发送,否则会出现错误,需要每个线程都创建自己的socket连接来保证文件的顺序。
计算机网络编程实验报告(实现TCP、UDP数据传输)

package internet;
import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import .Socket;
package internet;
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import .ServerSocket; import .Socket;
建立 Socket 连接至少需要一对套接字,其中一个运行于客户端,称为 ClientSocket ,另一个运行于服务器端,称为 ServerSocket 。
套接字之间的连接过程分为三个步骤:服务器监听,客户端请求,连接确认。 服务器监听:服务器端套接字并不定位具体的客户端套接字,而是处于等待连接 的状态,实时监控网络状态,等待客户端的连接请求。
public class UDPserver { public static void main(String[] args) throws IOException{ /* * 接收客户端发送的数据 */ DatagramSocket socket=new DatagramSocket(10086); // 创 建 服 务 器 端
的连接
System.out.println(s.getInetAddress().getHostAddress()+"...connection");
网络传输协议的设计与实现

网络传输协议的设计与实现网络传输协议是计算机网络中实现数据传输的必要手段。
在计算机网络中,数据需要通过不同的协议来传递,而每种协议都有其自身的传输方式和规范。
在本文中,将会探讨网络传输协议的设计与实现。
一、网络传输协议的定义与分类网络传输协议是计算机网络中用于数据传输的规范,它规定了计算机之间数据传输的方式和流程。
一般来说,网络传输协议是在传输层中运行的,它可以充分利用底层网络设施,承载上层应用程序传输的数据。
网络传输协议可以分为两种:面向连接的协议和无连接的协议。
面向连接的协议要求发送方和接收方之间建立一个连接,然后才能进行数据传输。
而无连接的协议则不需要建立连接,直接进行数据传输即可。
TCP和UDP是两种最为常见的面向连接和无连接协议。
二、网络传输协议的设计网络传输协议的设计需要考虑多个方面,包括安全性、可靠性、效率等等。
下面将针对这些方面进行具体的探讨。
1.安全性在网络传输中,数据容易被黑客攻击、篡改、窃取等等。
因此,网络传输协议的设计必须考虑如何防止这些问题的发生。
目前,常用的网络传输协议安全机制有两种:SSL和SSH。
SSL(Secure Sockets Layer)是一种基于密码学的安全传输协议,它可以在应用层和传输层之间提供安全性保障。
SSL使用数字证书来认证服务器,然后通过公钥加密方式来确保数据传输的安全。
SSH(Secure Shell)是一种广泛应用于网络管理中的安全协议。
它可以在网络传输过程中进行身份认证和加密通信,对于进行网络管理操作的用户来说,SSH提供了更加安全的通信保障。
2.可靠性网络传输协议要保证数据传输的可靠性,即数据不会在传输过程中出现丢失、损坏等问题。
TCP协议是一种可靠传输协议。
在TCP协议中,数据传输会根据顺序进行分段处理,并通过数据包确认机制保证数据的可靠性。
当一个数据包没有响应时,发送方会重新发送数据,直到数据被接收方正确接收为止。
3.效率网络传输协议在追求可靠性的同时还需要考虑传输效率。
传输协议课程设计方案模板

一、课程名称:传输协议课程设计二、课程目标:1. 使学生掌握传输协议的基本概念、原理和关键技术;2. 培养学生独立分析和解决问题的能力;3. 提高学生的实践操作能力,为今后从事相关领域的工作打下基础。
三、课程内容:1. 传输协议概述1.1 传输协议的发展历程1.2 传输协议的作用和意义1.3 传输协议的分类2. 传输协议的核心技术2.1 分组交换技术2.2 流量控制技术2.3 错误控制技术2.4 负载均衡技术3. 传输协议的分类与比较3.1 TCP协议3.2 UDP协议3.3 HTTP协议3.4 FTP协议3.5 常见传输协议的比较4. 传输协议的应用场景与案例分析4.1 网络通信场景4.2 实时通信场景4.3 分布式计算场景4.4 案例分析5. 传输协议的未来发展趋势与挑战5.1 5G通信技术对传输协议的影响5.2 网络切片技术对传输协议的影响5.3 安全传输协议的发展趋势5.4 挑战与展望四、课程设计任务:1. 设计一种基于TCP协议的可靠传输系统;2. 设计一种基于UDP协议的实时传输系统;3. 分析HTTP协议的工作原理,并设计一个简单的HTTP服务器;4. 比较TCP和UDP协议在文件传输和实时通信场景下的优缺点;5. 分析5G通信技术对传输协议的影响,并提出相应的解决方案。
五、课程设计要求:1. 设计方案应具有一定的创新性,能够解决实际问题;2. 设计方案应具有良好的可读性和可维护性;3. 设计方案应遵循相关标准和规范;4. 设计方案应包括以下内容:1. 设计思路2. 技术路线3. 实现方法4. 测试与分析六、课程评价:1. 设计方案的合理性、创新性和实用性;2. 设计方案的完整性和规范性;3. 设计方案的实现效果;4. 学生在课程设计过程中的表现。
七、课程总结:1. 总结课程设计过程中的收获和体会;2. 分析设计过程中遇到的问题及解决方法;3. 对传输协议技术的未来发展趋势进行展望。
高三计算机课件 网络课程设计报告-利用C 实现SMTP协议 精品推荐

利用C++实现SMTP协议1.概述SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,是一种提供可靠且有效电子邮件传输的协议。
SMTP是建立在FTP文件传输服务上的一种邮件服务,主要用于传输系统之间的邮件信息并提供与来信有关的通知。
SMTP目前已是事实上的在Internet传输E-Mail的标准,是一个相对简单的基于文本的协议。
在其之上指定了一条消息的一个或多个接收者(在大多数情况下被确定是存在的),然后消息文本就传输了。
可以很简单地通过Telnet程序来测试一个SMTP服务器,SMTP使用TCP端口25。
要为一个给定的域名决定一个SMTP服务器,需要使用MX(Mail eXchange)DNS。
1.1设计题目及实现目标设计题目:利用C++实现SMTP协议;实现目标:实现SMTP协议的基本功能,包括客户机的命令与数据。
1.2开发环境简介本次开发用Visual C++ 6.0作为开发环境。
VC++是微软公司开发的一个IDE(集成开发环境),换句话说,就是使用c++的一个开发平台.有些软件就是这个编出来的...另外还有VB,VF.只是使用不同语言.但是,vc++是Windows平台上的C++编程环境,学习VC要了解很多Windows平台的特性并且还要掌握MFC、ATL、COM等的知识,难度比较大。
Windows下编程需要了解Windows 的消息机制以及回调(callback)函数的原理;MFC是Win32API的包装类,需要理解文档视图类的结构,窗口类的结构,消息流向等等;COM是代码共享的二进制标准,需要掌握其基本原理等等。
VC作为一个主流的开发平台一直深受编程爱好者的喜爱,但是很多人却对它的入门感到难于上青天,究其原因主要是大家对他错误的认识造成的,严格的来说VC++不是门语言,虽然它和C++之间有密切的关系,如果形象点比喻的话,可以C++看作为一种”工业标准”,而VC++则是某种操作系统平台下的”厂商标准”,而”厂商标准”是在遵循”工业标准”的前提下扩展而来的。
文件传输协议课程设计

计算机网络课程设计报告题目:文件传输协议的设计与实现学院:信息工程学院班级:双学位13级学号:2012015220姓名:任志永目录1.课程设计目的和要求2.背景知识3.课程设计分析4.程序清单5.运行结果6.总结1.课程设计目的和要求文件传输是各种计算机的网络的基本功能,文件传送协议是一种最基本的应用层协议。
它是按照客户或服务器模式进行的工作,提供交式的访问。
是INTERNRT使用最广泛的协议之一。
以及深入了解计算机网络是建立在TCP/IP网络体系结构上。
用 socket 编程接口编写俩个程序,分别为客户程序和服务器程序1.掌握TCP/IP 网络应用程序基本的设计方法;2.用socket 编程接口编写两个程序,分别为客户程序(client.c)和服务器程序(server.c);3.撰写课程设计说明书。
装订后的课程设计说明书不少于10面(含封面、任务书、目录、正文、参考文献、成绩评定表、封底)。
2.背景知识第一个FTP的RFC由A.K.Bhushan 在1971年提出,同时由MIT 与Harvard实验实现,RFC 172提供了主机间文件传输的一个用户级协议。
长期发展过程由于底层协议从NCP改变为TCP,RFC765定义了采用TCP的FCP.FTP协议在今天已经发展成熟,应用也越来越广很多开发的比较成熟的FTP 客户端软件已经得到了广泛的应用.3.课程设计分析Server端Client端创建ServerSocket对象,在某端口提供监听服务Client端等待来自Client端的服务请求接受Client端的请求,用返回的创建Socket对象,向ServerSocket建立连接的监听端口请求通过向Socket中读写数据来通过向新的Socket中读写数与Client端通信据来与Server端通信关闭Socket,结束与Server端的通信关闭Socket,结束与当前Client的通信,等待其他请求关闭ServerSocket对象,结束监听服务4.程序清单:1.服务器源代码:#include <Winsock2.h>#include <stdio.h>#include <iostream>using namespace std;#pragma comment(lib, "wsock32.lib")#define PORT 4523char buf_send[1024];char buf_rec[1024];SOCKET sockSrv;//socket初始化DWORD CreateSocket(){WSADATA WSAData;//WSADATA结构被用来保存函数WSAStartup返回的Windows Sockets初始化信息if(WSAStartup(MAKEWORD(2,2),&WSAData)!=0)//WSAStartup完成winsock的初始化{printf("socket initialize failed!\n");return (-1);}sockSrv=socket(AF_INET,SOCK_STREAM,0);//定义为面向连接的,返回值送给sockSrvif(sockSrv==SOCKET_ERROR){printf("socket create failed ! \n");WSACleanup();//中止Windows Sockets DLL的使用return(-1);}SOCKADDR_IN addrSrv;//TCP/IP使用SOCKADDR_IN 定义地址addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//计算机IP地址addrSrv.sin_port=htons(PORT);//协议端口号addrSrv.sin_family=AF_INET;//地址所属协议簇//绑定端口if(bind(sockSrv,(struct sockaddr FAR *)&addrSrv,sizeof(addrSrv))==SOCKET_ERROR){printf("Bind Error");return(-1);}return (1);}int SendFileRecord(SOCKET datatcps,WIN32_FIND_DATA *pfd)//用于回复给客户端{char filerecord[MAX_PATH+32];FILETIME ft;FileTimeToLocalFileTime(&pfd->ftLastWriteTime,&ft);//将一个FILETIME结构转换成本地时间SYSTEMTIME lastwtime;//系统时间FileTimeToSystemTime(&ft,&lastwtime);//根据一个FILETIME结构的内容,装载一个SYSTEMTIME 结构char *dir=pfd->dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY?"<DIR>":" ";sprintf(filerecord,"%04d-%02d-%02d %02d:%02d %5s %10d %-20s\n",lastwtime.wYear,lastwtime.wMonth,lastwtime.wDay,lastwtime.wHour,lastwtime.wMinute,dir,pfd->nFileSizeLow,pfd->cFileName);if(send(datatcps,filerecord,strlen(filerecord),0)==SOCKET_ERROR)//发送回复失败{printf("Error occurs when sending file list!\n");return 0;}return 1;}//发送主机文件目录int SendFileList(SOCKET datatcps){HANDLE hff;WIN32_FIND_DATA fd; //获取和更改文件属性hff=FindFirstFile("*",&fd);//搜索文件if(hff==INVALID_HANDLE_VALUE)//搜索无效返回值{const char *errstr="can't list files!\n";cout<<"list file error!"<<endl;if(send(datatcps,errstr,strlen(errstr),0)==SOCKET_ERROR){cout<<"error occurs when sending file list!"<<endl;}closesocket(datatcps);return 0;}BOOL fMoreFiles=TRUE;//BOOL型,返回值为大于0的整数时为TRUE,返回值为0时候,为FALSE,返回值为-1时为ERROR。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计课程名称计算机网络课程设计题目名称文件传输协议的简单设计与实现学生学院专业班级___ _学号学生姓名______ _________指导教师______ _____2010 年 1 月 5 日设计摘要关键词:SOCKET编程,FTPclient/server程序摘要:本课程设计包含了文件传输协议的简单设计与实现。
文件传送是各种计算机网络实现的基本功能,文件传送协议是一种最基本的应用层协议按照客户/服务器的模式进行工作,提供交互式的访问,是INTERNET使用最广泛的协议之一。
文件传输协议的简单设计与实现建立在计算机网络实验环境TCP/IP 网络体系结构之上,使用socket 编程接口编写两个程序,分别为客户程序(client.c)和服务器程序(server.c),实现下述命令功能:get , put, pwd, dir, cd, ?, quit 等,利用了已有网络环境设计并实现简单应用层协议。
本设计包括了具体设计任务,基本思路及所涉及的相关理论,设计流程图,调试过程中出现的问题及相应解决办法,实验运行结果,核心程序,个人体会及建议等。
目录1、文件传输协议的简单设计与实现------------------------------181. 1 具体设计任务----------------------------------------------18 1.2 基本思路及所涉及的相关理论--------------------------------181.2.1基本思路-------------------------------------------------182.2.2 相关理论--------------------------------------------18 1.3设计流程图------------------------------------------------191.4实验运行情况----------------------------------------------191.5 核心程序--------------------------------------------------222.5.1 服务器(sever)程序---------------------------------222.5.2 客户(client)程序----------------------------------291.6心得体会-----------------------------------------------------------------------------37参考文献--------------------------------------------------------382、文件传输协议的简单设计与实现2. 1 具体设计任务计算机网络实验环境建立在TCP/IP 网络体系结构之上。
各计算机除了安装TCP/IP 软件外,还安装了TCP/IP 开发系统。
实验室各计算机具备Windows环境中套接字socket 的编程接口功能,可为用户提供全网范围的进程通信功能。
本实验要求利用这些功能,设计和实现一个简单的文件传送协议。
用socket 编程接口编写两个程序,分别为客户程序(client.c)和服务器程序(server.c),该程序应能实现下述命令功能:get:取远方的一个文件put:传给远方一个文件pwd:显示远主当前目录dir:列出远方当前目录cd :改变远方当前目录?:显示你提供的命令quit :退出返回2.2基本思路及所涉及的相关理论2.2.1基本思路设计程序使客户端连接的时候,服务器将会向客户端发回一条消息告知它的IP地址,然后关闭连接并继续接收端口的连接。
建立各个命令功能对应的函数,发送请求,等待服务器端的服务。
服务器端初始化WinSock,创建SOCKET,获取主机信息,并对客户端进行会话,发送回复讯息给客户端,响应完毕后关闭连接,释放WinSock。
2.2.2 相关理论文件传送是各种计算机网络都实现的基本功能,文件传送协议是一种最基本的应用层协议按照客户/服务器的模式进行工作,提供交互式的访问,是INTERNET使用最广泛的协议之一。
计算机网络实验环境建立在TCP/IP 网络体系结构之上。
各计算机除了安装TCP/IP 软件外,还安装了TCP/IP 开发系统。
实验室各计算机具备Windows 环境中套接字socket 的编程接口功能,可为用户提供全网范围的进程通信功能。
本设计利用这些功能,设计和实现一个简单的文件传送协议。
用socket 编程接口编写两个程序,分别为客户程序(client.c)和服务器程序(server.c)。
2.3 设计流程图2.4实验运行情况服务器端运行,默认自动启动监听,情况如下图:服务如果关闭监听,效果如下图:客服端运行,如下图:输入服务器端的IP和端口号进行连接,效果如图:下面设置文件保存位置,如图:下面演示上传一个视频文件,然后再下载下来,其中上传过程的进度信息:上传完成后的效果图:下载文件的进度提示信息:下载完成后,指定目录下就有了该文件了:2.5 核心程序2.5.1 服务器(server)程序如下using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading;using ;using .Sockets;using System.IO;using System.Windows.Forms;namespace TCP文件传输_服务器{class WorkThread{byte[] buffer;int bufferSize= 4096;Thread mythread;Socket handler;public WorkThread(Socket workSocket){handler = workSocket;buffer = new byte[bufferSize];mythread = new Thread(BeginCommunication);}public void Start(){mythread.Start();}public void Abort(){mythread.Abort();}private void BeginCommunication(){while (true)//从客户端接收数据,直到连接断开{try{int reCount = handler.Receive(buffer);string insStr =Encoding.BigEndianUnicode.GetString(buffer, 0, reCount);if (insStr.Substring(0, 4) == "name")//收到下文件请求{string fileName = insStr.Substring(5, insStr.Length - 5);SendFile(fileName, handler);}else if (insStr.Substring(0, 4) == "boot")//收到获取根目录请求 {string listStr = GetFileNames("F:", false);SendString(handler, listStr);}else if (insStr.Substring(0, 4) == "path")//收到获取指定目录内容请求{string path = insStr.Substring(5, insStr.Length - 5);string listStr = GetFileNames(path, false);SendString(handler, listStr);}else if (insStr.Substring(0, 4) == "Queu")//获取下载文件夹请求,回复完整文件名列表{string path = insStr.Substring(5, insStr.Length - 5);string listStr = GetFileNames(path, true);SendString(handler, listStr);}else if (insStr.Substring(0, 4) == "upld")//收到上传文件请求{string reFileName = insStr.Substring(5, insStr.Length - 5);LoadFile(reFileName, handler);}else if (insStr.Substring(0, 4) == "quit")//收到断开连接命令{HostQuit();break;}}catch { HostQuit();break; }}}private void LoadFile(string reFileName, Socket handler){try{FileStream fs = new FileStream(reFileName, FileMode.Create, FileAccess.Write);handler.Receive(buffer, 8, SocketFlags.None);//接收文件大小long filesize = BitConverter.ToInt64(buffer, 0);long receiveCount = 0;while (receiveCount < filesize)//接收文件{int readcount = handler.Receive(buffer, bufferSize, SocketFlags.None);fs.Write(buffer, 0, readcount);receiveCount += readcount;}fs.Close();}catch{HostQuit();}}private void SendFile(string fileNmae, Socket handler){try{FileStream fs = new FileStream(fileNmae, FileMode.Open, FileAccess.Read);long size = fs.Length;byte[] bysize = BitConverter.GetBytes(size);handler.Send(bysize, 8, SocketFlags.None);//发送文件大小BinaryReader br = new BinaryReader(fs);int sendcount = 0;while (sendcount < size)//发送文件{int readcount = br.Read(buffer, 0, bufferSize);sendcount += readcount;handler.Send(buffer, readcount, SocketFlags.None); }}catch{HostQuit();}}private void HostQuit(){GlobalValues.canControl.WaitOne();GlobalValues.canControl.Release();if (handler.Connected == true){handler.Shutdown(SocketShutdown.Both);handler.Close();}}private void SendString(Socket handler,string listStr){byte[] list = Encoding.BigEndianUnicode.GetBytes(listStr);byte[] listcountbuffer =BitConverter.GetBytes(Convert.ToInt64(list.Length));try{handler.Send(listcountbuffer, 8, SocketFlags.None);//发送列表大小int sendcount = 0;while (sendcount < list.Length)//发送列表{if (sendcount + bufferSize < list.Length)//不是最后一次{int i = handler.Send(list, sendcount, bufferSize, SocketFlags.None);sendcount += i;}else{int i= handler.Send(list, sendcount, list.Length- sendcount, SocketFlags.None);//发送最后一次sendcount += i;}}}catch (Exception e){MessageBox.Show("连接断开.");}}//fileOnly=true则获取指定目录及子目录内所有文件信息,fileOnly=false则获取指定目录文件信息及文件夹信息private string GetFileNames(string path, bool fileOnly){string listStr = string.Empty;DirectoryInfo drct = new DirectoryInfo(path);foreach (FileSystemInfo fsi in drct.GetFileSystemInfos()){if (fsi is FileInfo){//文件FileInfo fi = (FileInfo)fsi;listStr += fi.FullName;listStr += "\n";if (fi.Length < 1024){string sizeStr = fi.Length.ToString() + "字节";listStr += sizeStr;}else if (fi.Length < 1024 * 1024){double temp = Convert.ToDouble(fi.Length) / 1024;string sizeStr = string.Format("{0:F1}", temp) + "KB";listStr += sizeStr;}else if (fi.Length < 1024 * 1024 * 1024){double temp = Convert.ToDouble(fi.Length) / 1024 / 1024;string sizeStr = string.Format("{0:F1}", temp) + "MB";listStr += sizeStr;}else{double temp= Convert.ToDouble(fi.Length) / 1024 / 1024 / 1024;string sizeStr = string.Format("{0:F1}", temp) + "GB";listStr += sizeStr;}listStr += "\n";listStr += stWriteTime.ToString("yyyy-MM-dd hh:mm:ss");listStr += "\n";}else if (fsi is DirectoryInfo){if (fileOnly){listStr += GetFileNames(fsi.FullName, true);}else{//文件夹DirectoryInfo di = (DirectoryInfo)fsi;listStr += di.FullName;listStr += "\n";listStr += "dir";listStr += "\n";listStr+= stWriteTime.ToString("yyyy-MM-dd hh:mm:ss");listStr += "\n";}}}return listStr;}}}public服务器(){InitializeComponent();Control.CheckForIllegalCrossThreadCalls = false;string HostName = Dns.GetHostName(); //得到主机名IPHostEntry IpEntry = Dns.GetHostEntry(HostName); //得到主机IPstring strIPAddr = IpEntry.AddressList[0].ToString();tsTxb_IPAdd.Text = strIPAddr;hostIPAddress = IPAddress.Parse(strIPAddr);Server = new IPEndPoint(hostIPAddress,Convert.ToInt32(tsTxb_Port.Text));sock = new Socket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp);sock.Bind(Server);sock.Listen(10);string str = "正在监听端口 " + tsTxb_Port.Text + "...";tsLbl_Status.Text = "状态:" + str;AcceptTh = new Thread(ThAccept);AcceptTh.Start();//开始监听端口}//下面是监听和停止监听的按钮事件private void btn_Start_Click(object sender, EventArgs e){tsBtn_Start.Enabled = false;tsBtn_Stop.Enabled = true;Server= new IPEndPoint(hostIPAddress, Convert.ToInt32(tsTxb_Port.Text));sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);sock.Bind(Server);sock.Listen(10);string str = "正在监听端口 " + tsTxb_Port.Text + "...";tsLbl_Status.Text = "状态:" + str;AcceptTh = new Thread(ThAccept);AcceptTh.Start();}private void btn_stop_Click(object sender, EventArgs e){tsBtn_Start.Enabled = true;tsBtn_Stop.Enabled = false;try{sock.Shutdown(SocketShutdown.Both);}catch { }sock.Close();tsLbl_Status.Text = "状态:已停止监听";}2.5.2 客户(client)程序//MyThread.cs中的实现using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.IO;using .Sockets;using System.Threading;using System.Windows.Forms;namespace客户端_TCP文件传输{public class myThread{Thread downloadTh;Thread uploadTh;Socket wordSocket;string fileName;string savePath;byte[] buffer;const int bufferSize = 4096;ToolStripProgressBar tspBar;ToolStripStatusLabel speed;int startTime=0;long receivecount = 0;long sendCount = 0;int upOrDown = 1;//指示上传或下载System.Windows.Forms.Timer timer1 = new System.Windows.Forms.Timer();public myThread(Socket workSock, string FileName,string SavePath, ref ToolStripProgressBar TspBar, ref ToolStripStatusLabel Speed){wordSocket = workSock;fileName = FileName;savePath = SavePath;buffer = new byte[bufferSize];downloadTh = new Thread(new ThreadStart(Download));uploadTh = new Thread(new ThreadStart(Upload));tspBar = TspBar;speed = Speed;}public myThread(Socket workSock, string FileName,ref ToolStripProgressBar TspBar, ref ToolStripStatusLabel Speed){wordSocket = workSock;fileName = FileName;buffer = new byte[bufferSize];downloadTh = new Thread(new ThreadStart(Download));uploadTh = new Thread(new ThreadStart(Upload));tspBar = TspBar;speed = Speed;}public void StartDownload(){upOrDown = 1;downloadTh.Start();timer1.Enabled = true;timer1.Interval = 100;timer1.Tick += new EventHandler(timer1_Tick);startTime = System.Environment.TickCount;timer1.Start();}public void StartUpload(){upOrDown = 0;uploadTh.Start();timer1.Enabled = true;timer1.Interval = 50;timer1.Tick += new EventHandler(timer1_Tick);startTime = System.Environment.TickCount;timer1.Start();}void timer1_Tick(object sender, EventArgs e){int spentTime = System.Environment.TickCount - startTime;if (spentTime != 0){if (upOrDown == 1){double sp = Convert.ToDouble(receivecount) /Convert.ToDouble(spentTime) * 1000 / 1024;if (sp < 1024)speed.Text = tspBar.Value.ToString() + "% 下载速度:" + string.Format("{0:F1}", sp) + "KB";else speed.Text = tspBar.Value.ToString() + "% 下载速度:" + string.Format("{0:F1}", sp / 1024) + "MB/S";}else{double sp = Convert.ToDouble(sendCount) /Convert.ToDouble(spentTime) * 1000 / 1024;if (sp < 1024)speed.Text = tspBar.Value.ToString() + "% 上传速度:" + string.Format("{0:F1}", sp) + "KB";else speed.Text = tspBar.Value.ToString() + "% 上传速度:" + string.Format("{0:F1}", sp / 1024) + "MB/S";}}}private void Download(){try{string ins = "name=" + fileName;byte[] data = Encoding.BigEndianUnicode.GetBytes(ins);wordSocket.Send(data, data.Length, SocketFlags.None);//发送下载请求string reFileName = savePath + "\\" + GetFileName(fileName);Directory.CreateDirectory(savePath);FileStream fs = new FileStream(reFileName, FileMode.Create, FileAccess.Write);wordSocket.Receive(buffer, 8, SocketFlags.None);//接收文件大小long filesize = BitConverter.ToInt64(buffer, 0);while (receivecount < filesize)//接收文件{int readcount = wordSocket.Receive(buffer, bufferSize, SocketFlags.None);fs.Write(buffer, 0, readcount);receivecount += readcount;tspBar.Value = Convert.ToInt32(Convert.ToDouble(receivecount) / Convert.ToDouble(filesize) * 100);}tspBar.Value = 100;timer1_Tick(new object(), new EventArgs());fs.Close();timer1.Stop();StaticValue.isBusy = false;}catch{MessageBox.Show("连接断开.");timer1.Stop();if (wordSocket.Connected == true){wordSocket.Shutdown(SocketShutdown.Both);wordSocket.Close();timer1.Stop();StaticValue.isBusy = false;}}}private void Upload(){try{string shortFileName= fileName.Substring(stIndexOf('\\') + 1, fileName.Length - stIndexOf('\\') - 1);string serverFileName = StaticValue.curServerPath + "\\" + shortFileName;//指定上传到服务器的哪个路径string ins = "upld=" + serverFileName;byte[] byins = Encoding.BigEndianUnicode.GetBytes(ins);wordSocket.Send(byins, byins.Length, SocketFlags.None);//发送上传请求及完整文件名FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);long size = fs.Length;byte[] bysize = BitConverter.GetBytes(size);wordSocket.Send(bysize, 8, SocketFlags.None);//发送上传文件大小BinaryReader br = new BinaryReader(fs);while (sendCount < size)//发送文件{int readcount = br.Read(buffer, 0, bufferSize);sendCount += readcount;wordSocket.Send(buffer, readcount, SocketFlags.None);tspBar.Value = Convert.ToInt32(Convert.ToDouble(sendCount) / Convert.ToDouble(size) * 100);}tspBar.Value = 100;timer1_Tick(new object(), new EventArgs());fs.Close();timer1.Stop();StaticValue.isBusy = false;}catch (Exception e){MessageBox.Show("连接断开.");wordSocket.Shutdown(SocketShutdown.Both);wordSocket.Close();timer1.Stop();StaticValue.isBusy = false;}}public string GetFileName(string fileName){return fileName.Substring(stIndexOf('\\')+1, fileName.Length - stIndexOf('\\')-1);}public string GetFileType(string fileName){return fileName.Substring(stIndexOf('.'), fileName.Length - stIndexOf('.'));}}}//下面给出各按钮点击事件///<summary>///连接服务器按钮点击事件///</summary>///<param name="sender"></param>///<param name="e"></param>private void btn_Connect_Click(object sender, EventArgs e){hostIPAddress = IPAddress.Parse(ttxb_IPAdd.Text);int port =Convert.ToInt32( ttxb_port.Text);Server = new IPEndPoint(hostIPAddress, port);sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);try{sock.Connect(Server);//连接服务器toolStripStatusLabel1.Text = "与远程主机" + ttxb_IPAdd.Text + " " + ttxb_port.ToString() + "连接成功";RefreshListView(GetDtListArray("boot", false));//获取服务器根目录connectDone = true;tsBtn_Connect.Enabled = false;tsBtn_DisConnect.Enabled = true;}catch{MessageBox.Show("连接失败.");if (sock.Connected == true){sock.Shutdown(SocketShutdown.Both);sock.Close();}}}///<summary>///下载文件点击事件///</summary>///<param name="sender"></param>///<param name="e"></param>private void btn_GetFile_Click(object sender, EventArgs e){DownLoad(listView1);//调用自定义方法下载文件}private void DownLoad(ListView listView1){if(listView1.SelectedIndices.Count> 0 && listView1.SelectedIndices[0] !=0)//有选定项且选定的不是"返回上层"{string size=listView1.SelectedItems[0].SubItems[1].Text;if ( size!= "")//如果选定的是文件{listView2.Items.Add(listView1.SelectedItems[0].SubItems[0].Text);listView2.Items[listView2.Items.Count-1].SubItems.Add(size);//将文件大小加入listViewlistView2.Items[listView2.Items.Count-1].ImageIndex =ICOSearcher.GetIcoIndex(listView1.SelectedItems[0].SubItems[0].Text);//获取该文件的图标int index = listView1.SelectedIndices[0] - 1;string FileName = fullNameList[index];downloadItem newfile = new downloadItem(FileName,StaticValue.curSavePath);downQueue.Enqueue(newfile);}else//如果是文件夹{string downPath=StaticValue.curServerPath +"\\"+listView1.SelectedItems[0].SubItems[0].Text;string[] listArray = GetDtListArray(downPath, true);Queue<downloadItem> tempQueue = GetDownFileQueue(listArray);while(tempQueue.Count>0){downQueue.Enqueue(tempQueue.Dequeue());}}}}///<summary>///设置保存位置的按钮点击事件///</summary>///<param name="sender"></param>///<param name="e"></param>private void tsBtn_savePath_Click(object sender, EventArgs e) { if (folderBrowserDialog1.ShowDialog() == DialogResult.OK){StaticValue.curSavePath = folderBrowserDialog1.SelectedPath;}}///<summary>///点击断开连接的按钮事件,断开连接,并清空listView等///</summary>///<param name="sender"></param>///<param name="e"></param>private void tsBtn_DisConnect_Click(object sender, EventArgs e)//{try{string ins = "quit";byte[] byins = Encoding.BigEndianUnicode.GetBytes(ins);sock.Send(byins, byins.Length, SocketFlags.None);sock.Shutdown(SocketShutdown.Both);sock.Close();tsBtn_Connect.Enabled = true;tsBtn_DisConnect.Enabled = false;DirLayer = 0;}catch { }toolStripStatusLabel1.Text = "连接已断开";connectDone = false;listView1.Items.Clear();fullNameList.Clear();}///<summary>///双击列表项的事件,返回上一级或者进入到下一级目录///</summary>///<param name="sender"></param>///<param name="e"></param>private void listView1_MouseDoubleClick(object sender, MouseEventArgs e) {if (connectDone&&!StaticValue.isBusy)//如果已连接服务器{if (listView1.SelectedIndices[0] == 0){if (DirLayer > 0){StaticValue.curServerPath = StaticValue.curServerPath.Substring(0,StaticValue.stIndexOf("\\"));//获取父目录DirLayer--;RefreshListView(GetDtListArray(StaticValue.curServerPath, false));}}else{string s =listView1.SelectedItems[0].SubItems[1].Text;if (s == ""){StaticValue.curServerPath =StaticValue.curServerPath + "\\" + listView1.SelectedItems[0].SubItems[0].Text;//获取子目录DirLayer++;RefreshListView(GetDtListArray(StaticValue.curServerPath, false));}else DownLoad(listView1);}}}///<summary>///上传文件的点击事件///</summary>///<param name="sender"></param>///<param name="e"></param>private void tsBtn_Upload_Click(object sender, EventArgs e){openFileDialog1.ShowDialog();string fileName = openFileDialog1.FileName;myThread workThread = new myThread(sock, fileName, ref toolStripProgressBar1, ref toolStripStatusLabel2);workThread.StartUpload();}2.6心得体会通过本次实验,我对网络命令有了一定的概念性认识,并熟悉了基本网络命令的使用,通过miniFTP Client/Server实验的实践,了解了SOCKET编程相关的一些知识以及用法,了解了客户端和服务器端进行通信的相关算法机制,在建立通信的基础上,实现了一些简单的功能。