簡體   English   中英

動態多線程服務器問題

[英]Dynamic multi-thread server problem

 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條消息,但並不落后於地獄。

任何幫助表示贊賞

根據winsock文檔 (msdn.microsoft.com),recv函數將返回以下值之一:

  • 正數:接收到的字節數;
  • 零:連接已關閉;
  • 否:發生錯誤。

我強烈建議檢查recv()的返回值,並在必要時終止循環,因為在零和負兩種情況下,您都將陷入循環,調用recv()會立即返回而不會立即阻塞。 這將顯示為CPU使用率高和服務器線程無響應。

在任何情況下,舍棄您調用的函數的返回值都是錯誤的形式,並且僅應在特殊情況下執行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM