基于select I/O模型的远程目录浏览与多线程文件下载
2007-03-17 22:00:56 来源:WEB开发网核心提示: DWORD WINAPI CFileTransSvrView::ThreadSelect(LPVOID lpParameter){// 初始化fd_setSOCKET sListen=(SOCKET)lpParameter;fd_set fdSocket;FD_ZERO(&fdSocket
DWORD WINAPI CFileTransSvrView::ThreadSelect(LPVOID lpParameter)
{
// 初始化fd_set
SOCKET sListen=(SOCKET)lpParameter;
fd_set fdSocket;
FD_ZERO(&fdSocket);
FD_SET(sListen,&fdSocket);
// 不断循环遍历fd_set, 如果某项置位, 则表示该socket可用, 如果状态为正在侦听,
// 则建立连接, 并把它加入到fd_set中, 否则就等待接收数据。select有自动机制把不可
//用的socket从fd_set中删除。
while(TRUE)
{
fd_set fdRead=fdSocket;
int nRet=::select(0, &fdRead, NULL, NULL, NULL);
if(nRet>0)
{
for(int i=0;i<(int)fdSocket.fd_count;i++)
{
if(FD_ISSET(fdSocket.fd_array[i],&fdRead))
{
if(fdSocket.fd_array[i] == sListen)
{
sockaddr_in addrRemote;
int nAddrLen=sizeof(addrRemote);
SOCKET sNew=::accept(sListen,(sockaddr*)&addrRemote,&nAddrLen);
FD_SET(sNew,&fdSocket);
}
else
{
DATA_PACKET recvPacket;
int nRecev=::recv(fdSocket.fd_array[i], (char*)&recvPacket,
sizeof(recvPacket), 0)。
if(nRecev>0)
{
// respond request
}
else
{
::closesocket(fdSocket.fd_array[i]);
FD_CLR(fdSocket.fd_array[i], &fdSocket);
}
}
}
}
}
}
return 0;
}
2 文件下载函数
- ››基于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图表框架横向对比
更多精彩
赞助商链接