Клиент-сервер: как обрабатывать входящие ответы сервера (во время цикла) в многопоточности на клиенте? [C Программа] - PullRequest
0 голосов
/ 23 октября 2019

Итак, у меня есть сервер, который отправляет объект ответа в цикле while.

  • Цикл while продолжается до тех пор, пока x число объектов ответа не будет отправлено клиенту.

Я хочу обрабатывать входящие запросы в потоках (чтобы клиент мог по-прежнему делать другие вещи, например вводить пользовательские данные.)

Текущий подход: в клиенте у меня есть «пул потоков», которыйслучайным образом создает потоки, и handleNextReceiveClient будет обрабатывать входящий запрос.

// client

  int num_handler_threads = 100;  // random number (knowing responses will be less than 100 at any time.)

        int thr_id[num_handler_threads]; /* thread IDs  */

        /* create the request-handling threads */
        for (i = 0; i < num_handler_threads; i++)
        {
            //TO DO
            // CREATE THREADS - Threads to call handleNextReceiveClient() function
            pthread_t t;
            pthread_attr_t attr;
            pthread_attr_init(&attr);
            pthread_create(&t, &attr, (void *)(void *)handleNextReceiveClient, (void *)&data1);
        }

Функция потока:

void handleNextReceiveClient(void *ptr)
{

    thdata *data;
    data = (thdata *)ptr; /* type cast to a pointer to thdata */

    if (recv(data->sockfd, &response, sizeof(response_t), 0))
    {

       // Display response  
       // exit(0); // exit out of THREAD so I am able to use the client while server sends next reponse object in a few seconds.x`  

   }
    else
    {

        exit(0);
    }

    printf("\n break.....\n");
}

Сервер, отправляющий ответ вцикл while

// server
while(numberOfResponseObjects != total) {

    send(response, fdNew); // send a reponse. 
    sleep(3); // wait few seconds before sending next response object to client.

}

ПРОБЛЕМА: Что происходит : Как только сервер отправляет первый ответ клиентскому потоку, он отображается, как ожидается, но не завершает потоки затем следующий ответ отображается до тех пор, пока не будут отображены все ответы (БЕЗ), когда клиент сможет делать что-то еще между ними, только после того, как все объекты ответа с сервера будут отображены, клиент свободен делать другие вещи ...

Что не так с моим подходом? идеи?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...