无法将数据发送到 libwebsocket 服务器
Unable to send data to libwebsocket server
我正在尝试为 X-Plane, to create a simple websocket server with libwebsocket 编写一个小插件。我可以从 Google Chrome 连接到 websocket,但是,当我向服务器发送数据时,X-Plane 立即崩溃。
我很确定 following code 导致了问题:
unsigned char *buf = (unsigned char*) malloc(LWS_SEND_BUFFER_PRE_PADDING + 13 + LWS_SEND_BUFFER_POST_PADDING);
buf = (unsigned char*) "Hello World!";
libwebsocket_write(wsi, buf, len, LWS_WRITE_TEXT);
free(buf);
我根本不是 C 程序员/专家,但上面的内容似乎有问题吗?
我已经在 Gist 上发布了完整的源代码:https://gist.github.com/josefvanniekerk/868432986f2f963a5583
您需要复制字符串,赋值不符合您的预期。
而不是
buf = (unsigned char *)"Hello World";
你需要
memcpy(buf, "Hello World", 1 + strlen("Hello World"));
当你做赋值时,你让 buf
指向一个静态字符串文字,在这种情况下 free()
是不可能的。
您的程序因此调用了未定义的行为。
您需要包括 <string.h>
对于任何理智的界面,@iharob 都是正确的 - 明确 he/she is
没错,你误解了字符串赋值。
不过libwebsockets有点'special'。您需要将字符串复制到 malloc()
数组 LWS_SEND_BUFFER_PRE_PADDING
字节中。libwebsockets 然后覆盖前面的字节。
所以你想要这样的东西(假设你不想在字符串上发送终止零):
char *text = "Hello World!";
int len = strlen (text);
unsigned char *buf = malloc(LWS_SEND_BUFFER_PRE_PADDING + len + LWS_SEND_BUFFER_POST_PADDING);
/* copy string but not terminating NUL */
memcpy (buf + LWS_SEND_BUFFER_PRE_PADDING, text, len );
libwebsocket_write(wsi, buf + LWS_SEND_BUFFER_PRE_PADDING, len, LWS_WRITE_TEXT);
free(buf);
如果您也想发送 NUL
:
char *text = "Hello World!";
int len = strlen (text) + 1;
unsigned char *buf = malloc(LWS_SEND_BUFFER_PRE_PADDING + len + LWS_SEND_BUFFER_POST_PADDING);
/* copy string including terminating NUL */
memcpy (buf + LWS_SEND_BUFFER_PRE_PADDING, text, len );
libwebsocket_write(wsi, buf + LWS_SEND_BUFFER_PRE_PADDING, len, LWS_WRITE_TEXT);
free(buf);
我正在尝试为 X-Plane, to create a simple websocket server with libwebsocket 编写一个小插件。我可以从 Google Chrome 连接到 websocket,但是,当我向服务器发送数据时,X-Plane 立即崩溃。
我很确定 following code 导致了问题:
unsigned char *buf = (unsigned char*) malloc(LWS_SEND_BUFFER_PRE_PADDING + 13 + LWS_SEND_BUFFER_POST_PADDING);
buf = (unsigned char*) "Hello World!";
libwebsocket_write(wsi, buf, len, LWS_WRITE_TEXT);
free(buf);
我根本不是 C 程序员/专家,但上面的内容似乎有问题吗?
我已经在 Gist 上发布了完整的源代码:https://gist.github.com/josefvanniekerk/868432986f2f963a5583
您需要复制字符串,赋值不符合您的预期。
而不是
buf = (unsigned char *)"Hello World";
你需要
memcpy(buf, "Hello World", 1 + strlen("Hello World"));
当你做赋值时,你让 buf
指向一个静态字符串文字,在这种情况下 free()
是不可能的。
您的程序因此调用了未定义的行为。
您需要包括 <string.h>
对于任何理智的界面,@iharob 都是正确的 - 明确 he/she is 没错,你误解了字符串赋值。
不过libwebsockets有点'special'。您需要将字符串复制到 malloc()
数组 LWS_SEND_BUFFER_PRE_PADDING
字节中。libwebsockets 然后覆盖前面的字节。
所以你想要这样的东西(假设你不想在字符串上发送终止零):
char *text = "Hello World!";
int len = strlen (text);
unsigned char *buf = malloc(LWS_SEND_BUFFER_PRE_PADDING + len + LWS_SEND_BUFFER_POST_PADDING);
/* copy string but not terminating NUL */
memcpy (buf + LWS_SEND_BUFFER_PRE_PADDING, text, len );
libwebsocket_write(wsi, buf + LWS_SEND_BUFFER_PRE_PADDING, len, LWS_WRITE_TEXT);
free(buf);
如果您也想发送 NUL
:
char *text = "Hello World!";
int len = strlen (text) + 1;
unsigned char *buf = malloc(LWS_SEND_BUFFER_PRE_PADDING + len + LWS_SEND_BUFFER_POST_PADDING);
/* copy string including terminating NUL */
memcpy (buf + LWS_SEND_BUFFER_PRE_PADDING, text, len );
libwebsocket_write(wsi, buf + LWS_SEND_BUFFER_PRE_PADDING, len, LWS_WRITE_TEXT);
free(buf);