2014-04-19 100 views
-2

我有一个问题如何发送一个字符串到客户端在同一时间。我的程序把客户端放到队列中,所以当第一个客户端断开第二个连接时,我真的想把它们放在多线程中,但我不知道如何,任何人都可以帮助我,谢谢。多线程客户端服务器编程在c + +窗口

void abc(CSocket sockClients[],int i) 
{ 
    int MsgSize; 
    char *temp; 
    // Nhan username tu Server 
    sockClients[i].Receive((char*)&MsgSize,sizeof(int),0); // Neu nhan loi thi tra ve la SOCKET_ERROR.   
    temp = new char[MsgSize +1]; 
    sockClients[i].Receive((char*)temp,MsgSize,0); 
    // In username ra 
    temp[MsgSize] ='\0'; 

    int score=3; 
    int ques; 
    sockClients[i].Receive((char*)&ques,sizeof(int),0); 

    ifstream CH; 
    CH.open("cauhoi.txt",ios::in); 
    ifstream DA; 
    DA.open("dapan.txt",ios::in); 
    for(int j=0;j<ques;j++) 
    { 
     char* CH_SV=new char; 
     CH>>CH_SV; 
     int Size = strlen(CH_SV); 
     sockClients[i].Send(&Size,sizeof(int),0); 
     sockClients[i].Send(CH_SV,Size,0); 

     char* DA_SV=new char; 
     DA>>DA_SV; 

     char *dapan; 
     sockClients[i].Receive((char*)&Size,sizeof(int),0); 
     dapan = new char[Size +1]; 
     sockClients[i].Receive((char*)dapan,Size,0); 
     dapan[Size] ='\0'; 
     cout<<"\nDap an la: "<<dapan<<endl; 
     if(Size<5) 
      goto Exit; 
     else if(strcmp(dapan,DA_SV)==0) 
      score+=2; 
     else score--; 
    } 


    sockClients[i].Close(); 
} 
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) 
{ 
    int nRetCode = 0; 

    HMODULE hModule = ::GetModuleHandle(NULL); 

    if (hModule != NULL) 
    { 
     // initialize MFC and print and error on failure 
     if (!AfxWinInit(hModule, NULL, ::GetCommandLine(), 0)) 
     { 
      // TODO: change error code to suit your needs 
      _tprintf(_T("Fatal Error: MFC initialization failed\n")); 
      nRetCode = 1; 
     } 
     else 
     { 
      // TODO: code your application's behavior here. 
      CSocket server; 
      AfxSocketInit(NULL); 
      server.Create(3456); 
      server.Listen(); 
      int nclient; 
      cout<<"Nhap so luong client: "; 
      cin>>nclient; 
      CSocket * sockClients = new CSocket[nclient]; 

      for (int i = 0; i <nclient; i++) 
      { 
       server.Accept(sockClients[i]); 
       printf("\nClient: %d/%d",i+1,nclient); 
       sockClients[i].Send((char*)&i,sizeof(int),0);  
       abc(sockClients,i); 
      } 
      server.Close(); 
     } 
    } 
    else 
    { 
     // TODO: change error code to suit your needs 
     _tprintf(_T("Fatal Error: GetModuleHandle failed\n")); 
     nRetCode = 1; 
    } 

    return nRetCode; 
} 
+0

不幸的是,有这么多的错误与此代码,我真的无法解释怎么您'd将线程结合到混合中。我看到内存泄漏,缓冲区溢出,可远程利用的安全漏洞,我不明白在当前状态下代码如何工作。你真的有兴趣把这一切都清理干净吗? –

+0

谢谢你,我会做清理,顺便说一句,你知道如何把cleint放在线程中吗? – user3500533

+0

“请帮助我”这不是问题。堆栈溢出不是“聊天”或“论坛” - 我们不会“引导”或“导师”你。它是关于编程语言和代码片断的简明问题和简明回答的数据库。请记住你的未来职位。 –

回答