0

我有一个用 libwebsockets 构建的小型 websocket 服务器,我需要接收一个 string ,问题是接收到的数据是一个 *void,但是我很难将它转换为 string 。

static int my_protocol_callback(struct libwebsocket_context *context,
             struct libwebsocket *wsi,
             enum libwebsocket_callback_reasons reason,
             void *user, void *in, size_t len)
{
    int n, m;
    unsigned char buf[LWS_SEND_BUFFER_PRE_PADDING + 512 +
                          LWS_SEND_BUFFER_POST_PADDING];
    unsigned char *p = &buf[LWS_SEND_BUFFER_PRE_PADDING];


    switch (reason) {

        case LWS_CALLBACK_ESTABLISHED:
            printf("New Connection\n");
            break;

        case LWS_CALLBACK_SERVER_WRITEABLE:
            break;

        case LWS_CALLBACK_RECEIVE:
            webcmd = static_cast<std::string*>(in);
            break;

        case LWS_CALLBACK_FILTER_PROTOCOL_CONNECTION:
            break;

        default:
            break;
    }
    return 0;
}

在这种LWS CALLBACK RECEIVE情况下,数据是*in,我将其转换为 static_cast<std::string*>(in);,存储在 webcmd 字符串中。

问题是结果是一个字符指针,而不是我需要一个真正的字符,因为接下来我需要拆分字符串。

你怎么看待这件事?

编辑:解决了这个问题。

在下面case LWS_CALLBACK_RECEIVE:

        tmpcmd = reinterpret_cast <char*>(in);
    strcpy(webcmd , tmpcmd );

webcmd 是 char 数组, tmpcmd 是 char 指针

谢谢大家:D

4

3 回答 3

2

你不能只做static_cast任何你喜欢的事情,并希望它会奏效。void*不幸的是,你可以在没有警告的情况下对任何你喜欢的东西投 a 。

static_cast,就像reinterpret_cast只是在编译时更改类型,而无需检查指针所指向的内容是否实际上代表了您将其转换为的类型。

在这种情况下,std::string 是具有多个成员变量和内存表示的复杂类型。除非你传入完全相同的类型,否则你将产生灾难性的结果。

传递实际类型会好得多,而不是void*,但我不知道这是否可能与您正在做的事情有关。

如果你真的需要一个字符串,那么你需要使用std::strings 构造函数之一。

像这样:

case LWS_CALLBACK_RECEIVE:
        std::string command(static_cast<char*>(in));
        webcmd = command; //I don't know what webcmd is.
        break;
于 2013-10-02T12:11:00.777 回答
1

"in" 应该是一些字符数组,你应该这样做:

char * buf = new char[DATA_SIZE];

然后内存将数据作为字符数组(或 BYTE)复制到其中。

于 2013-10-02T12:14:07.707 回答
0

一旦某些东西被转换为 a void*,所有类型信息都将丢失。

您需要搜索设置回调函数的代码/文档,并将其转换回最初转换为void*. 它很可能是 a std::string*,但也可能是其他类型,例如 a char*。然后,为了使您的代码非常清晰,请使用reinterpret_cast

whateverthetypeis* = reinterpret_cast<whateverthetypeis*>(in);

如今,回调可以建模为仿函数或使用模板。然后保留类型信息。您当前使用的机制是对void*作为泛型类型使用的旧 C 时代的回归。

至于想要一个真实的char;你不会明白的。Achar只是一个介于 -128 和 +127 之间的数字。然而,C 和 C++ 使用 char*(即 char指针)来对从 : 表示的内存位置开始的非零字符序列进行建模,char*即字符串。

如果结果in是 a char*,那么您可以构造 a std::stringwithin作为构造函数参数并在闲暇时拆分 std::string 。

于 2013-10-02T12:15:40.257 回答