2024年4月19日发(作者:)

点对点(P2P)多线程断点续传的实现

在现在的网络应用中,文件的传送是重要的功能之一,也是共享的基础。一些重要的

协议像HTTP,FTP等都支持文件的传送。尤其是FTP,它的全称就是“文件传送协

议”,当 初的工程师设计这一协议就是为了解决网络间的文件传送问题,而且以其稳

固,高速,简单而一直维持着专门大的生命力。作为一个程序员,利用这些现有的协议传

送文件相当简单,不过,它们只适用于服务器模式中。如此,当咱们想在点与点之间传送

文件就不适用了或相当麻烦,有一种大刀小用的意味。笔者一直想寻求一种简单有效,且

具有多线程断点续传的方式来实现点与点之间的文件传送问题,通过大量的翻阅资料与测

试,终于实现了,现把它共享出来,与大家分享。

我写了一个以此为基础的实用程序(网络传圣,包含源代码),可用了基于TCP/IP

的电脑上,供大家学习。

(本文源代码运行效果图)

实现方式(VC++,基于TCP/IP协议)如下:

仍釆用服务器与客户模式,需分别对其设计与编程。

服务器端较简单,主要就是加入待传文件,监听客户,和传送文件。而那些断点续传

的功能,以及文件的管理都放在客户端上。

一、服务器端

第一介绍服务器端:

最开始我们要定义一个简单的协议,也就是定义一个服务器端与客户端听得懂的语

言。而为了把问题简化,我就让服务器只要听懂两句话,一就是客户说“我要读文件信

息”,二就是“我准备好了,可以传文件了”。

由于要实现多线程,必须把功能独立出来,且包装成线程,首先建一个监听线程,主

要负责接入客户,并启动另一个客户线程。我用VC++实现如下:

DWORD WINAPI listenthread(LPVOID lpparam)

{

//由主函数传来的套接字

SOCKET pthis=(SOCKET)lpparam;

//开始监听

int rc=listen(pthis,30);

//若是错就显示信息

if(rc<0){

CString aaa;

aaa="listen错误n";