C语言 无法将数据发送到 libwebsocket 服务器



我正在尝试为 X-Plane 编写一个小插件,以使用 libwebsocket 创建一个简单的 websocket 服务器。我能够从谷歌浏览器连接到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

对于任何理智的界面,@iharob都是对的 - 要清楚他/她 关于你误解字符串分配。

然而,libwebsockets有点"特殊"。您需要将字符串复制到LWS_SEND_BUFFER_PRE_PADDING字节的malloc()数组中。然后,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);

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

而不是

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

你需要

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

执行分配时,buf指向静态字符串文本,在这种情况下无法free()

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

您需要包含<string.h>

相关内容

  • 没有找到相关文章

最新更新