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

Libwesockets.h: Issue with lws_write: C++ string to C conversion and send

本文关键字:转换 问题 字符串 lws write Libwesockets C++      更新时间:2023-10-16

我使用的是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

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

重要通知!

使用websocket协议发送时

LWS_WRITE_TEXT,LWS_WRITE_BINARY,LWS_rite_contination,LWS_WRITE_PING,LWS_WRITE_prong,

或在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], str.size(), LWS_WRITE_TEXT);

使用malloc

char* createMessage() {
std::string str = "{"action":3,"data":{"account":"somehashgoeshear","someint":0,"id":1,"moreint":0,"name":"demo"}}";
char *cstr = (char *)malloc(LWS_PRE + (str.length() + 1) * sizeof(char));
cstr += LWS_PRE;
strcpy(cstr, str.c_str());
lwsl_notice("n%s", cstr);
return cstr;
}
...
char* msg = createMessage();
lws_write(wsi, 
(unsigned char*)msg, 
strlen(msg) /* add 1 if receiver expects the null character*/, 
LWS_WRITE_TEXT);
free(msg - LWS_PRE);

用libwebsockets发送C++字符串的简单方法:

std::string payload = "Some sample string.";
// prepare payload with lws header
std::string buffer(LWS_SEND_BUFFER_PRE_PADDING + payload.size(), ' ');
buffer.insert(LWS_SEND_BUFFER_PRE_PADDING, payload);
// send message
lws_write(wsi, (unsigned char*) &buffer[LWS_SEND_BUFFER_PRE_PADDING], payload.size(), LWS_WRITE_TEXT);