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

Я пытаюсь создать многопоточное серверное приложение, используя библиотеку веб-сервера 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 вручную в обработчике событий после помещения задачи в очередь, а затем передаю вычисленный результат обратно в обработчик событий, я могу отправить его клиенту с помощью mg_printf_data (с возвратом MG_TRUE). Любой другой путь — я не.

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

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) и теперь это работает.

0

Другие решения


По вопросам рекламы [email protected]