Отправка данных во втором потоке с сервера Mongoose

0

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

Источники выглядят так:

Здесь я готовлю данные для процессоров и помещаю их в очередь.

typedef std::pair<struct mg_connection*, const char*> TransferData; 


int server_app::event_handler(struct mg_connection *conn, enum mg_event ev)
{
    Request req;
    if (ev == MG_AUTH) 
        return MG_TRUE;   // Authorize all requests
    else if (ev == MG_REQUEST) 
    {
        req = parse_request(conn);
        task_queue->push(TransferData(conn,req.second));
        mg_printf(conn, "%s", "");  // (1)
        return MG_MORE;  // (2)
    }
    else
        return MG_FALSE;  // Rest of the events are not processed
}

И здесь я пытаюсь отправить результат назад. Эта функция работает в ней собственной нитью.

void server_app::check_results()
{
    while(true)
    {
        TransferData res;
        if(!res_queue->pop(res))
        {
            boost::this_thread::sleep_for(boost::chrono::milliseconds(100));
            continue;
        }
        mg_printf_data(res.first, "%s", res.second); // (3)
    }
}

Проблема заключается в том, что клиент ничего не получает с сервера.
Если я запустил функцию check_result вручную в event_handler после размещения задачи в очереди, а затем передал вычисленный результат обратно в event_handler, я могу отправить его клиенту, используя mg_printf_data (с возвращаемым MG_TRUE). Любой другой путь - я не.

Что именно я должен изменить в этих источниках, чтобы заставить его работать?

Теги:
multithreading
mongoose-web-server

1 ответ

0

Хорошо... Похоже, я решил это сам.

Я искал код mongoose.c, и через час я нашел фрагмент кода:

static void write_terminating_chunk(struct connection *conn) {
   mg_write(&conn->mg_conn, "0\r\n\r\n", 5);
}

static int call_request_handler(struct connection *conn) {
   int result;
   conn->mg_conn.content = conn->ns_conn->recv_iobuf.buf;
   if ((result = call_user(conn, MG_REQUEST)) == MG_TRUE) {
       if (conn->ns_conn->flags & MG_HEADERS_SENT) {
           write_terminating_chunk(conn);
       }
       close_local_endpoint(conn);
   }
   return result;
} 

Поэтому я попытался выполнить mg_write(&conn->mg_conn, "0\r\n\r\n", 5); после строки (3), и теперь он работает.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню