点对点多线程断点续传的实现
2010-01-09 20:31:56 来源:WEB开发网接着我们来看用户线程:
先看文件消息类定义:
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;
//读传来的信息
int aa=readn(pthis,m_buf,100);
//如果有 错就返回
if(aa<0){
closesocket (pthis);
return -1;
}
//把传来的信息转为定义的文件信息
fiinfo=(fileinfo*)m_buf;
CString aaa;
//检验客户想说什么
switch(fiinfo->type)
{
//我要读文件信息
case 0:
//读文件
aa=sendn(pthis,(char*) zmfile,1080);
//有错
if(aa<0){
closesocket (pthis);
return -1;
}
//发消息给主函数
aaa="收到LIST命令 \n";
AfxGetMainWnd()->SendMessageToDescendants(WM_AGE1,(LPARAM) aaa.GetBuffer(0),1);
break;
//我准备好了,可以传文件了
case 2:
//发文件消息给主函数
aaa.Format("%s 文件被请求!% s\n",zmfile[fiinfo->fileno].name,nameph[fiinfo->fileno]);
AfxGetMainWnd()->SendMessageToDescendants(WM_AGE1,(LPARAM)aaa.GetBuffer(0),1);
//读文件,并传送
readfile(pthis,fiinfo->seek,fiinfo->len,fiinfo- >fileno);
//听不懂你说什么
default:
aaa="接收协议错误! \n";
AfxGetMainWnd()->SendMessageToDescendants(WM_AGE1,(LPARAM) aaa.GetBuffer(0),1);
break;
}
return 0;
}
更多精彩
赞助商链接