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

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

ID:9047042

大小:36.50 KB

页数:12页

时间:2018-04-15

点对点(p2p)多线程断点续传的实现_第1页
点对点(p2p)多线程断点续传的实现_第2页
点对点(p2p)多线程断点续传的实现_第3页
点对点(p2p)多线程断点续传的实现_第4页
点对点(p2p)多线程断点续传的实现_第5页
资源描述:

《点对点(p2p)多线程断点续传的实现》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

1、点对点(P2P)多线程断点续传的实现在如今的网络应用中,文件的传送是重要的功能之一,也是共享的基础。一些重要的协议像HTTP,FTP等都支持文件的传送。尤其是FTP,它的全称就是“文件传送协议”,当初的工程师设计这一协议就是为了解决网络间的文件传送问题,而且以其稳定,高速,简单而一直保持着很大的生命力。作为一个程序员,使用这些现有的协议传送文件相当简单,不过,它们只适用于服务器模式中。这样,当我们想在点与点之间传送文件就不适用了或相当麻烦,有一种大刀小用的意味。笔者一直想寻求一种简单有效,且具备多线程断点续传的方法来实现点与点之间的文件传送问题,

2、经过大量的翻阅资料与测试,终于实现了,现把它共享出来,与大家分享。我写了一个以此为基础的实用程序(网络传圣,包含源代码),可用了基于TCP/IP的电脑上,供大家学习。upload/2004_06/04062118541204.gif(本文源代码运行效果图)实现方法(VC++,基于TCP/IP协议)如下:仍釆用服务器与客户模式,需分别对其设计与编程。服务器端较简单,主要就是加入待传文件,监听客户,和传送文件。而那些断点续传的功能,以及文件的管理都放在客户端上。一、服务器端首先介绍服务器端:最开始我们要定义一个简单的协议,也就是定义一个服务器端与客户

3、端听得懂的语言。而为了把问题简化,我就让服务器只要听懂两句话,一就是客户说“我要读文件信息”,二就是“我准备好了,可以传文件了”。由于要实现多线程,必须把功能独立出来,且包装成线程,首先建一个监听线程,主要负责接入客户,并启动另一个客户线程。我用VC++实现如下:DWORDWINAPIlistenthread(LPVOIDlpparam){//由主函数传来的套接字  SOCKETpthis=(SOCKET)lpparam;//开始监听intrc=listen(pthis,30);//如果错就显示信息if(rc<0){CStringaaa;aaa=

4、"listen错误";AfxGetMainWnd()->SendMessageToDescendants(WM_AGE1,(LPARAM)aaa.GetBuffer(0),1);aaa.ReleaseBuffer();return0;}//进入循环,并接收到来的套接字while(1){//新建一个套接字,用于客户端SOCKETs1;s1=accept(pthis,NULL,NULL); //给主函数发有人联入消息CStringaa;aa="一人联入!";AfxGetMainWnd()->SendMessageToDescendants(W

5、M_AGE1,(LPARAM)aa.GetBuffer(0),1);aa.ReleaseBuffer();DWORDdwthread;//建立用户线程::CreateThread(NULL,0,clientthread,(LPVOID)s1,0,&dwthread);}return0;}接着我们来看用户线程:先看文件消息类定义:structfileinfo{intfileno;//文件号inttype;//客户端想说什么(前面那两句话,用1,2表示)longlen;//文件长度intseek;//文件开始位置,用于多线程charname[100]

6、;//文件名};用户线程函数:DWORDWINAPIclientthread(LPVOIDlpparam){//文件消息fileinfo*fiinfo;//接收缓存char*m_buf;m_buf=newchar[100];//监听函数传来的用户套接字SOCKETpthis=(SOCKET)lpparam;//读传来的信息intaa=readn(pthis,m_buf,100);//如果有错就返回if(aa<0){closesocket(pthis);return-1;}//把传来的信息转为定义的文件信息fiinfo=(fileinfo*)m_b

7、uf;CStringaaa;//检验客户想说什么switch(fiinfo->type){//我要读文件信息case0://读文件aa=sendn(pthis,(char*)zmfile,1080);//有错if(aa<0){closesocket(pthis);return-1;}//发消息给主函数aaa="收到LIST命令";AfxGetMainWnd()->SendMessageToDescendants(WM_AGE1,(LPARAM)aaa.GetBuffer(0),1);break;//我准备好了,可以传文件了case2://发文

8、件消息给主函数aaa.Format("%s文件被请求!%s",zmfile[fiinfo->fileno].name,nameph[

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。