1引言 文件传输软件是一种很常见的软件,但是很多传输软件对要传送的文件的大小有要求,一般最大是4G,当传输的文件大于4G时就无法传输。本文设计的传输软件几乎可以不受文件大小的约束。而且系统开销小,操作简单。 2软件设计 2.1套接字(Socket) 套接字是通信的基石,是支持TCP/IP协议的网络通信单元。可以将套接字看作不同主机间的进程双向通信的终点,它构成了在单个主机内及整个网络间的编程界面。套接字有两种不同的类型:流套接字和数据套接字。流套接字提供双向的、有序的、无重复并且无记录的数据流服务,它适用于处理大量数据。数据套接字支持双向的数据流,但并不保证数据传输的可靠性、有序性和无重复性。因此,根据本文的设计的需要选择流套接字。 2.2客户机/服务器模型 本软件采用的是服务器客户机的模式。一个服务程序通常在一个众所周知的地址监听客户对服务的请求,也就是说,服务进程一直处于休眠状态,知道一个客户对这个服务的地址提出了连接请求。在这个时刻,服务程序被"惊醒"并且为客户提供服务--对客户的请求做出反应。这一请求/响应的过程可以简单地用图1表示。 3软件的编程实现 该软件是在VC++6.0上编程实现的,下面介绍该软件的几个关键部分。 3.1大文件传输的处理 一般传输软件设计的数据类型都是32位的,所以传输文件最大只能是4G。本文将文件大小的数据类型定义为64位,那么传输文件可以到234G,几乎为无穷大。软件的部分代码如下: unsigned__int64m_FileLength=0; m_FileLength=m_FileLength+StreamFileInfo.nFileSizeHigh; m_FileLength=m_FileLength<<32; m_FileLength=m_FileLength+StreamFileInfo.nFileSizeLow; 其中m_FileLength为无符号的64为类型,存储文件的长度。StreamFileIfo为文件信息结构体类型,其中将文件的大小信息分割成长度为32位的两部分,分别存在StreamFileInfo.nFileSizeHigh和StreamFileInfo.nFileSizeLow里面。 3.2多线程实现 该软件采用两个线程,一个是接收线程UINTReceiveDataThread(LPVOIDlpParam);另一个是发送线程UINTSendDataThread(LPVOIDpParam);当服务器端点击发送按钮后启动发送线程,启动发送线程的函数为:AfxBeginThread((AFX_THREADPROC)SendDataThread,this,THREAD_PRIORITY_NORMAL); 当客户端点击接收按钮后启动接收线程,启动接收线程的函数为:AfxBeginThread(ReceiveDataThread,this,THREAD_PRIORITY_NORMAL); 服务器与客户机的通信流程见图2。 3.3磁盘剩余空间判断 当客户端接收文件的时候首先判断磁盘的剩余空间是否可以满足文件大小的要求,然后再进行传输。获取磁盘信息的函数为:GetDiskFreeSpaceEx(str.Left(3),&lpuse,&lptotal,&lpfree); 其中,str.Left(3)为磁盘的盘符,lpuse为已用空间大小,lptotal为总的空间大小,lpfree为剩余空间大小。最后将lpfree与m_FileLength作比较判断磁盘空间是否满足文件存储的要求。 4总结 本文通过在VC++6.0上编程实现了可以在整个网络传输的功能,传输文件的大小几乎没有限制,服务器可以随时暂停和终止文件的传输,客户端在接收文件的时候可以事先判断磁盘的容量,当磁盘空间不足的时候会出现提示信息。下图为实际生成的软件界面。 [参考文献] [1]莫海光.用VC++实现的文件传输工具[J].计算机信息技术,2007年第15期. [2]陈坚,陈伟,等.VisualC++网络高级编程[M].人民邮电出版社,2001年. |