请教,多客户端并行传大文件的思路
如题。我的思路:每个线程对应一定数量的客户端,用select判断,实现多客户端和一个服务器类似并行的通信。问题:少量的数据,由于传输时间短,可以忽略不计,可以做到。但是当传大文件的时候,比如多个客户端同时要传大文件,就变成了A传文件,传完以后B传文件......变成一个纯线性的了。
求教如何多客户端并行传大文件。思路和相关代码或者链接都可,非常感谢。
下面是我的部分代码:
各变量含义:
NUM_CLIENT //单个线程接入最大客户端数
sock_listen //listen(sock_listen)80端口 全局变量
sock_temp[] //listen(sock_temp[i])
client[] //当有accept时,client[i]=accept(sock_temp[i]),否则client[i]=sock_temp[i] 全局变量
flag[] //标志是否accept过
程序代码:while(1)
{
// Sleep(2000);
num=0;
printf("线程 %d 监听中,hahahahaha......\n",ThreadId);
for(Max_sock=0,i=0;i<NUM_CLIENT;i++)
Max_sock=Max_sock>client[i]?Max_sock:client[i];
FD_ZERO(&fdr);
for(i=0;i<NUM_CLIENT;i++)
if(client[i])
{
FD_SET(client[i],&fdr);
num++;
}
if(if_Accept(ThreadId))
FD_SET(sock_listen,&fdr);
else
if(num==0)
continue;
ret=select(Max_sock+1,&fdr,NULL,NULL,&time_sock);
switch(ret)
{
case -1:printf("select error :%d\n",WSAGetLastError());break;
case 0: break;
default:
{
for(i=0;i<NUM_CLIENT;i++)
if(FD_ISSET(client[i],&fdr)>0)
if(flag[i]==1)//是否需要accept =1标示不需要
{
if(Trans_Data(i))//一次性传输整个文件
{//若传完文件对方关闭socket
closesocket(client[i]);
client[i]=0;
closesocket(sock_temp[i]);
sock_temp[i]=0;
flag[i]=0;
}
}
else
{
client[i]=accept(sock_temp[i],(sockaddr *)&addr_temp,&len);
if(client[i]==INVALID_SOCKET)
{
client[i]=sock_temp[i];
printf("error accept : %d\n",WSAGetLastError());
}
else
{
flag[i]++;
}
}
if(FD_ISSET(sock_listen,&fdr)>0)
if(if_Accept(ThreadId))//看当前线程的客户端数是否达到上限
Accept(ThreadId,sock_temp);//创建一个新端口并监听,将该端口号发给客户端。客户端断开连接后连接新端口
break;
}
}
}


