1

我正在使用libwebsockets C 库。我正在尝试做一个简单的回声服务器,作为测试。我正在 linux 下使用 Firefox 和 Chrome 进行测试。

代码很简单:

Javascript

var ws = new WebSocket ("ws://127.0.0.1:9999", "hephaestus");

ws.onopen = function() {
    console.log ('Connection opened.');
    setTimeout (function() {
        ws.send ('This is a hello.\n');
    }, 2000);
};

ws.onerror = function() {
    console.log ('Error in connection');
};

ws.onclose = function() {
    console.log ('Connection closed');
};

ws.onmessage = function (msg) {
    console.log ('Message received : ' + msg.data);
};

C

ephaestus_callback(struct libwebsocket_context *context,
struct libwebsocket *wsi,
enum libwebsocket_callback_reasons reason,

void *user, void *in, size_t len)
{
    int n, m;
    unsigned char buf[LWS_SEND_BUFFER_PRE_PADDING + 512 + LWS_SEND_BUFFER_POST_PADDING];
    unsigned char *p = &buf[LWS_SEND_BUFFER_PRE_PADDING];
    unsigned char *ret = "Answer";

    switch (reason)
    {
        case LWS_CALLBACK_RECEIVE:
        printf("Received : %s\n",in);
        strcpy (p, ret);
        n = libwebsocket_write (wsi, buf, LWS_SEND_BUFFER_POST_PADDING + 512 + LWS_SEND_BUFFER_PRE_PADDING, LWS_WRITE_TEXT);
        printf ("Wrote %d bytes.\n", n);
        break;
    }

}

我确实从浏览器收到了“这是一个问候”,但是当我发送答案时,它确实写了“写了 534 个字节”,但在 Javascript 端,Web 套接字连接已关闭,Chrome 说:“无法解码一个文本框架为 UTF-8"。

我很困惑,在字符串“Answer”中,只有 < 128 个字符,所以它们应该是 UTF-8,对吧?

4

1 回答 1

2

我很困惑,在字符串“Answer”中,只有 < 128 个字符,所以它们应该是 UTF-8,对吧?

你确定吗 ?

你回来了p;即buf,大小是LWS_SEND_BUFFER_PRE_PADDING + 512 + LWS_SEND_BUFFER_POST_PADDING多少,但您只设置“答案”的 6 个字符加上\0.

我的猜测是其余的buf包含随机字节,很可能没有 UTF-8 字符。

你应该在填充它之前使用memset你的缓冲区并使用.0strncpy

于 2014-08-29T14:01:26.323 回答