Libwebsockets 2.1.0 - Незаконно выполнять lws_write за пределами

Я использую libwebsockets-2.1.0 с параметрами generic session и lwsws включено.

В case LWS_CALLBACK_SERVER_WRITEABLE у меня есть код, который открывает файл и выводит содержимое в веб-сокет.

static const char* filename = "/tmp/loop.log";
#define MAX_STAT_LINE_LENGTH    256

unsigned char buf[LWS_PRE + 512];
unsigned char *p = &buf[LWS_PRE];

char line[MAX_STAT_LINE_LENGTH];

while ( fgets(line, sizeof(line), fp) != NULL) {
    int n = lws_snprintf((char *)p, sizeof(line), "%s", line);
    int m = lws_write(wsi, p, n, LWS_WRITE_TEXT);

    if (m < n) {
        printf("websocket write failed\n");
    }
}

В терминале я получаю кучу таких:

lwsws[13778]: ****** 0x9230a50: Sending new 46 (/name?ag=z&abcd=011), pending truncated ...
It's illegal to do an lws_write outside of the writable callback: fix your code

Есть ли объяснение этой ошибке? Я имею в виду, что я объявил char line[1000], но он все еще жалуется.

Я хотел бы отметить, что окончательный вывод веб-сокета непостоянен, иногда он останавливается на line 30-something, иногда останавливается на line 400

FWIW, общая строка файла, который я читаю, составляет 1758 строк, при этом максимальная длина строки составляет 107 символов.

Удаление цикла fgets и замена значения моим собственным общим значением работает нормально.

Спасибо


person deojeff    schedule 17.11.2016    source источник
comment
Вы должны добавить объявление ваших переменных   -  person Mansuro    schedule 17.11.2016
comment
как насчет вси?   -  person Mansuro    schedule 17.11.2016
comment
@Mansuro Я считаю, что wsi - это структура lws, в функции она объявлена ​​​​как: static int callback_stats_streamer (struct lws *wsi, enum lws_callback_reasons Reason, void *user, void *in, size_t len) { // мои коды здесь} I надеюсь, что помогло.   -  person deojeff    schedule 17.11.2016
comment
Это может помочь stackoverflow.com/a/28309837/612920   -  person Mansuro    schedule 17.11.2016
comment
@Мансуро Спасибо, посмотрю.   -  person deojeff    schedule 17.11.2016


Ответы (1)


Исправление заключается в увеличении размера rx buf.

#define LWS_PLUGIN_PROTOCOL_DUMB_INCREMENT \
{ 
    "protocol_dumb_increment", \
    callback_dumb_increment, \
    sizeof(struct per_session_data__dumb_increment), \
    4000, /* rx buf size must be >= permessage-deflate rx size */ \
}

Источник: страница с проблемами libwebsocket на github

person deojeff    schedule 17.11.2016