2

我正在尝试使用 mongoose Web 服务器库创建一个多线程服务器应用程序。我有主线程服务连接并向在自己的线程中工作的处理器发送请求。然后处理器将结果放入队列,队列观察者必须将结果发送回客户端。

消息来源是这样看的:

在这里,我为处理器准备数据并将其放入队列中。

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)
    }
}

问题是客户端没有从服务器接收任何东西。
如果我在将任务放入队列后在 event_handler 中手动运行 check_result 函数,然后将计算结果传递回 event_handler,我可以使用 mg_printf_data(返回 MG_TRUE)将其发送给客户端。任何其他方式 - 我不是。

我究竟应该在这个来源中进行哪些更改才能使其正常工作?

4

1 回答 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)行之后做,现在它正在工作。

于 2014-11-18T10:43:05.700 回答