2014-04-19 119 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

「請幫助我」這不是問題。堆棧溢出不是「聊天」或「論壇」 - 我們不會「引導」或「導師」你。它是關於編程語言和代碼片斷的簡明問題和簡明回答的數據庫。請記住你的未來職位。 –

回答