我正在尝试为X-Plane编写一个小插件,用libwebsocket创建一个简单的websocket服务器。我可以从谷歌浏览器连接到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
答案 0 :(得分: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);
答案 1 :(得分:1)
您需要复制字符串,分配并不像您期望的那样工作。
而不是
buf = (unsigned char *)"Hello World";
你需要
memcpy(buf, "Hello World", 1 + strlen("Hello World"));
执行作业时,您将buf
指向静态字符串文字,在这种情况下无法使用free()
。
由于这个原因,你的程序会调用未定义的行为。
您需要加入<string.h>