TCP文件传输程序的设计书

合集下载

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

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

计算机网络技术第四版课程设计一、设计题目本次计算机网络技术课程设计的题目是“基于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协议的实现技术要点,并实现了文件传输过程中常见的断点续传功能和命令行控制。

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

设计文档及使用说明

设计文档及使用说明

大作业:网络Socket编程程序员:熊宇龙200630501407 信息安全5班本程序实现了多客户端访问和一定大小内的文件传输(已测试bmp和txt文件),并且客户端在连接时就将得到服务器端的文件列表。

为方便解说起见,我将研发说明文档和操作说明集中在这里一起了声明:部分源码来自参考书《WINDOWS网络编程》中的TCP连接部分,本程序也是基于其源码上进行了大幅度修改完成的。

大部分研发说明都在程序内写出来了。

我特地用红字表示出来。

其中主要是表示的拓展的地方、需要注意的地方,以及核心的地方。

其他说明:由于时间不够的缘故,本程序旨在实现其传输文件的功能、列表发送以及多客户端多线程传输的功能。

并没有对其人性化进行太多设计,程序员可以按照我在程序中的提示通过直接修改程序达到其他目的(如扩大传输量),主要可修改的包括:1.文件列表,保存在1.txt中可以任意修改,不过请不要对客户端造成欺骗。

2.Buff容量,通过修改DEFAULT_BUFFER 达到目的。

拓展构想:计划内却因为时间关系未完成的的部分包括1.实现任意大小文件传输:可以通过if语句判定大小,产生多个buff文件顺序传输并顺序写入。

不难但是时间不够了。

2.实现断点续传:判定部分遇到了困难,未完成。

具体操作流程图请见最后程序如下:客户端:// Client.c// 声明:部分代码来自《WINDOWS网络编程》一书中关于建立TCP连接的部分// 功能:连接到服务器端并下载文件// 注意:build时请在工程设置中添加ws2_32.lib//// Command Line Options:// client [-p:x] [-s:IP] [-n:x] [-o]// -p:x Remote port to send to// -s:IP Server's IP address or hostname// -n:x Number of times to send message// -o Send messages only; don't receive//#include <iostream.h>#include <winsock2.h>#include <stdio.h>#include <stdlib.h>#define DEFAULT_COUNT 20#define DEFAULT_PORT 5150#define DEFAULT_BUFFER 4096//希望调整最大可传输文件大小请调整此处不要忘了将server的也同样更改#define DEFAULT_MESSAGE "This is a test of the emergency \broadcasting system"char szServer[128],szMessage[1024];int iPort = DEFAULT_PORT;DWORD dwCount = DEFAULT_COUNT;BOOL bSendOnly = FALSE;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 V alidateArgs(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':if (strlen(argv[i]) > 3)iPort = atoi(&argv[i][3]);break;case 's':if (strlen(argv[i]) > 3)strcpy(szServer, &argv[i][3]);break;case 'n':if (strlen(argv[i]) > 3)dwCount = atol(&argv[i][3]);break;case 'o':bSendOnly = TRUE;break;default:usage();break;}}}}int main(int argc, char **argv){WSADATA wsd;SOCKET sClient;char szBuffer[DEFAULT_BUFFER];int ret;struct sockaddr_in server;struct hostent *host = NULL;cout<<"input szServer"<<endl;//这里输入目标服务器地址如果没有输入就会返回错误请使用服务器IP地址cin>>szServer;//如果在本机测试,可使用127.0.0.1本机循环地址作为这个数值ValidateArgs(argc, argv);if (WSAStartup(MAKEWORD(2,2), &wsd) != 0){printf("Failed to load Winsock library!\n");return 1;}strcpy(szMessage, DEFAULT_MESSAGE);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);server.sin_addr.s_addr = inet_addr(szServer);//连接到目标地址if (server.sin_addr.s_addr == INADDR_NONE){host = gethostbyname(szServer);if (host == NULL){printf("Unable to resolve server: %s\n", szServer);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;}ret = recv(sClient, szBuffer, DEFAULT_BUFFER, 0);//等待接收文件列表if (ret == SOCKET_ERROR){printf("recv() failed: %d\n", WSAGetLastError());}szBuffer[ret] = '\0';printf("FileList:\n");printf("%s\n", szBuffer);FILE *fp;while(1){cout<<"input szMessage"<<endl;//根据文件列表发起申请下载目标文件cin>>szMessage;ret = send(sClient, szMessage, strlen(szMessage), 0);if (ret == 0){break;}else if (ret == SOCKET_ERROR){printf("send() failed: %d\n", WSAGetLastError());break;}printf("Send %d bytes\n", ret);if (!bSendOnly){ret = recv(sClient, szBuffer, DEFAULT_BUFFER, 0);//接收文件的szBuff并开始准备转换回文件if (ret == 0)break;else if (ret == SOCKET_ERROR){printf("recv() failed: %d\n", WSAGetLastError());break;}szBuffer[ret] = '\0';printf("RECV [%d bytes]: '%s'\n", ret, szBuffer);char s[10]="RECV"; //对接受的文件进行重命名在前面加上RECV 后几句都是此作用strncat(s,szMessage,strlen(szMessage));fp=fopen(s,"a+");fwrite(szBuffer,1,ret,fp);fclose(fp);}}closesocket(sClient);WSACleanup();return 0;}服务器端:// Server.c// 声明:部分代码来自《WINDOWS网络编程》一书中关于建立TCP连接的部分// 功能:建立一个全自动服务器,当收到连接申请则连接并发送文件列表,并等待客户端发送申请下载请求// 注意:build时请在工程设置中加入ws2_32.lib#include <winsock2.h>#include <stdio.h>#include <stdlib.h>#define DEFAULT_PORT 5150#define DEFAULT_BUFFER 4096int iPort = DEFAULT_PORT;BOOL bInterface = FALSE,bRecvOnly = FALSE;char szAddress[128];//// Function: usage//// Description:// Print usage information and exit//void usage(){printf("usage: server [-p:x] [-i:IP] [-o]\n\n");printf(" -p:x Port number to listen on\n");printf(" -i:str Interface to listen on\n");printf(" -o Don't echo the data back\n\n");ExitProcess(1);}void V alidateArgs(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':iPort = atoi(&argv[i][3]);break;case 'i':bInterface = TRUE;if (strlen(argv[i]) > 3)strcpy(szAddress, &argv[i][3]);break;case 'o':bRecvOnly = TRUE;break;default:usage();break;}}}}DWORD WINAPI ClientThread(LPVOID lpParam)//多线程控制通过给不同的客户不同的线{SOCKET sock=(SOCKET)lpParam;char szBuff[DEFAULT_BUFFER];int ret,nLeft,idx;FILE *fp;while(1){ret = recv(sock, szBuff, DEFAULT_BUFFER, 0);//收听客户端想下载什么文件if (ret == 0)break;else if (ret == SOCKET_ERROR){printf("recv() failed: %d\n", WSAGetLastError());break;}szBuff[ret] = '\0';printf("RECV: '%s'\n", szBuff);fp=fopen(szBuff,"rb");//打开目标文件将目标文件内容存入szBuffmemset(szBuff,0,DEFAULT_BUFFER);//初始化szBuff 不然传送的数据后面会自动添加很多东西ret=fread(szBuff,1,DEFAULT_BUFFER-1,fp);//将目标文件中的东西读入szBuffsend(sock,szBuff,ret,0);//发送给客户端fclose(fp);}return 0;}int main(int argc, char **argv){WSADATA wsd;SOCKET sListen,sClient;int iAddrSize;HANDLE hThread;DWORD dwThreadId;struct sockaddr_in local,client;ValidateArgs(argc, argv);if (WSAStartup(MAKEWORD(2,2), &wsd) != 0){printf("Failed to load Winsock!\n");return 1;}sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_IP); if (sListen == SOCKET_ERROR){printf("socket() failed: %d\n", WSAGetLastError());return 1;}if (bInterface){local.sin_addr.s_addr = inet_addr(szAddress);if (local.sin_addr.s_addr == INADDR_NONE)usage();}elselocal.sin_addr.s_addr = htonl(INADDR_ANY);local.sin_family = AF_INET;local.sin_port = htons(iPort);if (bind(sListen, (struct sockaddr *)&local,sizeof(local)) == SOCKET_ERROR){printf("bind() failed: %d\n", WSAGetLastError());return 1;}listen(sListen, 8);while (1){iAddrSize = sizeof(client);sClient = accept(sListen, (struct sockaddr *)&client,&iAddrSize);if (sClient == INV ALID_SOCKET){printf("accept() failed: %d\n", WSAGetLastError());break;}printf("Accepted client: %s:%d\n",inet_ntoa(client.sin_addr), ntohs(client.sin_port));char fileList[DEFAULT_BUFFER]="";//创建文件表地址FILE*fp;fp=fopen("1.txt","r");//读取文件表,文件表默认为保存在1.txt中int flen=fread(fileList,1,DEFAULT_BUFFER,fp);send(sClient,fileList,flen,0);flen=0;hThread = CreateThread(NULL, 0, ClientThread, //多线程控制(LPVOID)sClient, 0, &dwThreadId);if (hThread == NULL){printf("CreateThread() failed: %d\n", GetLastError());break;}CloseHandle(hThread);}closesocket(sListen);WSACleanup();return 0;}操作流程:1.编译过程请在工程—设置—连接—工程、选项中添加ws2_32.lib 不然link过程会出现错误。

基于TCP协议的简单即时通信软件的设计与实现(含源文件)

基于TCP协议的简单即时通信软件的设计与实现(含源文件)

基于TCP协议的网络通信系统的设计与实现摘要:网络通信,由于其具有实时性、跨平台性、成本低、效率高等优点而受到广泛的使用.设计并实现一个能够处理多用户进行实时、安全的即时通信系统具有较强的现实意义。

即时通信的底层通信是通过SOCKET套接字接口实现的。

当前的主流UNIX系统和微软的WINDOWS系统都在内核提供了对SOCKET字接口的支持。

使用这个统一的接口,可以编写一个可移植的TCP/IP通信程序。

使信息能够在INTERNET上可靠的传输。

本文设计并实现了基于局域网内的简单即时通信系统,系统采用C/S模式,底层通信通过SOCKET套接字接口实现,服务器负责客户端的登录验证,好友信息的保存和心跳报文的发送.客户端采用P2P方式实现消息传递,并能实现文件的传输。

本文首先讨论了同步套接字,异步套接字,多线程并发执行任务等;然后阐述了客户端、服务器如何使用XML序列化的消息进行通信。

关键词:即时通信;文件传输;套接字;TCP协议Abstract :Instant messages have several advantages such as real-time, cross-platform, cheap a nd efficient. To design a Multi-user IM (instant message) architecture is very importan t in both theory and realism。

Instant message based on TCP/IP protocol that is realiz ed by socket interface。

Almost all UNIX operation systems and Microsoft's window s operation systems provide support of socket in the kernel. Using the uniform interfa ce, we can develop a portable program of TCP/IP, which help us transfer informatio n in Internet safely and credibly。

网络文件传输系统的设计与实现

网络文件传输系统的设计与实现

网络文件传输系统的设计与实现作者指导老师摘要:在科学技术飞速发展的今天,Internet已经和人们的日常生活息息相关,无论是工作,学习还是娱乐,都离不开网络。

比如有时候需要进行文件的传输,虽然现在的许多网络文件传输工具能基本满足人们对文件传输质量的要求,但是它们往往都存在安全性,工作效率低等问题。

本课程设计的文件传输系统是在Windows操作系统下,Visual C + + 6.0环境下借用WinSock控件实现的,是基于TCP/IP协议的C/S模式,在服务器和客户端分别以socket为中心进行编程,客户端和服务器端的界面分别是由文件发送模块和文件接收模块组成。

客户端先调用connect()与服务器建立连接,然后用send()发送数据;服务器端先调用listen()侦听客户端的连接请求,然后调用accept()对连接请求进行响应,如果需要接收数据,则会调用receive()接收。

本文件传输系统成功的实现了服务器和客户端的文件传输,不论是较小范围内的局域网还是远程网,而且还可以传输多种格式的文件,如word,视频,图像等。

相比其它文件传输工具而言,本系统有很多的优点。

首先,界面简单,易于操作;其次,传输较大的文件时,不需要花费很长时间。

关键词:文件传输;WinSock ; socket编程; C/S结构目录1 绪论 (3)1.1选题背景 (3)1.2选题意义 (3)2开发环境及相关技术简介 (4)2.1开发环境Visual C++ 6.0介绍 (4)2.2基于vc的socket网络编程的基本原理 (4)2.2.1 socket的基本概念 (4)2.2.2Winsock网络编程原理 (5)2.3 TCP/IP协议简介 (5)2.5 C/S结构 (6)2.5.1 C/S结构的概念 (6)2.5.2 C/S结构的工作模式 (6)2.5.3 C/S结构的优点 (6)3 网络文件传输系统的设计 (6)3.1服务器端和客户端界面介绍 (7)3.1.1服务器界面介绍 (7)3.1.2客户端界面介绍 (7)3.2服务器端,客户端程序分析 (8)3.2.1服务器端分析 (8)3.2.2客户端分析 (12)4实现 (16)4.1系统运行环境 (16)4.2文件传输系统的测试 (16)4.2.1实验一:局域网内文件传输 (16)4.2.2实验二:远程网络上文件传输 (18)4.2.3实验三:较大文件的传输 (20)4.2.4实验四:不同格式文件的传输 (20)4.3该文件传输系统的不足 (21)5结论 (21)致谢 (22)参考文献 (23)1 绪论1.1选题背景21世纪被称为信息时代,因为计算机技术的迅猛发展,给人们的日常生活以及工作,都带来翻天覆地的变化。

实验一-文件传输协议设计

实验一-文件传输协议设计

实验一:文件传输协议的设计与实现目录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。

c++文件传输毕业设计

c++文件传输毕业设计

c++文件传输毕业设计摘要:本文描述了一个基于C++的文件传输系统的设计与实现。

该系统具有高效和安全的特点,并且采用了TCP/IP协议进行数据传输。

系统分为客户端和服务器端,客户端可以将本地文件传输到服务器端,服务器端可以接收并保存文件。

在设计过程中,使用了文件流、套接字编程和多线程技术。

通过对系统进行测试和评估,验证了其稳定性和可靠性。

最终结果表明,该文件传输系统能够快速、安全地传输大文件,并且能够满足用户的需求。

1. 引言文件传输是计算机网络中常见的任务之一。

随着互联网的发展和普及,文件传输系统需要具备高效、安全、稳定和可靠等特点。

本文设计了一个基于C++的文件传输系统,该系统通过TCP/IP协议进行数据传输,能够满足用户的需求。

2. 系统设计2.1 系统结构文件传输系统分为客户端和服务器端两部分。

客户端提供了文件选择和传输功能,服务器端则负责接收和保存文件。

2.2 数据传输系统基于TCP/IP协议进行数据传输,使用套接字编程进行通信。

客户端通过套接字将文件内容划分为较小的数据块并发送给服务器端,服务器端再将接收到的数据块组合成完整的文件。

2.3 多线程技术为了提高系统的传输效率,使用了多线程技术。

客户端和服务器端均开启多个线程进行文件传输,从而实现并发传输。

3. 系统实现3.1 客户端实现客户端使用C++编写,通过用户界面提供文件选择的功能。

客户端接收用户选择的文件,并将文件内容划分为数据块进行传输。

客户端还可显示传输进度和传输结果。

3.2 服务器端实现服务器端使用C++编写,通过套接字接收客户端传输的数据块。

服务器端将接收到的数据块组合成完整的文件,并保存到本地磁盘中。

服务器端还可显示传输进度和传输结果。

4. 系统测试与评估为了验证系统的稳定性和可靠性,对系统进行了测试。

通过传输大文件和多个文件,评估系统的传输速度和传输成功率。

测试结果表明,系统能够快速、安全地传输大文件,并且具有良好的稳定性和可靠性。

文件传输协议的简单设计与实现

文件传输协议的简单设计与实现

文件传输协议的简单设计与实现摘要:文件传送是各种计算机网络都实现的基本功能,文件传送协议是一种最基本的应用层协议按照客户/服务器的模式进行工作,提供交互式的访问,是INTERNET使用最广泛的协议之一。

本设计是用JAVA语言简单实现文件传输协议,利用SOCKET 以及SERVERSOCKE等类方法,当中实现了上传、下载、获取服务器目录等基本文件传输功能。

关键字:文件传输、FTP。

1 具体设计任务1(1实验内容我们的计算机网络实验环境建立在TCP/IP 网络体系结构之上。

各计算机除了安装TCP/IP 软件外,还安装了TCP/IP 开发系统。

实验室各计算机具备Windows环境中套接字socket 的编程接口功能,可为用户提供全网范围的进程通信功能。

本实验要求学生利用这些功能,设计和实现一个简单的文件传送协议。

1(2具体要求用socket 编程接口编写两个程序,分别为客户程序(client.c)和服务器程序(server.c),该程序应能实现下述命令功能:get:取远方的一个文件put:传给远方一个文件pwd:显示远主当前目录dir:列出远方当前目录cd :改变远方当前目录, :显示你提供的命令quit :退出返回此命令的具体工作方式(指给出结果的形式)可以参照FTP 的相应命令,有余力的同学可以多实现几个命令。

2 基本思路及所涉及的相关理论2.1 文件传输协议网络协议是网络中计算机与终端之间正确传送信息和数据的规范格式,起包括语法、语义和时序这三部分。

文件传输协议(File Transfer Protocol, FTP)是在TCP/IP网络中传输文件的一种格式规范,其规定在用户和服务器之间开设两个通信端口:控制端口和数据端口。

前者生存周期为从用户登录开始直至用户登出,后者则在进行数据传送的时候打开,并且在数据传送完毕之后立即结束。

控制端口用来监听双方共同规定的控制字以达到及时提供服务或响应,数据端口则要先将文件拆分成分组再进行传送,这样做的目的是为了更加好的适应网络中的带宽限制,以及减少传送期间节点的延时,以达到高速传送。

基于VC 的Winsock 的文件传输程序的设计

基于VC 的Winsock 的文件传输程序的设计

基于VC 的Winsock 的文件传输程序的设计环境要求:Windows95/98/2000/XP功能要求:能将键盘上指定的文件发送到另一台计算机上;能将接收到的数据显示到屏幕窗口内,并显示收到文件的字节数和文件传输速率;一、设计目标用TC、Visual BASIC、Visual C++、Java 等编程工具和路由器、交换机、主机等网络设备提供的接口,解决网络用户之间的交互式对话问题,或计算通信网络的延迟、信道容量分配,或编码分析、通信协议分析,网络互连互通、网络规划。

进一步深入掌握网络设计和通信程序的设计原理。

使学生对计算机通信网络的设计实现有较深的了解,培养较高的通信网络设计能力。

本课设实验将基于2013版Visual Studio进行WINSOCK的文件传输的编程实现。

在WINDOWS95/98,WINDOWSNT进行WINSOCK开发使用的编程语言有很多,VC++,JAVA,DELPHI,VB等。

其中VC时使用最普遍,和WINSOCK结合最紧密的。

并且VC++对原来的WindowsSockets 库函数进行了一系列封装,继而产生了CAsynSocket、CSocket、CSocketFile等类,它们封装着有关Socket的各种功能,是编程变得更加简单。

SOCKET实际在计算机中提供了一个通信端口,可以通过这个端口与任何一个具有SOCKET 接口的计算机通信。

应用程序在网络上传输,接收的信息都通过这个SOCKET接口来实现。

在应用开发中就像使用文件句柄一样,可以对SOCKET句柄进行读,写操作。

二、设计原理套接字(Socket) 是一种网络编程接口,它是对通信端点的一种抽象,提供了一种发送和接收数据的机制。

套接字有两种类型:流式套接字(St ream Socket s) 和数据报套接字(Datagram Socket s) 。

数据报套接字提供了一种不可靠的、非连接的数据包通信方式,它使用用户数据报协议(UDP) ;而流式套接字可以将数据按顺序无重复地发送到目的地,它提供的是一种可靠的面向连接的数据传输方式。

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

TCP文件传输程序设计书一、实验名称:TCP文件传输程序二、实验要求1、设计一个应用程序,该应用程序能够实现网络中两台计算机之间传输文件。

2、一个程序既能够建立服务器又能够以终端的形式连接服务器。

3、终端或者服务器既能够发送文件又能够接收文件。

4、传送文件类型应为任何类型,文件大小为任意。

三、总体规划1、网络传输协议的选择在TCP/IP协议栈中,有两个高级协议是我们网络应用程序编写者应该了解的,它们"传输控制协议"(Transmission Control Protocol,简称TCP)和"用户数据报协议"(User Datagrm Protocol,简称UDP)。

TCP是面向连接的通信协议,TCP提供两台计算机之间的可靠无错的数据传输。

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

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

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

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

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

为了使两台计算机之间传输的文件数据不会丢失或发生错误,应该采用TCP协议。

2、TCP协议在VC++中的实现在VC++中,网络协议的实现有以下几种方式:a、采用WinSocket API函数。

API函数中提供了基本Socket的系统调用,具体实现方法为服务器端首先要调用socket()函数建立一个流式套接字,用bind()函数与本机的一个端口建立关联,继续调用listen()函数将套接字置于被动的侦听方式以监听连接,然后调用accept()函数进入等待状态之后才可以接收来自客户端的请求,一旦接收到客户端通过connect发出的连接请求,accept将返回一个新的套接字描述符。

通过此套接字描述符调用send()或recv()函数即可与客户端进行数据收发。

待数据传送完成,服务器客户端调用closesocket()关闭套接字。

该方法在编程过程中需要注意socket连接的整个过程,编程工作量大,编程效率低,单却可以加深对网络协议的认识。

程序流程示意图如下:b、采用VC++中提供的MFC类,CAsyncSocket或CSocket.两个类都对WinSocket API进行了封装,CSocket对它的封装比CAsyncSocket更深,使得对于从未接触过WinSockets API的编程程序员,也能够编写网络程序。

而本程序也是采用了CSocket类进行编程。

3、传输数据的缓冲问题本机要传给对方的文件不是从外存直接通过网络发送的,而对方发送的数据也不是直接存入外存的。

而是在存中开辟一块缓冲区,从外存取出的文件先存入缓冲区,然后传给socket。

而从socket接收的数据也是先存入缓冲区然后再存到外存。

为了解决缓冲问题,VC++添加了CArchive类,CArchive类专门用来管理一块存单元,其大小可以自己来定义。

用CArhive类既以把数据载入分配的存区,又可以将存区的数据存入文件。

在该类的对象初始化时,需要和某个文件建立连接,这样数据就可以载入或存储了。

4、Socket的文件化管理在大多数编程环境和编程语言多把socket看作一个特殊的文件,其传输过程就可以看作是对文件的读写操作。

而VC++也是如此。

为了便于网络Socket的管理,在VC++中,可以对网络Socket实现文件化管理。

为了实现该功能,需要用到VC++中的类CSocketFile类,该类直接派生于CFile类,使用该类可以达到对Socket文件化管理的目的。

如CSocketFile类可以与CArchive类建立连接,这样就为Socket创立了一块缓冲区。

应该注意的是虽然CSocketFile类直接从CFile类中派生过来,但CFile类中的一些函数CSocket是不能调用的,如果调用,系统便会返回错误。

5、数据的串行化问题从对方的计算机传输过来的数据存入了存,如何将这些数据写入文件呢?要发送的文件如何将其载入存?在这个程序里我采用了数据串行化方法。

也就是通过对象的Serialize()的重载来实现文件的存取。

我在程序中采用了通过重载CObject类中的Serialize()的方式,具体做法是:从文件中读取文件数据存入数组,利用CArchive 的重载运算符 << ,将数组数据读入存,而存数据过程与其相反。

6、接收数据判断是否传输完毕的方法文件接受数据时怎样才能判断已经接受完毕呢?我采用的方法是在传输包上加标记位的方法。

每发送一个数据包,总在最前面加一个位m_WEnd,如果标记为0,说明未传输完毕,以后还有数据传送过来,如果标记为1,说明已经传输完毕,可以进行一些后续工作。

而另一端,每接受一个数据包,就检查以下该标记位,以确定是否传输完毕。

四、实验运行测试1、建立服务器2、客户端建立连接用于建立服务器用于客户端连接用于发送文件用于接收文件用于显示状态3、发送文件a、客户端发送b、服务器端接收4、成功发送5、在E:盘中查找接收到的文件此为接收到的文件五、心得体会在这五天的时间里我按照设计书的要求应用网络编程的相关知识编写了一个实现文件传输的应用程序。

在编写过程中,收获颇丰。

首先是对TCP协议和UDP协议有了更进一步的认识;其次在编写过程中,通过翻阅书籍学习了VC++编程和MFC的相关容,拓展了自己的知识面,学到了很多在课堂上无法学到的东西。

当然,由于对Socket编程毕竟还不太熟练,难免会出现一些问题,现将这些问题总结如下:1、开始时在数据串行化的设计时,直接用CArchive类的对象 << CFile类的对象或CArchive类的对象 >> CFile类的对象出现错误,查阅MSDN发现不能直接用 << 运算符不能直接对CFile类的对象进行操作。

2、接收端操作同数据的传输必须同步,即必须确保在接收数据时,应确保数据已经传送到了接收端,也就是防止因为数据为传送过来而导致的接收失败。

为了防止接收失败而导致数据丢失,应反复接收,直到接收数目符合为止。

如:i = 0;while(i < m_WNum)i = ar.Read(&Bbuf[i], m_WNum - i) + i;所幸的是这些问题都在参考资料和老师的帮助下得到了解决。

最终圆满的完成了课程设计任务书的要求。

自身分析问题和解决问题的能力也得到了提升,为以后的实验设计奠定了良好的基础。

在这里要感老师对我的悉心指导,您辛苦了!六、程序源代码1、建立服务器侦听套接字的类CListenSocket的定义与实现定义部分:class CListenSocket : public Csocket//该类用于服务器端的侦听{public:C TcpDlg *m_pSendDlg; //加该成员为了调用其的函数。

public:C ListenSocket(CTcpDlg *pSendDlg);v irtual ~CListenSocket();public:v irtual void OnAccept(int nErrorCode);};实现部分:CListenSocket::CListenSocket(CTcpDlg *pSendDlg){m_pSendDlg = pSendDlg;}void CListenSocket::OnAccept(int nErrorCode) //当服务器端收到客//户端的连接请求时执行的代码。

{C Socket::OnAccept(nErrorCode);m_pSendDlg->ProcessAccept();}2、建立数据传输套接字的类CTransSocket的定义与实现定义部分:class CTransSocket : public Csocket//该类用于两端的连接和传输{public:C TcpDlg *m_pSendDlg;public:C TransSocket(CTcpDlg *pSendDlg);v irtual ~CTransSocket();public:v irtual void OnReceive(int nErrorCode);};实现部分:CTransSocket::CTransSocket(CTcpDlg *pSendDlg){m_pSendDlg = pSendDlg;}void CTransSocket::OnReceive(int nErrorCode) //当收到发送//端发送的数据时执行的代码。

{ CSocket::OnReceive(nErrorCode);m_pSendDlg->SetTip(CString("有数据传送到"));m_pSendDlg->SendOrRecv = 2;m_pSendDlg->JudgeButton();}3、用于数据串行化的类CSave的定义与实现:定义部分:class CSave : public CObject{public:WORD m_WEnd; //标记数据传输是否结束,结束-0 未结束-1 意外-2 WORD m_WNum; //标记Bbuf[]中元素的个数BYTE Bbuf[1024];public:CSave();virtual ~CSave();void Init();virtual void Serialize(CArchive &ar);};实现部分:CSave::CSave(){Init();}void CSave::Init() //重新定义一个Init()的原因是不仅在CSave类初始{ //化时将类各变量值初始状态,还可以在以后也可int i; //以。

m_WEnd = 1; //结束标志for(i = 0; i < 1024; i++)Bbuf[i] = 0;}void CSave::Serialize(CArchive &ar) //数据串行化{unsigned int i = 0;if(ar.IsStoring()){ar << m_WEnd;ar << m_WNum;for(i = 0; i < m_WNum; i++) //数组中的值发送出ar << Bbuf[i];}else{i = 0;ar >> m_WEnd;ar >> m_WNum;while(i < m_WNum) //收到的值存入数组i = ar.Read(&Bbuf[i], m_WNum - i) + i;}}4、主对话框CTcpDlg类的定义与实现:定义部分:class CTcpDlg : public CDialog{系统定义部分省略...public:CListenSocket *m_pListenSocket;CTransSocket *m_pTransSocket;CSocketFile *m_pFile; //用于和CSocket连接CFile *m_pBasicFile;CArchive *m_pArchiveIn; //CSocket的两个缓冲区CArchive *m_pArchiveOut;CString m_strFileName; //用于存储文件名int SendOrRecv; //send 1; receive 2; nothing 0;int ServerClient; //Server-1,Client-2int iEnd; //用于控制意外中断发送信号int m_nPort;void ProcessAccept();void ProcessRecv();void InitConnection();BOOL ConnectSocket(CString strIP);void SendFile(CString strFileName, WORD WEnd = 1);int ReceiveFile(CFile *m_pBasicFile,CString strFileName, DWORD *wNum);void JudgeButton();void SetTip(CString str);public:CTcpDlg(CWnd* pParent = NULL); // standard constructorvirtual ~CTcpDlg();系统控件变量定义省略...系统定义函数省略...protected:afx_msg void OnBUTTONListen();afx_msg void OnBUTTONStop();afx_msg void OnBUTTONConnect();afx_msg void OnBUTTONCut();afx_msg void OnBUTTONBrowser();afx_msg void OnBUTTONSend();afx_msg void OnBUTTONSave();afx_msg void OnBUTTONRecv();};实现部分:系统定义函数实现省略...CTcpDlg::CTcpDlg(CWnd* pParent /*=NULL*/): CDialog(CTcpDlg::IDD, pParent){m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);m_pAutoProxy = NULL;m_pListenSocket = NULL;m_pTransSocket = NULL;m_pFile = NULL;m_pArchiveIn = NULL;m_pArchiveOut = NULL;m_strFileName.Empty();m_pBasicFile = NULL;SendOrRecv = 0;iEnd = 1;}CTcpDlg::~CTcpDlg(){if (m_pAutoProxy != NULL)m_pAutoProxy->m_pDialog = NULL;delete m_pTransSocket;m_pTransSocket = NULL;delete m_pListenSocket;m_pListenSocket = NULL;delete m_pBasicFile;m_pBasicFile = NULL;delete m_pArchiveIn;delete m_pArchiveOut;m_pArchiveIn = NULL;m_pArchiveOut = NULL;delete m_pFile;m_pFile = NULL;}BOOL CTcpDlg::OnInitDialog(){系统添加部分省略...CDialog::OnInitDialog();m_nPort = 1234;m_AddCtrl.SetAddress(192,168,0,1);JudgeButton();SetTip(CString("初始状态"));return TRUE;}void CTcpDlg::JudgeButton() //不时地调整各按钮的状态{if(m_pListenSocket == NULL && m_pTransSocket == NULL) {m_Browser.EnableWindow(TRUE);m_Listen.EnableWindow(TRUE);m_Stop.EnableWindow(FALSE);m_Connect.EnableWindow(TRUE);m_Cut.EnableWindow(FALSE);m_Send.EnableWindow(FALSE);m_Save.EnableWindow(TRUE);m_FileName.EnableWindow(TRUE);m_SaveFile.EnableWindow(TRUE);m_Recv.EnableWindow(FALSE);return;m_Recv.queque(FALSE)m_Wedive.build(FALSE)m_concent.EnableWindows(FALSE)m_agent.Forbide(TRUE)m_reduce.dosore(TRUE)}else if(m_pTransSocket != NULL){m_Listen.EnableWindow(FALSE);m_Connect.EnableWindow(FALSE);if(ServerClient == 1){m_Cut.EnableWindow(FALSE);m_Stop.EnableWindow(TRUE);}else{m_Cut.EnableWindow(TRUE);m_Stop.EnableWindow(FALSE);}if(SendOrRecv == 1){m_Recv.EnableWindow(FALSE);m_FileName.EnableWindow(TRUE);m_SaveFile.EnableWindow(FALSE);m_Browser.EnableWindow(TRUE);m_Save.EnableWindow(FALSE);}else if (SendOrRecv == 2){m_Recv.EnableWindow(TRUE);m_FileName.EnableWindow(FALSE);m_SaveFile.EnableWindow(TRUE);m_Browser.EnableWindow(FALSE);m_Save.EnableWindow(TRUE);}else{m_Recv.EnableWindow(TRUE);m_FileName.EnableWindow(TRUE);m_SaveFile.EnableWindow(TRUE);m_Browser.EnableWindow(TRUE);m_Save.EnableWindow(TRUE);}m_Send.EnableWindow(TRUE);return;}else if(m_pListenSocket != NULL){m_Browser.EnableWindow(TRUE);m_Listen.EnableWindow(FALSE);m_Stop.EnableWindow(TRUE);m_Connect.EnableWindow(FALSE);m_Cut.EnableWindow(FALSE);m_Send.EnableWindow(FALSE);m_Save.EnableWindow(TRUE);m_FileName.EnableWindow(TRUE);m_SaveFile.EnableWindow(TRUE);m_Recv.EnableWindow(FALSE);return;}}void CTcpDlg::SetTip(CString str) //调整状态区的文字显示{m_EditTip.SetWindowText(str);}void CTcpDlg::ProcessAccept() //应答客户端的连接请求{m_pTransSocket = new CTransSocket(this);if(m_pListenSocket->Accept(*m_pTransSocket)){InitConnection();m_pListenSocket->Close();delete m_pListenSocket;m_pListenSocket = NULL;JudgeButton();SetTip(CString("有客户端连接"));}else{delete m_pListenSocket;m_pListenSocket = NULL;delete m_pTransSocket;m_pTransSocket = NULL;JudgeButton();SetTip(CString("连接失败"));}}void CTcpDlg::InitConnection()//初始化CSocket缓冲区及与CSocketFile { //的连接。

相关文档
最新文档