P2P技术实现方式有很多,现主要介绍利用socket tcp方式构建P2P环境的方法。
在开始的时候主要参考NBD协议部分的server端程序来实现BT服务端程序。
每个client端都有两个进程来实现P2P功能,一个是客户端的server程序,另一个是客户端的client程序。而BT服务器端只有一个进程,负责资源分配和负载平衡等工作。
下面是服务端程序的注意事项。调试是总发现有“Address already in use”信息出现,加入下面代码可以解决此问题。
/* lose the pesky "Address already in use" error message */
if (setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof(int)) == -1) {
perror("setsockopt SO_REUSEADDR");
}
if (setsockopt(sockfd,SOL_SOCKET,SO_KEEPALIVE,&yes,sizeof(int)) == -1) {
perror("setsockopt SO_KEEPALIVE");
}
每一个客户端发起请求时,首先询问服务器端,整个下载的镜像的种子分布状态,之后获得每一个片的种子分布状态。服务器端的server为每一个客户端的请求fork出一个进程。等待客户端下载完成后,报告个服务器端,此片我已经下载完成,并更新BT资源数据。同时可以设计客户端向BT服务器是否可以关机/开机做种等机制。
种子资源数据结构如下:
struct pieces_t{
struct list_head head;