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 文字列に格納しました。

問題は、結果が char ポインターであることです。代わりに、次に文字列を分割する必要があるため、真の char が必要です。

あなたはそれについてどう思いますか?

EDIT:問題を解決しました。

case LWS_CALLBACK_RECEIVE:

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

webcmd は char 配列で、tmpcmd は char ポインターです。

いつもありがとうございます:D

4

3 に答える 3

2

好きなことだけstatic_castをして、それがうまくいくことを期待することはできません。残念ながら、警告なしに a を好きなものにキャストすることが許可されvoid*ています。

static_castreinterpret_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 配列である必要があります。次のようにする必要があります。

char * buf = new char[DATA_SIZE];

次に、データを文字の配列(またはBYTE)としてメモリにコピーします。

于 2013-10-02T12:14:07.707 に答える
0

何かが にキャストされるとvoid*、すべての型情報が失われます。

コールバック関数を設定するコード/ドキュメントを検索し、最初に にキャストされたインスタンスのデータ型に戻す必要がありますvoid*。の場合もありますが、std::string*などの他のタイプの場合もありますchar*。次に、コードを非常に明確にするために、次を使用しますreinterpret_cast

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

最近では、コールバックはファンクターとしてモデル化するか、テンプレートを使用してモデル化できます。その後、型情報が保持されます。void*現在使用しているメカニズムは、ジェネリック型として使用されていた古い C 時代への逆戻りです。

true が必要な場合はchar; あなたはそれを取得しません。Acharは -128 から +127 までの数字です。ただし、 char* (つまり charポインタchar*) は、C および C++ で使用され、 : つまり文字列で示されるメモリ位置から始まるゼロ以外の文字のシーケンスをモデル化します。

inそれが aであることが判明した場合は、コンストラクタ引数としてchar*astd::stringを作成し、必要inに応じて std::string を分割できます。

于 2013-10-02T12:15:40.257 に答える