2015-02-11 3 views
1

Я пытаюсь понять, как я должен захватить IP-адрес клиента при использовании libwebsockets в качестве сервера.libwebsockets: как сохранить IP-адрес с запросом

Из того, что я понимаю из документации, libwebsockets_get_peer_addresses доступен только для использования в обратном вызове LWS_CALLBACK_FILTER_NETWORK_CONNECTION, но в этот момент структура данных пользователя, по-видимому, не инициализирована, поэтому любая попытка сохранить здесь будет segfault.

Я бы ожидал, что IP-адрес будет находиться в заголовках запроса, как и на других веб-серверах, таких как Apache или nginx, но в этой библиотеке он кажется доступным только для определенной части процесса запроса и не является скопированы в заголовки.

Это то, что я пытаюсь внутри LWS_CALLBACK_FILTER_NETWORK_CONNECTION:

char client_name [IP_SIZE]; 
char client_ip [IP_SIZE]; 

libwebsockets_get_peer_addresses(context, wsi, (int)(long)in, 
           client_name, sizeof(client_name), 
           client_ip, sizeof(client_ip)); 

strncpy(pss->ip, client_ip, sizeof(client_ip)); // segfault 

Я проверил strncpy внутри другой функции обратного вызова (LWS_CALLBACK_HTTP), так что я знаю, что он должен работать, когда что pss инициализирован.

Любая помощь будет оценена по достоинству, потому что я считаю, что документация для библиотеки очень сложна для понимания.

ответ

2

У вас его почти не было.

Если вы замените (int)(long)in на libwebsocket_get_socket_fd(wsi), вы можете использовать его в других обратных вызовах.

switch (reason) { 
    case LWS_CALLBACK_HTTP: 
      int IP_SIZE = 50; 
      char client_name [IP_SIZE]; 
      char client_ip [IP_SIZE]; 
      libwebsockets_get_peer_addresses(context, wsi, libwebsocket_get_socket_fd(wsi), 
         client_name, sizeof(client_name), 
         client_ip, sizeof(client_ip)); 

      fprintf(stderr, "Received network connect from %s (%s)\n", 
            client_name, client_ip); 
      ... 
} 

Выход:

Полученное подключение к сети с xxxxxxxx.dip0.t-ipconnect.de (93.208.91.xxx)

+0

Спасибо! Я знал, что должно быть что-то более разумное, чем обходной путь, который я использовал. Мне просто жаль, что у меня не было таких проблем с моей документацией ... – GMemory

0

Хорошо, оказывается, что я могу работать вокруг этого путем получения дескриптора с использованием libwebsocket_get_socket_fd в более поздний обратный вызов (например, как LWS_CALLBACK_HTTP)

Это касается меня, что документация говорит "Вы не будете нуждаться в этом, если вы не делаете что-то специальное "относительно этой конкретной функции, но, похоже, она работает правильно после запуска нескольких тестов.

Интересно, существует ли менее тупой способ сделать это.