2024年5月9日发(作者:不用u盘怎么重装系统)
SOFTWAREDEVELOPMENTANDDESIGN
软件开发与设计
P2P多点共享传输软件的设计与实现
赵专政
(湖南城市学院数学与计算科学系,益阳413000)
摘要:采用P2P(Peer-to-Peer)技术多点共享式文件传输,任何一个进行下载的客户,在下载的同时,也能够
作为服务器把它已接收到的数据提供给另外一个客户进行下载。这种方式可以有效地均衡上下行线路的数据量,同
时每个客户端又可以部分作为服务器端,减轻了服务器的带宽压力。本系统用MicrosoftVisualC++6.0编写,实现了
在局域网中若干台机器互为客户端和服务端,共同完成一个下载任务的功能。
关键词:P2P;文件共享;多点共享
DesignandRealizationoftheMulti-spotsSharingTransferingSoftwarebasedonP2P
ZHAOZhuanzheng
(DepartmentofMathematicsandComputerSciencer,HunanCityUniversity,Yiyang413000)
Abstract:UseofPeer-to-PeerNetworkingtechnologymulti-spotssharedfiletransfer,anyoneofthecustomersdownloaded
ientcanbe
usedasserver,temdevelopmenttoolisMicrosoftVisualC++6.0anda
numberofcomputerfinishatasktogetherasclientandserver.
Keywords:PeertoPeer;FileSharing;Multi-spotsSharing
1功能分析
随着计算机网络的普及,对文件的共享需求也越来越大,
1)搜索局域网内共享资源。(
(2)对共享所需资源的所有服务器发送连接请求。
(3)实现对文件分段下载。
提供共享文件的下载服务也成为网络的一个主要应用之一,
传统的方式是将文件放在服务器上,通过FTP方式进行下载,
这种方式的主要缺点有两个:一是下载人数过多时,会导致
服务器的带宽紧张,下载速度变慢;二是下载时数据是单向
的,下行数据量大,上行数据量少,造成网络带宽的使用不
均衡。
因为以上问题,现在提出了一种基于P2P方式的多点共
享式文件传输(BT下载),任何一个进行下载的客户,在下载
的同时,也可以把它已接收到的数据作为服务端,提供给另
外一个客户进行下载。这种方式可以有效地均衡上下行线路
的数据量,同时每个客户端又可以部分作为服务器端,减轻
了服务器的带宽压力,做到“下载的人越多,下载速度越
。快”
本软件是基于P2P的多点共享式文件传输软件,它完成
了寻找伙伴、上传、下载等基本功能。可以做到若干台机器
互为客户端和服务端,共同完成一个下载任务。
1.1P2P服务器端功能
服务器端主要完成文件共享和资源上传的功能,详细功
能需求如下:
(1)提供文件共享。
(2)监听客户端的连接请求。
(3)能够根据客户端的请求发送共享文件列表或文件块。
1.2P2P客户端功能
客户端主要完成搜索共享资源和多点下载功能,详细功
能需求如下:
本文收稿日期:2008年8月5日
2模块功能
在明确系统功能后,把系统分为六大功能模块,分别是
共享模块、监听模块、搜索模块、连接模块,文件发送模块
和文件接收模块。
(1)共享模块:该模块实现开放端口和选择需要共享的
资源并将其共享。
(2)监听模块:该模块实现在服务器启动并共享资源后,
不断监听客户端发来的请求,并对于不同的请求做出相应的
回应。
(3)连接模块:该模块实现客户端在需要获得共享文件
列表或者共享文件时,向服务器端发送相应的请求。
(4)搜索模块:该模块实现客户端搜索整个局域网内有
哪些共享资源,并且在客户端显示出来供用户选择。
(5)文件发送模块:该模块实现服务器和客户端在已经
连接以后对共享文件列表和共享文件的发送和接收。
(6)文件接收模块:向每个共享所需文件的服务器发送文
件请求命令以及接收共享文件列表和文件块并生成目标文件。
客户端向服务器端发送的请求分为两种,一种是请求共
享文件列表,一种是请求共享文件块。发送共享文件列表请
求后,全部服务器都会向该客户端发送共享文件列表;共享
文件请求只会向共享了所需文件的服务器发送,收到请求的
服务器会按照请求内容向该客户端发送相应的文件块。
本系统的服务器端一直处于监听状态,服务器在收到客
户端的请求后先判断其类型,请求分为对共享文件列表的请
求和对共享文件的请求,在确认请求类型后按要求向客户端
-11-
电脑编程技巧与维护
发送文件块。
P2P客户端
返回值判断是否监听错误。然后用一个死循环while(1)不断
接收来自client的连接请求。死循环while(1)由accept(sLis-
tening,NULL,NULL)发生阻塞。
3.1.4文件传输
接收信息发送请求
Clientthread调用intread(SOCKETfd,char*bp,intlen)函
数读取客户端的请求,来判断客户端是请求共享文件列表信
息还是请求发送共享文件,在客户端发过来的请求命令中的
type字段表示请求种类,type=0表示请求服务器端发送文件列
表信息,type=2表示请求发送共享文件块;然后调用void
readfile(SOCKETso,intseek,intlen,intfino)函数发送相
应文件,它的参数包括socket地址、文件起始位置、文件长
度以及文件编号。首先以:modeRead的方式打开要发送的文
件,根据seek参数把指针移动到指定位置,再定义一个发送
请求共享
文件列表
请求共享
文件块
接受并显示共
享文件列表
接收共享文件块
并生成目标文件
图1客户端系统结构图
P2P服务器端
接收请求处理请求发送文件
缓冲区,大小为20字节,从文件中每次读取20字节的内容
存入缓冲区,然后再发送给客户端,再计算剩余要发送的文
件块长度,直至文件发送块发送完毕,实现了在发送文件时
读请求命令
判断请求类型
发送共享文
件列表
发送共享文件
有选择地发送客户端请求的文件块。
3.2客户端
3.2.1连接服务器并搜索共享资源
该功能由voidCClient1View::OnConnect()函数实现,具
体过程是首先获得本机的IP地址,具体做法是先定义一个
hostent的指针phost,通过gethostname获得主机名,然后通过
主机名调用gethostbyname()函数返回一个指向结构体?hos-
tent?的指针,再获取phost->h_addr_list的值,把值赋给事先
定义好的数组IP[4],这样就获得了本机的IP地址,然后就
可以开始连接服务器了,在连接服务器时首先要知道局域网
内有哪些机器处于在线状态,通过本机IP地址可以获得局域
网内的所有机器IP地址,然后ping每一台机器可以知道该机
器是否在线,得到在线机器IP后,通过发送连接请求来等待
这些服务器的回应,在服务器的回应消息中就包含有共享资
源列表。
3.2.2请求发送文件模块
获得共享文件列表后,用户选择要下载的文件,选择功
能是通过OnDblclk(NMHDR*pNMHDR,LRESULT*pResult)
函数实现的,双击共享文件名,由鼠标消息得到一个文件在
共享资源列表中的索引,然后通过索引就可以查找到请求发
送的文件名,这时系统会根据共享资源的来源发送N条文件
传输请求,请求中包含文件名、文件的起始位置和文件长度、
平均地从N台机器下载文件块。
3.2.3接收文件块并生成目标文件
当客户端发出传送文件请求后就已经准备好接收文件了,
在接收文件时,客户端为每个发送文件的服务器都创建一个
独立的线程,同时接收多个服务器发来的文件块。下面具体
说明一下接收文件的过程,客户端首先会尝试打开目标文件
(也就是需要下载的文件),如果打开失败,说明是第一次传
送该文件,那么就会创建一个新文件作为目标文件和辅助文
件;如果打开成功,再打开其辅助文件,如果辅助文件打开
(下转到17页)
图2服务器端系统结构图
3系统设计
3.1服务器端
3.1.1开放端口
CServer1View::OnServerStart()函数实现端口开放,即启
动服务器。如果服务器还没有启动,首先创建一个sockad-
dr_in结构体数据local,为local分配FamilyAddress、port、
IP和连接模式,这里是用的TCP/IP模式,IP是本机IP,端口
是10001;然后创建m_sListening监听套接字,把本机和套接
字绑定起来;再以m_sListening创建一个新线程,如果该线程
不为空,则成功启动服务器;如果为空则是出现异常,服务
器启动失败。如果服务器已经启动,就提示服务器已经启动,
无需再启动了。
3.1.2共享文件
首先判断已添加文件个数是否为9个,本程序设计最多
只能共享9个文件,否则会提示已共享9个文件不能再共享
了;确定添加文件后,打开一个打开文件的对话框,选择要
共享的文件;然后把文件路径赋给fnamepath;然后建立一个
CFILE的对象myFile;再打开共享文件,获取文件大小,最后
关闭文件();在此过程中还会把文件名称和文件
路径赋值给zmfile[count].name和nameph[count]用于以后
判断是否有相同的文件添加进来。
//打开文件
(fnamepath,CFile::modeRead|CFile::typeBinary|
CFile::shareDenyNone);
zmfile[count].length=gth();//获取文件长度
3.1.3监听客户端请求
DWORDWINAPIlistenthread(LPVOIDlpparam)此函数实
现监听client端的连接请求。具体是用sListening指向一个
socket,然后用listen函数监听,最大连接数是30,通过rc的
-12-
SOFTWAREDEVELOPMENTANDDESIGN
OleDbConnectionmyConn=newOleDbConnection(my-
ConnString);
();
stringmySQLString="UpdateksbkStructionsetvisi-
ble_yes_or_no=false";
OleDbCommandmyComm=newOleDbCommand
(mySQLString,myConn);
eNonQuery();
if(>0)
{
for(inti=0;i<;i++)
{
edIndex=i;
stringtmpvalue=ng();
mySQLString="updateksbkStructionsetvisi-
ble_yes_or_no=truewherefield_name='"+tmpvalue+"'";
dText=mySQLString;
eNonQuery();
}
}
();
nCurrentPageIndex=0;
GridViewDataBind();
}
}
(上接第12页)
失败,则说明该文件已经存在,提示是否重新下载,如果辅
助文件打开成功,就继续续传,根据辅助文件中的seek值定
位到文件指定位置,继续接收文件,接收完毕后生成目标文
件并删除辅助文件。在接收文件的过程中,双击文件下载进
度框中的文件名称可以实现暂停和开始功能。在双击文件名
时首先判断下载进度框中文件状态为下载中还时暂停,如果
是下载中,voidCOnlineList::OnDblclk(NMHDR*pNMHDR,
LRESULT*pResult)函数发消息intCMainFrame::Onclick
(WPARAMwParam,LPARAMlParam)函数,该函数将下载进程
挂起,并且把文件下载状态置为暂停;如果再双击一下,那
么intCMainFrame::Onright(WPARAMwParam,LPARAM
lParam)函数会收到消息,首先判断正在下载的文件数是否为
3,如果为3则提示最多只能同时下载3个文件;如果不为3,
就会将挂起的进程重新开始,并把文件下载状态改回下载中。
软件开发与设计
4结语
以上程序在中调试运行成功,运行的效果如
图5所示,其设计思想也成功运用于实际项目中。
图5
参考文献
[1]黄国平等.C#实用开发参考大全.北京:电子工业出版
社,2008.
基金项目:广西教育创新项目
作者简介
屈泽明,男(1965-),硕士生,主要研究方向:数据库应用、
应用技术。
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
和B机器进行下载。在下载过程中,C机下载文件的速度明
显大于B机的下载速度,大概是B机的2倍左右。
4.2结论
本系统实现了局域网内的点对点的文件传输,服务器端
启动后添加共享文件,同时侦听来自客户端的请求信息,根
据信息的不同执行相应的操作。本系统很好地完成了寻找伙
伴、上传、下载等功能,有效地均衡了上下行线路的数据量,
同时每个客户端又可以部分作为服务器端,减轻了服务器的
。带宽压力,做到了“下载的人越多,下载速度越快”
参考文献
[1]张杰,张尧,黄道颖等.P2P网络中一种改进的片段选择
控制策略[J].微计算机信息,2007,(21).
[2]刘宝旭,李雪莹,于传松.P2P技术及应用[J].计算机工
程与应用,2003,39:54.
[3]李祖鹏,赵修斌,黄道颖等.Peer-to-Peer网络中安全对
等组的实现[J].计算机工程与应用,2003,5(10):60.
[4]黄道颖.基于主动网络的分布式P2P网络模型[J].软件学
报,2004,15:1081—1085.
[5]鞠大鹏.一种P2P环境下的B+树索引管理算法[J].计算
机研究与发展,2005,42:143.
作者简介
赵专政,男(1975-),讲师,硕士,主要研究方向:计算机
网络。
4系统测试与结论
4.1系统测试
本系统在一个局域网内进行测试,要求局域网至少有3
台机器。首先在A机器启动服务器端,同时选择添加需要传
输的文件,A机器提供的文件相当于提供的种子文件。这里需
要注意的是系统的P2P传输端口默认的是10001,所以如果这
两个端口被占用的时候系统会提示没有启动socket端口。然
后在B机器启动客户端并连接A的服务器端,选中下载文件,
开始下载;再启动B机器的服务器端,把选择添加种子文件
到待下载列表。接着启动C机器的客户端并同时连接A机器
-17-
发布者:admin,转转请注明出处:http://www.yc00.com/xitong/1715238540a2587247.html
评论列表(0条)