从void *转换为字符串libwebsocket

时间:2013-10-02 12:06:43

标签: c++ string casting websocket libwebsockets

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

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字符串中。

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

你怎么看待它?

编辑:解决了问题。

case LWS_CALLBACK_RECEIVE:

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

webcmd是一个char数组 和tmpcmd是一个字符指针

谢谢大家:D

3 个答案:

答案 0 :(得分:2)

你不能只对static_cast任何你喜欢的东西,并希望它能够发挥作用。不幸的是,您可以在没有任何警告的情况下将void*投射到任何您喜欢的地方。

static_cast,就像reinterpret_cast一样,只需更改类型一个编译时间,而不检查指针所指向的内容是否实际上代表了你将它投射到的类型。

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

传递实际类型而不是void*会好得多,但我不知道你的工作是否可行。

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

像这样:

case LWS_CALLBACK_RECEIVE:
        std::string command(static_cast<char*>(in));
        webcmd = command; //I don't know what webcmd is.
        break;

答案 1 :(得分:1)

“in”应该是一些char数组,你应该这样做:

char * buf = new char[DATA_SIZE];

然后将数据作为字符数组(或BYTE)存储在其中。

答案 2 :(得分:0)

将某些内容投射到void*后,所有类型信息都已丢失。

您需要搜索设置回调函数的代码/文档,并转换回最初投射到void*的实例的数据类型。它可能是std::string*,但可以是其他类型,例如char*。然后,为了使您的代码真正清晰,请使用reinterpret_cast

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

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

至于想要一个真正的char;你不会那样的。 char只是-128到+127之间的数字。但是,C和C ++使用char *(即char 指针)来模拟从char*表示的内存位置开始的非零字符序列:即字符串。

如果事实证明inchar*,那么您可以使用std::string构造in作为构造函数参数,并将std :: string拆分为闲。