动态多线程服务器问题

时间:2011-03-18 17:38:02

标签: c++ multithreading dynamic vector

 while(true)
        {
        Klient temp;
        SOCKET client = accept(sock,(struct sockaddr *)&ich,&sin_size);
        if (client!= INVALID_SOCKET)
                        {
                                int ID = wszyscy.size(); //wszyscy is a vector of Klient structure; ID increments like: 0,1,2,3 etc
                                memset(&temp,0,sizeof(Klient)); //zero structure
                                temp.Gniazdo = client; //fill temporary structure
                                temp.Identyfikator = ID;
                                temp.Nick = "";
                                temp.Watek = NULL;
                                wszyscy.push_back(temp);//Adding
                                std::cout << ID << std::endl; //Showing ID for test
                                std::cout << inet_ntoa(ich.sin_addr) << std::endl;//IP 
                                wszyscy[ID].Watek = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE) Watek,&wszyscy[ID], 0 ,NULL);//Creating thread
        }
    }

主题:

DWORD Watek(LPVOID Dane)
{
        const char* tekst_serwera = "Halo, tu server :D\n\0";
        Klient *temp = (Klient*) Dane;
        send(temp->Gniazdo,tekst_serwera,strlen(tekst_serwera),0);
        std::cout << "Podlaczyl sie klient o ID: " << temp->Identyfikator << std::endl;
        char bufor[500];
        while(true)
        {
                memset(bufor,0,500);
                recv(temp->Gniazdo,bufor,500,0);
                std::cout << bufor;
        }
} 

问题是,当我启动2个或更多客户端时,服务器发送给他们,因为它假设欢迎消息(tekst_servera)但是当我在客户端上写一些已经作为第二个启动的东西然后我尝试在客户端上写一些东西时已经启动,因为第一台服务器正在获得80%的CPU使用率并且没有接收数据,只有第一台服务器(它仅在首先启动的客户端上发生)当我执行temp.watek = CreateThread然后push_back服务器仍然没有回复客户端的1号消息,但并没有像地狱一样落后。

任何帮助表示赞赏

1 个答案:

答案 0 :(得分:0)

根据winsock documentation(msdn.microsoft.com),recv函数将返回以下值之一:

  • positive:收到的字节数;
  • 零:连接已关闭;
  • 否定:发生了错误。

我强烈建议检查recv()的返回值,并在必要时终止循环,因为在零和负的情况下,你将陷入循环,调用recv()返回而不阻塞立即。这将显示为高CPU使用率和无响应的服务器线程。

在任何情况下,丢弃你调用的函数的返回值都是不好的形式,并且只能在特殊情况下完成。