《P2P文件共享系统的实现分析》这篇优秀范文是126范文网由网友投稿提供或从网络上搜集整理的,文章版权归原作者所有。
126范文网坚持为大家提供免费,优质的范文服务。如果对《P2P文件共享系统的实现分析》有任何建议或要投稿,欢迎与我们联系,谢谢。
关键词:文件共享;P2P;策略;Qt
C/S式架构造就了一批著名的门户网站,如雅虎,新浪等。这些网站容易受到黑客的亲睐后果是服务崩溃。C/S式架构只有一个服务器或服务机群,服务器一旦崩溃,它提供的服务也将停止。而P2P式架构却正好相反,它没有服务器(相对C/S架构而言)或服务器是分布的,一个服务器崩溃了,其他的服务器照样能提供服务。这种架构能有效的抵抗DDOS攻击,它的安全性有很可靠的保障。另外,采用P2P式架构的网络资源共享系统不但大大的减轻了单个服务器的负担,而且也提高了很大的安全性。人们也可以通过这种架构建立自己的信息天地,与其他的人分享自己的资源。
1 系统设计实现的重点与难点 “谢谢访问'1'2'6'范'文'网,请看更多精品文章:www.126fw.com
系统QPS在Linux上用Qt开发,系统设计原理和策略都并不复杂,但这不代表系统的实现也是简单的。对于系统的整个实现来说,有三个地方是最重要的,也是比较难的。先介绍系统运行流程:
(1)Group-leader peer运行,并连接上其他的任意某个Group-leader peer;
(2)Ordinary peer连接(登陆)某个Group-leader peer,并把所资源表发送个Group-leader peer;
(3)Group-leader peer将已连接的其他PC的资源表发送给此ordinary peer;
(4)Ordinary peer浏览资源并选择下载或则向Group-leader peer发送资源搜索请求;
(5)Group-leader peer将资源表中符合搜索的资源所在ordinary peer的IP发给请求ordinary peer,同时向其他以连接的Group-leader peer发送搜索请求,其他的Group-leader peer将资源IP反馈,收到反馈后再发送个搜索ordinary peer;
(6)Ordinary peer从获得的资源表中选择下载,即与另一个ordinary peer建立连接,下载完毕后断开连接。
从上面的过程可以看出,系统共有三个通信链路,分别是:
(1)Group-leader peer与Group-leader peer之间的通信;
(2)ordinary peer与Group-leader peer之间的通信;
(3)ordinary peer与ordinary peer之间的通信。
三个通信链路上的信息都是不一样的。因此,必须给三个通信链路都制定相应的通信协议。QPS不是多线程的,因此对每个通信套接字来说,都必须知道对方的套接字。这在实现上也存在一定的难度,这个是由开发工具而带来的。最后一个难度是NAT穿透问题。为了解决不同局域网间的通信,这个问题的解决是必须的。由于开发硬件环境的限制,现版本的QPS本没有考虑这个问题。也就是说,实现的版本是局域网内的。在此,需要指出的是,NAT的问题并没有违背QPS的目的。首先,QPS只是当前的一个版本,以后可能会进一步完善;再者,在将来IPv6的推出就自然而然的解决了不同局域网内通信这一问题。
2 实现过程
针对上节的三个通信链路,必须要设计好三个通信协议。先看下QPS中需要传输的各种信息。如图1:
通信链路上的信息表示的意义如下:
Download request:文件下载请求信息;
File data:文件数据;
Local share list:本地的共享信息列表,包括文件名,文件大小,下载次数等;
Share list:Group-leader peer上的共享信息列表;
Search message:文件搜索信息,包括文件名及搜索跳数;
Search result:返回的搜索结果,包括文件名和文件所在IP;
Other leader msg:其他leader peer上的信息,包括连接ordinary peer数目和文件数量等;
Local share msg:和other leader msg一样。
(1) 数据结构定义。
为了实现以上三个通信协议,首先规定了一些数据结构,以区别不同的通信信息。个种数据结构如下:
#define FILEINFO 1//文件信息
#define SHAREINFO 2//共享列表信息
#define DOWNLOAD3//下载请求信息
#define SEARCH4//文件搜索信息
#define LEADERINFO 5//Group-leader peer信息
#define FILEDATA6//文件数据
#define MAX_SIZE (2048*10) //文件数据的大小
typedef struct
{
int type;//表示是何种信息,下同
ULONG size; //文件大小
ULONG downloadTimes; //文件下载次数
char name[100]; //文件名
}FileMsg; //文件信息结构体
typedef struct
