Libwesockets.h: проблема с преобразованием строки lws_write: C ++ в C и отправкой - PullRequest
1 голос
/ 23 октября 2019

Я использую 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.1 os: ubuntu64

1 Ответ

1 голос
/ 23 октября 2019

В соответствии с документацией https://libwebsockets.org/lws-api-doc-master/html/group__sending-data.html#gafd5fdd285a0e25ba7e3e1051deec1001

ВАЖНОЕ УВЕДОМЛЕНИЕ!

При отправке по протоколу веб-сокета

LWS_WRITE_TEXT, LWS_WRITE_BINARY, LWS_WRITE_CONTINUATION, LWS_RW_RUS_WRS, LWS_WRS, LWS_WRS*

или отправка по 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);
...