基于select I/O模型的远程目录浏览与多线程文件下载
2007-03-17 22:00:56 来源:WEB开发网核心提示: DWORD WINAPI CFileTransCltView::ThreadRequest(LPVOID lpParameter){DATA_PACKET requestPacket=*(DATA_PACKET*)lpParameter;SOCKET socket=::socket(AF_
DWORD WINAPI CFileTransCltView::ThreadRequest(LPVOID lpParameter)
{
DATA_PACKET requestPacket=*(DATA_PACKET*)lpParameter;
SOCKET socket=::socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
sockaddr_in sin;
sin.sin_addr.S_un.S_addr=inet_addr(strIP);
sin.sin_family=AF_INET;
sin.sin_port=htons(1032);
if(::connect(socket,(sockaddr*)&sin,sizeof(sin))!=0)
{
AfxMessageBox("Request failure!");
return 0;
}
int thrInfo;
if( requestPacket.packetType=='D' ) //save download thead infomation for function
// FillInFile()
{
thrInfo=requestPacket.length;
thrFlag=true;
}
::send( socket,(char*)&requestPacket,sizeof(requestPacket),0 );
memset( requestPacket.content,0,sizeof(requestPacket.content) );
if( ::recv(socket,(char*)&requestPacket,sizeof(requestPacket),0) )
{
if( requestPacket.packetType=='r' )
{
int szBuffer=requestPacket.length;
pDrives=new char[2000]; //Make sure that allocate memery!
memcpy(pDrives,requestPacket.content,szBuffer); //Make sure that use memcpy()
}
if(requestPacket.packetType=='d' )
{
pDrives=new char[2000]; // 再次为pDrives分配空间才不会出错
Memcpy( pDrives,requestPacket.content,sizeof(requestPacket.content) );
/* 2000 will take an error ?????*/
//char's pointer to CString Array
int i=0,j=0;
while( i<requestPacket.length )
{
for(int k=0; pDrives[i]!='|' && i<requestPacket.length ; k++,i++ )
arrFiles[j].Insert(k,pDrives[i]);
i++;
j++;
}
return 0;
}
if( requestPacket.packetType=='f' )
fSize=requestPacket.length;
//Download file
if( requestPacket.packetType=='D' )
{
//memset( pDrives,0,2000 );
Memcpy( pDrives,requestPacket.content,sizeof(requestPacket.content) );
FillInFile( socket,thrInfo,requestPacket.length,pDrives);
}
}
::closesocket(socket);
return 0;
}
四 程序结构图
看别人的程序绝对不是一件好事, 要看个明白就更难了, 特别是没有算法描述甚至一句注释都没有的程序。所以把程序流程图画了出来,好明白一些。
1. 服务器端
服务器端的大致流程就是这样, 线程里面就是select(...)。不过有些判断和出错处理未画出。从商业程序角度看来,有两点是很重要的, 一是捕获异常和出错处理, 二是简洁高效。我们编程应往这方面靠拢。
图1
2. 客户端
图2
3. 客户端线程
图3
4. 双击树项目:
图4
5. 写文件FillInFile
图5
- ››基于IP地址的vsftp服务器
- ››基于MySQL 水平分区的优化示例
- ››基于CentOS5的Linux下pptp和openvpn的搭建及配置
- ››基于JavaScript的网页版塔防游戏
- ››基于Android平台 QQ大战360手机游戏爆红
- ››基于Windows Azure的云计算应用设计
- ››基于AES算法实现对数据的加密
- ››基于SoPC目标板Flash编程设计的创建及应用
- ››基于SolidWarks齿轮机构的运动分析与仿真
- ››基于Windwos Server 2008故障转移群
- ››基于JavaScript的REST客户端框架
- ››基于JavaScript和CSS的Web图表框架横向对比
更多精彩
赞助商链接