Как предотвратить тайм-аут клиента libwebsockets

Я пытаюсь создать клиент веб-сокета C++, используя libwebsockets, но не могу установить соединение из-за истечения времени ожидания. Я разобрал вещи для тестирования и вот что я использую для установления соединения:

протоколы

static int defaultCallback(
    struct  libwebsocket_context* context,
    struct  libwebsocket* wsi,
    enum    libwebsocket_callback_reasons reason,
    void*   user,
    void*   in,
    size_t  len)
{
    return 0;
}

static struct libwebsocket_protocols protocols[] =  {
    { "default", defaultCallback, 0 },
    { NULL, NULL, 0 }
};

Создать контекст

    struct lws_context_creation_info info;
    memset(&info, 0, sizeof(info));
    info.port = CONTEXT_PORT_NO_LISTEN;
#ifndef LWS_NO_EXTENSIONS
    info.extensions = libwebsocket_get_internal_extensions();
#endif
    info.gid = -1;
    info.uid = -1;
    info.protocols = protocols;

    _context = libwebsocket_create_context(&info);

Создать клиента

ПРИМЕЧАНИЕ: адрес "ws://localhost" я также пробовал "ws://echo.websocket.org". Сервер localhost - это приложение Node & ws, которое я протестировал с Chrome и работает отлично.

_websocket = libwebsocket_client_connect(_context, // context
                                         _address.c_str(), // address
                                         _port, // port
                                         0, // use ssl?
                                         "/", // path
                                         _address.c_str(), // host
                                         NULL, // origin
                                         NULL,  // protocol
                                         -1);   // version

Сервис Контекст

while(1) {
    libwebsocket_service(_context, 50);
}

Выходные данные Когда я запускаю вышеупомянутое, это - выход, который я получаю через обратный вызов регистрации libwebsockets:

NOTICE: Initial logging level 1023
NOTICE: Library version: 1.4 3ae1bad
NOTICE: IPV6 not compiled in
NOTICE: libev support not compiled in
INFO:  LWS_MAX_HEADER_LEN: 1024
INFO:  LWS_MAX_PROTOCOLS: 5
INFO:  SPEC_LATEST_SUPPORTED: 13
INFO:  AWAITING_TIMEOUT: 5
INFO:  SYSTEM_RANDOM_FILEPATH: '/dev/urandom'
INFO:  LWS_MAX_ZLIB_CONN_BUFFER: 65536
NOTICE:  static allocation: 4536 + (16 x 10240 fds) = 168376 bytes
INFO:  LWS_MAX_EXTENSIONS_ACTIVE: 3
NOTICE:  canonical_hostname = an-iMac
NOTICE:  per-conn mem: 248 + 2140 headers + protocol rx buf
PARSER:   Protocol: default
CLIENT: libwebsocket_client_connect: direct conn
CLIENT: libwebsocket_client_connect_2
CLIENT: libwebsocket_client_connect_2: address ws://localhost
INFO: insert_wsi_socket_into_fds: wsi=0x7ff808514c70, sock=8, fds pos=1
CLIENT: nonblocking connect retry
INFO: TIMEDOUT WAITING on 2
DEBUG: close: just_kill_connection
INFO: remove_wsi_socket_from_fds: wsi=0x7ff808514c70, sock=8, fds pos=1
DEBUG: Connection closed before server reply

Я просмотрел все примеры / документацию по libwebsockets, которые я могу достать и не могу получить никакой информации о том, как решить эту проблему. Любая помощь будет принята с благодарностью и помешает мне просунуть голову в монитор.

2 ответа

Попробуйте адрес без "ws://". Просто "localhost" или "127.0.0.1".

Будьте осторожны с настройками порта, вы не можете указать порт отдельно, если используете протокол порта. Порт 8090 будет переопределен с 443 здесь, не делайте так:

# WRONG
./lws_test_client wss://192.168.202.120 --port=8090

INSTEAD, укажите порт как часть URL:

./lws_test_client wss://192.168.202.120:8090

Подробности...

Мне было очень трудно определить, что происходит с первой попыткой рукопожатия от клиента libwebsockets. Наблюдая за здоровым сеансом между браузером (через расширение chrome или эхо-сервис websockets.org) и узлом ws-сервером, я получаю большое количество пакетов подтверждения связи:

введите описание изображения здесь

Из клиента libwebsockets я не вижу ни одного пакета, отправляемого клиентом на ВСЕХ.

Запуск от имени root не помогает. Я могу telnet к серверу и по крайней мере видеть немного трафика к нему. Что-то не так с тестовым клиентом вне ворот.

Я использую последний код из основной ветки, может быть, это часть проблемы, я собираюсь вернуться к более старой версии в следующем.

ОБНОВЛЕНИЕ: проблема решена здесь. Я получил помощь от самого Энди, автора libwebsockets, в его списке рассылки. Он исправил мою спецификацию клиентского порта в моей командной строке. Как только я правильно указал порт, у меня был подключающийся клиент. Это более глубокое объяснение другого ответа на этот вопрос и ответ, который фактически сказал то же самое. Я надеюсь, что это та же проблема, что и вы.

# DO NOT USE: ./lws_test_client wss://192.168.202.120 --port=8090
# "wss://" will override the specific port provided!
# INSTEAD, specify it as part of the url.
./lws_test_client wss://192.168.202.120:8090
Другие вопросы по тегам