请教,多客户端并行传大文件的思路
如题。我的思路:每个线程对应一定数量的客户端,用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; } } }