c++ windows中客户端服务器编程中的多线程

Posted

技术标签:

【中文标题】c++ windows中客户端服务器编程中的多线程【英文标题】:Multithread in client server programming in c++ windows 【发布时间】:2014-04-19 11:56:52 【问题描述】:

我有一个问题,如何同时向客户发送字符串。我的程序将客户端放入队列中,因此当第一个客户端断开连接时,第二个客户端已连接,我真的很想将它们放在多线程中,但我不知道如何,请任何人帮助我,谢谢。

    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;

【问题讨论】:

不幸的是,这段代码有很多错误,我真的无法解释你如何将线程合并到混合中。我看到了内存泄漏、缓冲区溢出、一个可远程利用的安全漏洞,但我完全不明白代码在当前状态下是如何工作的。你真的有兴趣清理这一切吗? 谢谢你,我会清理的,顺便问一下你知道如何把客户放在线程中吗? “请帮帮我”不是问题。 Stack Overflow 不是“聊天”或“论坛”——我们不会“指导”或“指导”你。它是一个关于编程语言和代码片段的简明问题和简明答案的数据库。请记住这一点,以便您以后的帖子。 【参考方案1】:

在 MSDN 中搜索“CSocket + thread”,你会找到这个例子:

http://support.microsoft.com/kb/175668/en-us

【讨论】:

以上是关于c++ windows中客户端服务器编程中的多线程的主要内容,如果未能解决你的问题,请参考以下文章

Linux C++的多线程编程

多线程在 C++ 中的 Windows 中将多个客户端连接到单个服务器

编程模式中的多线程和数据作用域

C++中的多线程,只检查信号量是不是被锁定

Linux下的基于Pthread的多线程Socket编程

c++下基于windows socket的单线程服务器客户端程序