0

我正在使用libwebsockets-2.1.0并启用generic session&lwsws选项。

case LWS_CALLBACK_SERVER_WRITEABLE我有一些代码可以打开一个文件,并将内容输出到 websocket。

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],但它仍在抱怨。

需要指出的是,websocket的最终输出是不一致的,有时停在line 30-something,有时停在line 400

FWIW,我正在阅读的文件的总行是1758行,一行的最长字符长度是107 个字符。

删除fgets循环并用我自己的通用值替换该值似乎工作正常。

谢谢

4

1 回答 1

0

解决方法是增加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 issue page

于 2016-11-17T09:49:00.383 回答