2014-11-18 6 views
0

몽구스 웹 서버 라이브러리를 사용하여 멀티 스레드 서버 응용 프로그램을 만들려고합니다. 주 스레드가 연결을 처리하고 자신의 스레드에서 작동하는 프로세서로 요청을 보냅니다. 그런 다음 프로세서는 결과를 큐에 배치하고 큐 관찰자는 결과를 클라이언트에 다시 보내야합니다. 여기몽구스 서버로 두 번째 스레드에서 데이터 보내기

내가 프로세서에 대한 데이터를 준비하고 대기열에 배치 :

소스는 그 방법을 찾고 있습니다.

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에서 manualy를 실행 한 다음 계산 된 결과를 다시 event_handler에 전달하면 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) 지금은 일하고있어 .