从 void* 转换为字符串 libwebsocket



我有一个用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 Connectionn");
            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 是一个字符数组而 tmpcmd 是一个字符指针

谢谢大家的:D

你不能只static_cast任何你喜欢的东西,并希望它会起作用。不幸的是,您可以在没有警告的情况下对任何您喜欢的东西投void*

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

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

传入实际类型比传递void*要好得多,但我不知道您正在做的事情是否可能。

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

喜欢这个:

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

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

char * buf = new char[DATA_SIZE];

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

一旦某些东西被投射到void*,所有类型信息都会丢失。

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

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

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

至於想要一個真正的char;你不會得到那個。char只是 -128 到 +127 之间的数字。然而,C 和 C++ 使用 char*(即 char 指针(来建模从 char* 表示的内存位置开始的非零字符序列:即字符串。

如果事实证明in是一个char*,那么你可以用in作为构造函数参数构造一个std::string,并在闲暇时拆分std::string。

相关内容

  • 没有找到相关文章

最新更新