Проблема динамического многопоточного сервера - PullRequest
0 голосов
/ 18 марта 2011
 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% загрузки ЦП и не получает данные, только первый (это происходит только на клиенте, который был запущен первым)Я сделал temp.watek = CreateThread, а затем сервер push_back все еще не отвечал на сообщения клиента № 1, но не отставал, как ад.

Любая помощь приветствуется

1 Ответ

0 голосов
/ 19 марта 2011

Согласно документации winsock (msdn.microsoft.com), функция recv возвращает одно из следующих значений:

  • положительный: количество полученных байтов;
  • ноль: соединение было закрыто;
  • отрицательно: произошла ошибка.

Я настоятельно рекомендую проверить возвращаемое значение recv() и завершить цикл, когданеобходимо, потому что как в нулевом, так и в отрицательном случаях вы будете зацикливаться на вызове, вызывая recv (), который немедленно возвращается без блокировки.Это может проявиться как высокая загрузка ЦП и не отвечающие серверные потоки.

В любом случае отбрасывание возвращаемого значения из функции, которую вы вызываете, является неправильной формой и должно выполняться только в исключительных ситуациях.

...