FTP文件传输系统报告带目录终结版 - 图文

更新时间:2024-05-14 09:09:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

FTP文件传输系统设计方案 文件传送是各种计算机网络实现的基本功能,文件传送协议是一种最基本

课程设计报告书 2009/ 2010 学年 第 2 学期 目 录

一、目课题要求及标准 .................................................................................................................. 3

1、课程设计的目的和要求 ..................................................................................................... 3 2、课题要求............................................................................................................................. 3 3、开发技术............................................................................................................................. 4

3.1WindowsSocket编程原理 ....................................................................................... 4 3.2WindowsSocket的启动和终止................................................................................ 5 3.3Socket函数简介...................................................................................................... 6

二、系统总体设计........................................................................................................................... 8

1、总体功能模块图................................................................................................................. 8

(1)服务器端..................................................................................................................... 8 (2)客户端......................................................................................................................... 9 2、系统结构........................................................................................................................... 10 3、主要功能流程图............................................................................................................... 10

(1)文件传输流程图 ....................................................................................................... 10 (2) 聊天流程图 ..................................................................................................... 11 1、用例图............................................................................................................................... 12

(1)客户端用例图 ........................................................................................................... 12 (2)服务器端用例图............................................................................................................... 12 2、用例描述........................................................................................................................... 13

(1)文件传送用例描述 ................................................................................................... 13 (2)聊天用例描述 ........................................................................................................... 14

四、系统结构设计与实现 ............................................................................................................ 15

1、系统结构设计与实现....................................................................................................... 15 2、主要消息响应函数的实现 ............................................................... 错误!未定义书签。 五、总结 ........................................................................................................................................ 26

1、运行效果........................................................................................................................... 26 2、开发心得........................................................................................................................... 26 六、参考文献 ................................................................................................................................ 26 七、任务完成 ................................................................................................................................ 26

文件传输系统

文件传送是各种计算机网络实现的基本功能,文件传送协议是一种最基本的应用层协议按照客户/服务器的模式进行工作,提供交互式的访问,是INTERNET使用最广泛的协议之一。文件传输协议的简单设计与实现建立在计算机网络实验环境TCP/IP网络体系结构之上,使用socket编程接口编写两个程序,分别为客户程序(client)和服务器程序(server),利用了已有网络环境设计并实现简单应用层协议。

一、目课题要求及标准 1、课程设计的目的和要求

计算机网络课程设计是计算机网络原理课程之后的实践加强环节,通过本设计的训练使学生加深对网络协议的理解,并实践制定通信规则,同时通过实践,进一步掌握套接字编程方法,为大型网络编程打下坚实基础。

通过本次课程设计的学习与实践,使学生能达到知识与技能两方面结合的目标。

(1)熟练掌握网络的基本概念和原理。

(2)熟练掌握网络编程接口Winsock概念及编程原理 (3)掌握基于TCP/IP的Internet编程技术。 (4)掌握软件开发的过程及思想。

2、课题要求

服务器端:1.指定一个目录作为FTP目录(之后所有的文件操作均在此目录下进行)

2.接收客户端的命令请求并提供相应的服务。

客户端:完成与FTP用户的人机界面,以命令的方式向服务器请求服务,主要的命令有:

1.CONNECTIP地址端口号

指定FTP服务器的IP地址和端口号,连接到服务器。 响应:连接成功/失败。 2.LOGIN用户名

用户登录(假设在服务器端有用户管理功能)

响应:若用户不存在,提示“无此用户”;若用户存在,提示“密码:”;用户输入密码后,若正确提示“登录成功”;若不成功,提示“密码错”。

3.DIR

显示FTP服务器的FTP目录的文件列表(假设无子目录) 响应:目录列表(只要文件名即可)。 4.GET文件名

将FTP目录下的文件下载到本地,支持断点续传 响应:传送成功/失败/无此文件。 5.PUT文件名

将本地文件上传到FTP目录,支持断点续传 响应:传送成功/失败/无此文件。

6.HELP(客户端和服务器端均有该功能)

显示MYFTP软件的功能(此命令与网络通信无关)

7.BYE

退出MYFTP软件 3、开发技术

WindowsSocket编程原理

3.1WindowsSocket编程原理 Socket的编程模型如图1所示。

图1Socket的编程模型

字节流套接字(StreamSocket) 是最常用的套接字类型,TCP/IP协议族中的TCP协议使用此类接口。字节流套接口提供面向连接的、无差错的、发送先后顺序一致的、无记录边界和非重复的网络信息包传输。其模型如图2所示。

数据报套接字(DatagramSocket) TCP/IP协议族中的UDP协议使用此类接口,它是无连接的服务,它以独立的信息包进行网络传输,信息包最大长度为32KB,传输不保证顺序性、可靠性和无重复性,它通常用于单个报文传输或可靠性不重要的场合。数据报套接口的一个重要特点是它保留了记录边界。其模型如图3所示。

原始数据报套接字(RawSocket) 提供对网络下层通讯协议(如IP协议)的直接访问,它一般不是提供给普通用户的,主要用于开发新的协议或用于提取协议较隐蔽的功能。

图2面向连接的SOCKET编程模型

服务器方socket(),建立数据报式套接字,返回套接字号sbind(),将套接字s与本地地址相连客户方socket(),建立数据报式套接字,返回套接字号sbind(),将套接字s与本地地址相连recvfrom()/sendto(),通过套接字s读/写数据,直到数据交换完。closesocket(),关闭套接字s,结束服务sendto ()/recvfrom(),通过套接字s交换数据closesocket(),关闭套接字,结束对话

图3面向非连接的SOCKET编程模型

WindowsSockets规范中定义了一个新的数据类型SOCKET,这一类型的定义对于将来WindowsSockets规范的升级是必要的。这一类型的定义保证了应用程序向Win32环境的可移植性。因为这一类型会自动地从16位升级到32位。

3.2WindowsSocket的启动和终止

应用程序在使用WindowsSocketsDLL之前必须先调用启动函数WSAStartup(),该函数的功能有两点:一是由应用程序指定所要求WindowsSocketsDLL版本;二是获得系统WindowsSocketsDLL的一些技术细节。每一个WSAStartup()函数必须和一个WSACleanup()函数对应,当应用程序终止时,必须调用WSACleanup()将自己从DLL中注销。

函数原型:

intWSAStartup(WORDwVersionRequested,LPWAADATAlpWSAData); intWSACleanup(void);

函数执行正确返回0,错误返回非0值。其中参数wVersionRequested用于指定准备加载的Winsock库的版本,lpWSAData参数是指向LPWSADATA结构的指针,该结构包含了加载的库版本有关的信息,它的格式如下:

typedefstructWSAData{ WORDwVersion; WORDwHighVersion; ... }

其中wVersion字段为打算使用的Winsock版本,wHighVersion为现有Windsock库中最高版本。由于该结构与本实验编程关系不大,在此不做详细介绍。这两个函数的一般用法如下例:

interrno;

WSADATAwsaData;

errno=WSAStartup(MAKEWORD(2,0),&wsaData);//使用2.0版本的Socket 3.3Socket函数简介

3.3.1创建套接字──socket() 应用程序在使用套接字前,首先必须拥有一个套接字,系统调用socket()向应用程序提供创建套接字的手段,其调用格式如下:

SOCKETsocket(intaf,inttype,intprotocol);

该调用要接收三个参数:af、type、protocol。参数af指定通信发生的区域,UNIX系统支持的地址族有:AF_UNIX、AF_INET、AF_NS等,而DOS、WINDOWS中仅支持AF_INET,它是网际网区域。因此,地址族与协议族相同。

参数type描述要建立的套接字的类型。若取 SOCK_STREAM表示要创建的套接字是流套接字,取SOCK_DGRAM创建的是数据报套接字,取SOCK_RAW表示创建原始套接字。

参数protocol说明该套接字使用的特定协议,如果调用者不希望特别指定使用的协议,则置为0,使用默认的连接模式。

若套接字创建成功则该函数返回所创建的套接字句柄SOCKET,否则产生INVALID_SOCKET错误。

3.3.2指定本地地址──bind() 当一个套接字用socket()创建后,存在一个名字空间(地址族),但它没有被命名。bind()将套接字地址(包括本地主机地址和本地端口地址)与所创建的套接字号联系起来,即将名字赋予套接字,以指定本地半相关。其调用格式如下:

intbind(SOCKETs,conststructsockaddr*name,intnamelen);

参数s是由socket()调用返回的并且未作连接的套接字描述符(套接字号)。

参数name是赋给套接字s的本地地址,它由structsockaddr结构表示,namelen表明了name的长度。

如果没有错误发生,bind()返回0。否则返回值SOCKET_ERROR。

sockaddr结构随选择的协议不同而变化,因此一般情况下另一个与该地址结构大小相同的sockaddr_in结构更常用,sockaddr_in结构用来标识TCP/IP协议下的地址,并可以方便地通过强制类型转换将其转换为sockaddr结构,sockaddr_in的格式如下:

structsockaddr_in{ shortsin_family; /*AF_INET*/ u_shortsin_port; /*16位端口号*/

structin_addrsin_addr; /*32位IP地址*/ charsin_zero[8]; /*保留*/ }

3.3.3监听连接──listen() 此调用用于面向连接服务器,表明它愿意接收连接。listen()需在accept()之前调用,其调用格式如下:

intlisten(SOCKETs,intbacklog);

参数s标识一个本地已建立、尚未连接的套接字号,服务器愿意从它上面接收请求。backlog表示请求连接队列的最大长度,用于限制排队请求的个数,目前允许的最大值为5。如果没有错误发生,listen()返回0。否则它返回SOCKET_ERROR。

listen()在执行调用过程中可为没有调用过bind()的套接字s完成所必须的连接,并建立长度为backlog的请求连接队列。

调用listen()是服务器接收一个连接请求的四个步骤中的第三步。它在调用socket()分配一个流套接字,且调用bind()给s赋于一个名字之后调用,而且一定要在accept()之前调用。

3.3.4建立套接字连接──connect()与accept() 这两个系统调用用于完成一个完整相关的建立,其中connect()用于建立连接。无连接的套接字进程也可以调用connect(),但这时在进程之间没有实际的报文交换,调用将从本地操作系统直接返回。这样做的优点是程序员不必为每一数据指定目的地址,而且如果收到的一个数据报,其目的端口未与任何套接字建立“连接”,便能判断该端口不可操作。而accept()用于使服务器等待来自某客户进程的实际连接。

connect()的调用格式如下:

intconnect(SOCKETs,conststructsockaddr*name,intnamelen); 参数s是欲建立连接的本地套接字描述符。

参数name指出说明对方套接字地址结构的指针。对方套接字地址长度由namelen说明。

如果没有错误发生,connect()返回0。否则返回值SOCKET_ERROR。在面向连接的协议中,该调用导致本地系统和外部系统之间连接实际建立。

由于地址族总被包含在套接字地址结构的前两个字节中,并通过socket()调用与某个协议族相关。因此bind()和connect()无须协议作为参数。

accept()的调用格式如下:

SOCKETaccept(SOCKETs,structsockaddr*addr,intFAR*addrlen);

参数s为本地套接字描述符,在用做accept()调用的参数前应该先调用过listen()。

addr指向客户方套接字地址结构的指针,用来接收连接实体的地址。addr的确切格式由套接字创建时建立的地址族决定。

addrlen为客户方套接字地址的长度(字节数)。

如果没有错误发生,accept()返回一个SOCKET类型的值,表示接收到的套接字的描述符。否则返回值INVALID_SOCKET。

accept()用于面向连接服务器。参数addr和addrlen存放客户方的地址信息。调用前,参数addr指向一个初始值为空的地址结构,而addrlen的初始值为0;调用accept()后,服务器等待从编号为s的套接字上接受客户连接请求,而连接请求是由客户方的connect()调用发出的。当有连接请求到达时,accept()调用将请求连接队列上的第一个客户方套接字地址及长度放入addr和addrlen,并创建一个与s有相同特性的新套接字号。新的套接字可用于处理服务器并发请求。

四个套接字系统调用,socket()、bind()、connect()、accept(),可以完成一个完全五元相关的建立。socket()指定五元组中的协议元,它的用法与是否为客户或服务器、是否面向连接无关。bind()指定五元组中的本地二元,即本地主机地址和端口号,其用法与是否面向连接有关:在服务器方,无论是否面向连接,均要调用bind();在客户方,若采用面向连接,则可以不调用bind(),而通过connect()自动完成。若采用无连接,客户方必须使用bind()以获得一个唯一的地址。

以上讨论仅对客户/服务器模式而言,实际上套接字的使用是非常灵活的,唯一需遵循的原则是进程通信之前,必须建立完整的相关。

3.3.5数据传输──send()与recv()

当一个连接建立以后,就可以传输数据了。常用的系统调用有send()和recv()。

send()调用用于在参数s指定的已连接的数据报或流套接字上发送输出数据,格式如下:

intsend(SOCKETs,constchar*buf,intlen,intflags); 参数s为已连接的本地套接字描述符。buf指向存有发送数据的缓冲区的指针,其长度由len指定。flags指定传输控制方式,如是否发送带外数据等。如果没有错误发生,send()返回总共发送的字节数。否则它返回SOCKET_ERROR。

recv()调用用于在参数s指定的已连接的数据报或流套接字上接收输入数据,格式如下:

intrecv(SOCKETs,char*buf,intlen,intflags);

参数s为已连接的套接字描述符。buf指向接收输入数据缓冲区的指针,其长度由len指定。flags指定传输控制方式,如是否接收带外数据等。如果没有错误发生,recv()返回总共接收的字节数。如果连接被关闭,返回0。否则它返回SOCKET_ERROR。

3.3.6关闭套接字──closesocket()

closesocket()关闭套接字s,并释放分配给该套接字的资源;如果s涉及一个打开的TCP连接,则该连接被释放。closesocket()的调用格式如下:

BOOLclosesocket(SOCKETs);

参数s待关闭的套接字描述符。如果没有错误发生,closesocket()返回0。否则返回值SOCKET_ERROR。

4、开发环境

Windows操作系统,MicrosoftVisualC++6.0

二、系统总体设计

1、总体功能模块图 (1)服务器端

服务器端功能说明:

① 线程控制:线程类别:选择线程类别,单线程或多线程传送文件 线程数设置:若选择多线程,可自行设置线程数目, 若选择单线程,则默认线程数目为1

② 启动服务器:设置好线程控制后,点击“启动”按钮启动服务器端 ③ 选取文件:选择要发送给客户端的文件

④ 发送文件:获取要发送文件属性:获取到要传送给客户端的文件的基本属性,包括:文件名,大小(B),已发送多少(B),文件路径发送进度显示:显示给客户端发送文件的进度

⑤ ChatWithServer:启动采用UDP协议的简单聊天系统,用来与客户端进行通讯(客户端和服务器端都得启动,否则无法收到)

⑥ Help:显示服务器端使用说明 (2)客户端

客户端功能说明:

① 握手服务器:输入服务器端IP地址,点击“握手服务器”按钮,获取服务器端启动的线程数

② 连接服务器:与服务器进行连接

③ 接收文件:获取接收文件属性:获取到要接收的服务器端传来的文件的基本属性,包括:文件名,大小(B),已接收多少(B),文件存储路径接收进度显示:显示已接收文件的进度

④ ChatWithServer:启动采用UDP协议的简单聊天系统,用来与客户端进行通讯(客户端和服务器端都得启动,否则无法收到)

⑤ 获取IP地址:获取本机的主机名及IP地址 ⑥ HELP:显示客户端使用说明 2、系统结构

3、主要功能流程图 (1)文件传输流程图

2) 聊天流程图

三、用例 1、用例图

(1)客户端用例图

(2)服务器端用例图

2、用例描述

(1)文件传送用例描述 用例名称:服务器端文件传输 参与者:服务器端管理员 简要说明: 服务器端管理员设置线程类别和启动的线程数目,启动服务器,选取文件进行发送 前置条件: 服务器端管理员已经运行服务器端程序 基本事件流: 1.服务器端管理员通过鼠标点击线程类别和线程数目下拉列表框进行设置,然后点击“启动”按钮, 启动服务器。 2.点击“选取文件”按钮,选择要传送给客户端的文件,在文件属性框中显示出相应文件的信息,点击“发送文件”按钮,进行文件传输。 3.点击“退出”按钮,退出服务器端 4.点击“帮助”按钮可以查看使用说明 5.用例终止 其他事件流A1: 在按”发送”按钮之前,服务器端管理员随时可以按“退出”按钮,终止与客户端的链接,即终止与客户端之间的文件传送。 异常事件流: 1.提示错误信息,文件传送失败 用例名称:客户端文件传输 参与者:客户 简要说明: 客户输入服务器端IP地址,链接服务器,进行文件接收 前置条件: 客户运行客户端应用程序 基本事件流: 1.客户输入服务器端IP地址,然后点击“握手服务器”按钮,获取服务器端启动的线程数目,然后点击“连接”按钮,若连接成功则提示“connectsuccess”,否则提示错误。 2.若此时服务器端已选择文件进行传输,则客户端文件属性框中显示要接收的文件相关信息,点击“接收”按钮,选择文件存储路径,接收进度条显示文件接收进度 3.点击“停止接收”按钮,停止文件接收工作 4.点击“获取IP”按钮,即可获取到本机主机名和IP地址 5.点击“退出”按钮,退出应用程序 6.点击“帮助”按钮可以查看使用说明 7.用例终止 其他事件流A1: 在按”接收”按钮之前,客户随时可以按“停止接收”按钮,终止与服务器端之间的文件传送。 在文件开始接收后,点击“停止接收”按钮,也终止与服务器端之间的文件传送。 异常事件流: 1.提示错误信息,文件传送失败 (2)聊天用例描述 用例名称:服务器端聊天 参与者:服务器端管理员 简要说明: 服务器端管理员启动服务器,运行聊天界面 前置条件: 服务器端管理员已经运行服务器端程序,并且知道客户端IP地址 基本事件流: 1.服务器端管理员点击“ChatWithServer”按钮,进入聊天界面。点击“获取IP”按钮,可以获得本机主机名和IP地址 2.输入客户端IP地址,在发送框中输入要发送的内容,点击“发送”按钮,如客户端也开启了聊天界面即可接收到数据,否则接收不到数据。 3.用例终止 其他事件流A1: 在按”发送”按钮之前,服务器端管理员随时可以按退出聊天界面,即终止聊天 异常事件流: 若输入的客户端IP地址错误,则客户端无法接收到数据 用例名称:客户端聊天 参与者:客户 简要说明: 客户启动服务器,运行聊天界面 前置条件: 客户已经运行服务器端程序,并且知道服务器端IP地址 基本事件流: 1.客户点击“ChatWithServer”按钮,进入聊天界面。点击“获取IP”按钮,可以获得 本机主机名和IP地址 2.输入服务器端IP地址,在发送框中输入要发送的内容,点击“发送”按钮,如客户端也开启了聊天 界面即可接收到数据,否则接收不到数据。 3.用例终止 其他事件流A1: 在按”发送”按钮之前,客户随时可以按退出聊天界面,即终止聊天 异常事件流: 若输入的服务器端IP地址错误,则服务器端无法接收到数据 四、系统结构设计与实现 1、类图

1、文件传输模块类图

类功能说明:

CServFigoDlg:服务器端主界面对话框类,主要实现该对话框中按钮响应事件 CXXSock:接收客户端发来的索要启动线程数的请求,并将服务器端启动的线程 数发送给客户端

CServerSock:接收客户端的连接请求,实现连接 CHELP:显示帮助信息,即软件使用说明

CClientFiGo2Dlg:客户端主界面对话框类,主要实现该对话框中按钮响应事件 CXXSock:接收服务器端发送来的启动线程数和发送的文件属性信息 CClientSock:实现客户端和服务器之间的连接 CHELP:显示帮助信息,即软件使用说明

2、聊天模块类图

类功能说明:

CChatClient:聊天软件客户端类,主要用于向服务器端发送信息 CChatServer:聊天软件服务器端类,主要用于向客户端发送信息

3、从网站下载文件模块类图

类功能说明:

CDownLoad:下载主界面对话框类,主要实现该对话框中按钮响应事件 CGetList:列表视图类,主要用于实现对拖放网络资源连接的支持 CHTTPDownload:主要用于实现文件下载 COleListDropTarget:注册列表控件窗口并将该窗口设置为OLE对象载体,由该 对象有关拖放的操作

4、其余主要类图

CButtonST:主要用于美化功能的类,用来改变按钮控件背景色及字体颜色 CGetIP:获取IP主界面对话框类,主要实现该对话框中按钮响应事件 类图: 类名 类的作用 ServerSock 接收客户端的连接请求,实现连接 界面中主要消息响应函数的实现 1.接受客户端的连接 int CServerSock::File_Socket_Accepted = 0; void CServerSock::OnAccept(int nErrorCode) //用来接收信息 { // TODO: Add your specialized code here and/or call the base class // TODO: 在此添加专用代码和/或调用基类 // static int File_Socket_Accepted=0; if ( !listenSocket.Accept(sendSockets[File_Socket_Accepted]) ) { AfxMessageBox(\ return; } sendSockets[File_Socket_Accepted].AsyncSelect(FD_READ|FD_WRITE|FD_CLOSE); idx=++File_Socket_Accepted; if(File_Socket_Accepted==numThread) { AfxMessageBox(\ isConnectedM = TRUE; listenSocket.Close(); } CAsyncSocket::OnAccept(nErrorCode); } void CServerSock::OnReceive(int nErrorCode) { // TODO: Add your specialized code here and/or call the base class SetEvent(hMessageSend[idx-1]); CAsyncSocket::OnSend(nErrorCode); } 类图: 类名 CXXSock 类的作用 接收服务器端发送来的启动线程数和发送的文件属性信息 界面中主要消息响应函数的实现 1.对客户端索要线程数的响应,并将线程数发送给客户端。 void CXXSock::OnReceive(int nErrorCode) //接收握手服务器连接。 { int len = sizeof(SOCKADDR); char ch[10]; // TODO: Add your specialized code here and/or call the base class ReceiveFrom( ch, 10, &m_saToSend, &len ); //对相应字符串的解析和处理,其中第一个if里面的处理就是发送了线程数-num过去 if ( ch[1] == '*' && numThread != 0 ) { }

m_OK = TRUE; char num[10]={0}; itoa(numThread, num, 10); num[4] = num[1]; num[3] = num[0]; num[2] = '&'; num[1] = 'T'; num[0] = '&'; SendTo( num, 10, &m_saToSend, sizeof(SOCKADDR) ); } else if ( strcmp(ch,\{ m_sendOK = TRUE; } else if ( strcmp(ch,\{ m_stopRecved = TRUE; } CAsyncSocket::OnReceive(nErrorCode); 类图: 类名 CServFigoDlg 类的作用 服务器端主界面对话框类,主要实现该对话框中按钮响应事件 界面中主要消息响应函数的实现 1.结构函数 重置系统变量,准备运行对话框。 CServFigoDlg::CServFigoDlg(CWnd* pParent /*=NULL*/) : CDialog(CServFigoDlg::IDD, pParent) { //{{AFX_DATA_INIT(CServFigoDlg) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); m_isSingleThread = FALSE; m_numThread = 1; m_brush.CreateSolidBrush(RGB(0,0,255)); m_brush1.CreateSolidBrush(RGB(255,255,0)); m_brush2.CreateSolidBrush(RGB(0,255,0)); } 2.选择文件发送,获取文件信息。 void CServFigoDlg::OnBtnFile() { // TODO: Add your control notification handler code here // reSetAllOnFile(); //服务器端选择文件发送 CFileDialog openFile(TRUE); if ( IDOK == openFile.DoModal() ) { filename=openFile.GetFileName(); strcpy( fileNameM,filename.GetBuffer(0) ); } else return; CString strFilePath = openFile.GetPathName(); CString strFileSize; CFile file( fileNameM, CFile::modeRead ); m_fileSize = file.GetLength(); //itoa( fileSize, strFileSize.GetBuffer(0), 10 ); strFileSize.Format(\ file.Close();

GetDlgItem(IDC_EDITFILENAME)->SetWindowText(fileNameM); GetDlgItem(IDC_STAFILESIZE)->SetWindowText(strFileSize); GetDlgItem(IDC_EDITPATH)->SetWindowText(strFilePath); } 3.发送文件信息 void CServFigoDlg::OnBtnSend() { // TODO: Add your control notification handler code here if ( strcmp(fileNameM,\ { MessageBox(\请先选取文件!\ return; } if ( ! isConnectedM ) { MessageBox(\无连接!\ return; } //服务器选择文件并点选发送以后,会用通信Socket向客户端发送文件大小、文件名之类的信息 CString strFileMess; strFileMess.Format(\ strFileMess += '#'; strFileMess += fileNameM; strFileMess += '#'; m_sockServ->SendTo( (LPCTSTR)strFileMess, strFileMess.GetLength(), &m_sockServ->m_saToSend, sizeof(SOCKADDR) ); SetTimer( 0, 1000, NULL); SetTimer( 1, 1000, NULL); } 4.线程类型选择的响应函数 void CServFigoDlg::OnSelchangeComboThrdtype() { // TODO: Add your control notification handler code here CString strSel; int index; index = ((CComboBox*)GetDlgItem(IDC_COMBOTHRDTYPE))->GetCurSel(); ((CComboBox*)GetDlgItem(IDC_COMBOTHRDTYPE))->GetLBText( index, strSel ); if ( strSel == \单线程\ { m_isSingleThread = TRUE; ((CComboBox*)GetDlgItem(IDC_COMBOTHRDNUM))->SetCurSel(0); ((CComboBox*)GetDlgItem(IDC_COMBOTHRDNUM))->EnableWindow(FALSE); } else { m_isSingleThread = FALSE; index = ((CComboBox*)GetDlgItem(IDC_COMBOTHRDNUM))->GetCurSel(); ((CComboBox*)GetDlgItem(IDC_COMBOTHRDNUM))->GetLBText( index, strSel ); m_numThread = atoi((LPCTSTR)strSel); numThread = m_numThread; ((CComboBox*)GetDlgItem(IDC_COMBOTHRDNUM))->EnableWindow(TRUE); } } 5.用一秒为单位的定时器判断发送文件和是否异常。 void CServFigoDlg::OnTimer(UINT nIDEvent) { // TODO: Add your message handler code here and/or call default switch ( nIDEvent ) { case 0 : if ( m_sockServ->m_sendOK ) sendFile(); break; case 1 : if ( m_sockServ->m_stopRecved ) { KillTimer(1); MessageBox(\对方已经终止接受! 请退出...\ } break; default: ; } CDialog::OnTimer(nIDEvent); } 6.创建线程。 void CServFigoDlg::sendFile() { KillTimer(0); m_ctrlProgress.SetRange32(0, m_fileSize); //创建numThread个nEnvent事件用来实现互斥 for ( int i=0; im_ctrlProgress; CFile file; char data[ReadSize]; long BeginPos,Size; long FileLength; long ReadOnce,LeftToRead,count; if ( !file.Open(fileNameM,CFile::modeRead|CFile::shareDenyNone) ) { AfxMessageBox(\ return; } FileLength=(long)file.GetLength(); sendSockets[idx-1].Send(&FileLength,4); WaitForSingleObject(hMessageSend[idx-1],2000); sendSockets[idx-1].Send(fileNameM,40); GetBeginPosM(numThread,idx,FileLength,BeginPos,Size); file.Seek(BeginPos,CFile::begin); LeftToRead=Size; static DWORD sendCount=0; //实现了文件的分块发送,主要是在循环里面来进行的 while(LeftToRead>0) ////leftToRead是还有多少要发送 { if ( m_sockServ->m_stopRecved ) { return; } ReadOnce = ( LeftToRead>ReadSize ? ReadSize : LeftToRead ); count = file.Read( data,ReadOnce ); //读取相应大小文件到data

sendCount += ReadOnce;//已发文件计数; WaitForSingleObject( hMessageSend[idx-1],20 ); while ( SOCKET_ERROR == sendSockets[idx-1].Send(data,count) ) //发送 { } LeftToRead=LeftToRead-count;//设置剩余文件大小 // set progress Ctrl pMainDlg->m_ctrlProgress.SetPos(sendCount); CString str; str.Format(\ pMainDlg->GetDlgItem(IDC_STACOPYED)->SetWindowText(str); } file.Close(); 五、总结 1、运行效果

2、开发心得

在此次程序设计中,接触到了我们熟知的网络,在设计过程中总觉得好难实现,但在实现过程中,发现只要用心探索,一切皆有可能。通过课程设计,我对C++语言有了更深一步的了解,发现其用起来不是十分的方便,但确实是比较适合我们初学者学习的语言。这次课程设计我对网络编程有了一定的了解,虽然自己只用了C++,但在实际操作的过程中,也和同学们交流探讨了好多其他语言关于网络的应用,集思广益,拓宽了自己的眼界。增强了自己的实际动手能力,增加了学习计算机语言的兴趣,另外在课程设计中也得到了一定的成就感。

决定再今后的学习中,多看一些这类方面的书籍,来进一步的了解相关的网络编程知识,为以后的应用做准备。

六、参考文献

《计算机网络(第五版)》 谢希仁 电子工业出版社

《VisualC++网络通信编程实用案例精选(第二版)》 曹衍龙 人民邮电出版社 《VisualC++程序设计标准教程》 刘锐宁 人民邮电出版社 《VisualC++开发技术大全》 宋坤 人民邮电出版社 《VisualC++6.0实用教程》 康晓琳 电子工业出版社 《VisualC++6.0开打指南》 高守传 人民邮电出版社

七、任务完成

工作量统计(组长填写) 成员姓类的设计与实现 名 苏景波 LoginDlg AddBookStyle 界面消息响应函数 OnCtlColor() OnInitDialog() InitInstance() OnInitDialog() OnOK() OnCtlColor() OnBtnModityBookstyle2() OnInitDialog() OnBtnShowall() OnBtnDeleteBookstyle3() RefreshData() OnBtnQueding() OnBtnShowinfor() OnCtlColor() OnAdd() OnInitDialog() OnDelete() OnShoeall() OnInitDialog() OnDeleteText() OnBtnSearch() OnBtnShoeAll() OnInitDialog() OnDeleteText() OnBtnShowAll() OnInitDialog() OnBtnDeleteBook() OnBtnShowAll() OnBtnDeleteAllbook() OnInitDialog() OnDeleteBook() OnShowall2() OnModityInfor() OnBooknoteSave() 其他工作 合计 数据库表的设计,30% 数据源的连接 界面美化 查阅资料 BookStyle 刘浩 AddBook 查阅资料 25% UsuralSearch AdvancedSearch 董国庆 DeleteBook 查阅资料 20% ModityBook 张东明 BookNote 查阅资料 25% ReadText OnBooknoteOpen() OnInitDialog() OnCtlColor() OnBookSave() OnBookOpen() OnInitDialog() OnCtlColor() 界面的美化

本文来源:https://www.bwwdw.com/article/v297.html

Top