我要在一个服务器---多客户端应用程序中,在通信过程中为每一个客户端都开一个线程,但是客户的数量是
随即的,也就是  DWORD WINAPI ThreadRecv(LPVOID lpParam)的定义应该是动态的,每一个客服端的功能都一样,应该怎样实现呢!也就是每个用户要使用的代码都相同,但属于不同的线程,应该怎样解觉呢!我刚学VC,很菜,请帮忙!

解决方案 »

  1.   

    static DWORD ThreadRecv(LPVOID lpParam);有一个客户端连接上来就创建一个线程,将ThreadRecv作为每个线程的入口函数
      

  2.   

    Windows网络与通信程序设计
    王艳平有这样的例子
    书上有代码
      

  3.   

    参考:UINT _ListenTcpThread(LPVOID lparam)
    {//TCP监听线程
    CBackupClientDlg *pDlg=(CBackupClientDlg *)lparam;
    if(pDlg->StopServer==true) return -1;

    CSocket sockSrvr;
    pDlg->m_Potr=PORT+pDlg->m_server;
    int createSucceed=sockSrvr.Create(pDlg->m_Potr);
    if(createSucceed==0)
    {
    AfxMessageBox("_ListenTcpThread Create错误!"+pDlg->GetError(GetLastError()));
    return -1;
    }

    int listenSucceed=sockSrvr.Listen();//本机指定端口监听网络事件
    if(listenSucceed==0)
    {
    AfxMessageBox("_ListenTcpThread Listen错误!"+pDlg->GetError(GetLastError()));
    return -1;
    }

    CSocket recSo;
    SOCKADDR_IN client;
    int iAddrSize=sizeof(client);
    //监听到网络事件交给接收线程处理,监听线程继续监听消息
    int acceptSucceed=sockSrvr.Accept(recSo,(SOCKADDR *)&client,&iAddrSize);
    if(acceptSucceed==0)
    {
    AfxMessageBox("_ListenTcpThread Accept错误!"+pDlg->GetError(GetLastError()));
    return -1;
    }
    sockSrvr.Close();
    char flag[FLAG]={0};
    if(recSo.Receive(flag,FLAG)!=2) 
    {
    return -1;
    }
    pDlg->m_type=flag[0];
    if(pDlg->m_type=='D') return 0;

    pThreadLisen=::AfxBeginThread(_ListenTcpThread,pDlg);
    pDlg->ReceiveFileMsg(recSo,client);//接收线程
             //接收函数定义如下: ReceiveFileMsg(CSocket &recSo,SOCKADDR_IN &client)
            //可以再ReceiveFileMsg函数里创建执行线程。
    return 0;

    }
      

  4.   

    为每个客户开一个线程,如果你同时在线的客户端少的话没问题,多的话建议用IOCP;
      

  5.   

     
    yestotofu:客户端少 该怎么弄?
    IOCP不知道呀!
      

  6.   

    ThreadRecv这是单线程的接收接口,你要做的肯定要用多线程来解决问题
      

  7.   

    accept后,即接收到一个客户端就立马开一个线程,并且把accept返回的socket作为参数传到线程里面去。
      

  8.   

    服务器为每进来一个客户端就开启一个线程的话,这样效率很低的。因为CPU要大量的进行线程的创建、销毁与切换。对于你这种情况,可以用线程池来实现对客户端的处理。如,系统初始化的时候创建100个线程,但这个100个线程都处于挂起状态。一旦有客户端进来,则唤醒一个线程来处理这个客户端,处理完成后这个线程继续进入挂起状态。这个就大大减小了CPU的开销,效率也就会有很大提高。
      

  9.   

    如果客户端多的话,用完成端口(IOCP)吧
      

  10.   

    理论来说这种需求应该用IOCP更好些每个客户端一个线程会导致大量线程切换浪费cpu针对你的问题, 你应该对每个客户端建立一个类似context的结构体或对象, 其中存放所有和这个客户端相关的数据,比如socket, ip, 端口, 连接时间, 客户端用户名等等, 然后把这个指针作为线程的LPVOID param传入线程, 由线程自行处理就可以了