Libwesockets.h:lws_write出现问题:C ++字符串到C的转换并发送

问题描述 投票:1回答:1

我正在使用g ++。

代码:

        std::string str = "{\"action\":3,\"data\":{\"account\":\"somehashgoeshear\",\"someint\":0,\"id\":1,\"moreint\":0,\"name\":\"demo\"}}";
        char *cstr = strdup(str.c_str());
        lwsl_notice("\n%s", cstr);
        return lws_write(wsi, (unsigned char*)cstr, strlen(cstr), LWS_WRITE_TEXT);

这也不起作用:

        std::string str = "{\"action\":3,\"data\":{\"account\":\"somehashgoeshear\",\"someint\":0,\"id\":1,\"moreint\":0,\"name\":\"demo\"}}";
        return lws_write(wsi, (unsigned char*)str.c_str(), strlen(str.c_str()), LWS_WRITE_TEXT);

但是这很好(可以运行很多次而不会出现错误):

        char cstr[96] = "{\"action\":3,\"data\":{\"account\":\"somehashgoeshear\",\"someint\":0,\"id\":1,\"moreint\":0,\"name\":\"demo\"}}";
        return lws_write(wsi, (unsigned char*)cstr, strlen(cstr), LWS_WRITE_TEXT);

也尝试过使用malloc创建字符串,但这也不起作用:

        std::string str = "{\"action\":3,\"data\":{\"account\":\"somehashgoeshear\",\"someint\":0,\"id\":1,\"moreint\":0,\"name\":\"demo\"}}";
        char *cstr = (char *)malloc((str.length() + 1) * sizeof(char));
        strcpy(cstr, str.c_str());
        lwsl_notice("\n%s", cstr);
        return lws_write(wsi, (unsigned char*)cstr, strlen(cstr), LWS_WRITE_TEXT);

我可以多次运行此代码,但最终我遇到此错误free(): invalid next size (fast)(发送数据后失败)

[我也尝试了LWS_PRE的耦合实验,但是当我将其添加到字符串时,它在消息开头添加了几个符号,例如:a":

[发送数据后尝试free(cstr)时,它立即失败,并显示double free or corruption (out)错误。

lws版本:1.7.1os:ubuntu x64

c++ string memory-management libwebsockets
1个回答
0
投票

根据文档https://libwebsockets.org/lws-api-doc-master/html/group__sending-data.html#gafd5fdd285a0e25ba7e3e1051deec1001

重要提示!

使用websocket协议发送时

LWS_WRITE_TEXT,LWS_WRITE_BINARY,LWS_WRITE_CONTINUATION,LWS_WRITE_PING,LWS_WRITE_PONG,

或通过http / 2发送,

发送缓冲区之前,发送缓冲区必须具有有效的LWS_PRE字节您传递给lws_write()的指针。

这意味着您必须为缓冲区分配额外的LWS_PRE字节,即

std::string str(LWS_PRE, ' '); //Allocate LWS_PRE bytes
str += "{\"action\":3,\"data\":{\"account\":\"somehashgoeshear\",\"someint\":0,\"id\":1,\"moreint\":0,\"name\":\"demo\"}}"
return lws_write(wsi, (unsigned char*)&str[LWS_PRE], strlen(str.c_str()), LWS_WRITE_TEXT);
© www.soinside.com 2019 - 2024. All rights reserved.