2016-08-27 10 views
1

Я пытаюсь получить первоначальную информацию о соединении запрашиваемой в функции обратного вызова, зарегистрированный Libevent:«Вперед Декларация Struct» при получении Libevent Информации подключения

#include <evhttp.h> 
#include <iostream> 

//Process a request 
void process_request(struct evhttp_request *req, void *arg){ 

    //Get the request type (functions correctly) 
    std::cout << req->type << std::endl; 

    //Get the address and port requested that triggered the callback 
    //When this is uncommented, the code no longer compiles and throws 
    //the warning below 
    struct evhttp_connection *con = req->evcon; 
    std::cout << con->address << con->port << std::endl; 
} 

int main() { 

    //Set up the server 
    struct event_base *base = NULL; 
    struct evhttp *httpd = NULL; 
    base = event_init(); 
    if (base == NULL) return -1; 
    httpd = evhttp_new(base); 
    if (httpd == NULL) return -1; 

    //Bind the callback 
    if (evhttp_bind_socket(httpd, "0.0.0.0", 12345) != 0) return -1; 
    evhttp_set_gencb(httpd, process_request, NULL); 

    //Start listening 
    event_base_dispatch(base); 
    return 0; 
} 

Однако, я получаю следующее сообщение об ошибке:

$g++ -o basic_requests_server basic_requests_server.cpp -lpthread -levent -std=c++11 

basic_requests_server.cpp:45:18: error: invalid use of incomplete type ‘struct evhttp_connection’ 
    std::cout << con->address << con->port << std::endl; 
      ^
In file included from /usr/include/evhttp.h:41:0, 
      from basic_requests_server.cpp:1: 
/usr/include/event2/http.h:427:8: error: forward declaration of ‘struct evhttp_connection’ 
struct evhttp_connection *evhttp_connection_base_new(

Почему я не могу получить доступ к элементам этой структуры?

+0

@skypjack: сделайте это ответом –

+0

@MartinBonner Fair достаточно. Готово. – skypjack

ответ

2

Why can't I access the elements of this struct?

Насколько я понимаю, соединения (то есть struct evhttp_connection) предназначены только для внутренних целей.
Вы не должны напрямую использовать их или свои поля, но вы можете получить указатель на соединение и передать этот указатель.
Это было сделано специально, чтобы клиенты не привязывались к внутреннему представлению соединения (которое может так тихо изменяться таким образом).
Вот почему тип фактически не выставлен. Вы можете думать об этом как непрозрачный указатель вам не разрешено разыгрывать.

См. here для подробного объяснения.