2

我正在尝试为X-Plane编写一个小插件,以使用libwebsocket创建一个简单的 websocket 服务器。我可以从 Google Chrome 连接到 websocket,但是,当我向服务器发送数据时,X-Plane 立即崩溃。

我很确定以下代码会导致问题:

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

4

2 回答 2

4

对于任何理智的界面,@iharob 都是正确的 - 要明确他/她 对您误解字符串分配是正确的。

但是,libwebsockets 有点“特殊”。您需要将字符串复制到 libwebsockets 中的malloc()'d 数组LWS_SEND_BUFFER_PRE_PADDING字节中,然后覆盖前面的字节。

所以你想要类似的东西(假设你没有尝试在字符串上发送终止零):

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);
于 2015-02-03T22:17:35.873 回答
1

您需要复制字符串,分配无法按预期工作。

代替

buf = (unsigned char *)"Hello World";

你需要

memcpy(buf, "Hello World", 1 + strlen("Hello World"));

当你做赋值时,你buf指向一个静态字符串文字,free()在这种情况下是不可能的。

因此,您的程序会调用未定义的行为。

你需要包括<string.h>

于 2015-02-03T22:05:13.890 回答