Libwesockets.h:lws_write:C++字符串到C的转换和发送问题
Libwesockets.h: Issue with lws_write: C++ string to C conversion and send
我使用的是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);
相关文章:
- 模板类转换问题 - 无法推断调用的函数
- 复制构造函数隐式转换问题
- 与模板 (c++) 相关的转换问题
- 将文件复制到自定义位置,存在字符串转换问题
- 从基指针到派生的强制转换问题
- JNI 日期值转换问题,在C++中获取不同的长整型值
- 类型转换问题
- 拆分 pybind11 模块和自动类型转换问题
- 类型转换问题:返回为整数而不是浮点/类型
- 如何解决ostream_iterator转换问题?
- C++转换问题
- 代码 c++ VS 2010 中的 LPCWSTR 到字符串转换问题
- 罗马数字C++编程转换问题
- C++十进制到时间的转换问题
- C++到 C 的转换问题
- C 复合分配和类型转换问题
- CPP预处理器到C预处理器转换问题
- 将数据类型从C#封送至C++的类型转换问题
- COM对象,并返回QVariant强制转换问题
- C 汇编器转换问题