标题:请教,多客户端并行传大文件的思路
只看楼主
lyl930130
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:323
专家分:111
注 册:2013-5-13
结帖率:91.43%
 问题点数:0 回复次数:1 
请教,多客户端并行传大文件的思路
如题。我的思路:每个线程对应一定数量的客户端,用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;
                        }
                }


 }
搜索更多相关主题的帖子: 服务器 listen 时间短 客户端 如何 
2016-04-18 09:14
lyl930130
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:323
专家分:111
注 册:2013-5-13
得分:0 
空格没弄好,重新发一下代码
程序代码:
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;
         }
    }

}
2016-04-18 09:19



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-463770-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.368882 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved