没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
点对点多线程断点续传的实现
在如今的网络应用中,文件的传送是重要的功能之一,也是共享的基础。一些重要的协议
像 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 错误";
AfxGetMainWnd()->SendMessageToDescendants(WM_AGE1,
(LPARAM)aaa.GetBuffer(0),1);
aaa.ReleaseBuffer();
return 0;
}
//进入循环,并接收到来的套接字
while(1){
//新建一个套接字,用于客户端
SOCKET s1;
s1=accept(pthis,NULL,NULL);
//给主函数发有人联入消息
CString aa;
aa="一人联入!\n";
AfxGetMainWnd()->SendMessageToDescendants(WM_AGE1,(LPARAM)aa.GetBuffer(0),1);
aa.ReleaseBuffer();
DWORD dwthread;
//建立用户线程
::CreateThread(NULL,0,clientthread,(LPVOID)s1,0,&dwthread);
}
return 0;
}
接着我们来看用户线程:
先看文件消息类定义:
struct fileinfo
{
int fileno;//文件号
int type;//客户端想说什么(前面那两句话,用 1,2 表示)
long len;//文件长度
int seek;//文件开始位置,用于多线程
char name[100];//文件名
};
用户线程函数:
DWORD WINAPI clientthread(LPVOID lpparam)
{
//文件消息
fileinfo* fiinfo;
//接收缓存
char* m_buf;
m_buf=new char[100];
//监听函数传来的用户套接字
SOCKET pthis=(SOCKET)lpparam;
//读传来的信息
剩余10页未读,继续阅读
资源评论
缘集紫雲
- 粉丝: 3
- 资源: 16
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功