首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >H:发出lws_write: C++字符串到C转换和发送

H:发出lws_write: C++字符串到C转换和发送
EN

Stack Overflow用户
提问于 2019-10-23 04:22:00
回答 2查看 684关注 0票数 1

我在用g++。

代码:

代码语言:javascript
代码运行次数:0
运行
复制
        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);

这也不起作用:

代码语言:javascript
代码运行次数:0
运行
复制
        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);

但是,这很好(运行了很多次,没有什么错误):

代码语言:javascript
代码运行次数:0
运行
复制
        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创建字符串,但这也不起作用:

代码语言:javascript
代码运行次数:0
运行
复制
        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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-10-23 05:00:52

根据文件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_write()的缓冲区指针之前具有有效的lws_write字节。

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

代码语言:javascript
代码运行次数:0
运行
复制
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

代码语言:javascript
代码运行次数:0
运行
复制
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);
票数 2
EN

Stack Overflow用户

发布于 2022-03-23 12:47:39

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

代码语言:javascript
代码运行次数:0
运行
复制
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);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58515456

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档