0

これまでのところ、 「OMP OMP」という静的文字列を正常に返すlibevコードを取得しましたが、「静的」文字列を返す関数を作成すると、機能しないようです。(補足: アイデアは、同じ関数を動的応答に変えることですが、アジャイル テストの目的のためだけに、これを最初に機能させる必要があります)。libev read コールバックの私のコードは次のとおりです...

void p2pserver_network_buf_read_callback(struct bufferevent *incoming, void *arg){
    //Define function local variables
    struct evbuffer *evreturn;
    char *req;

    //Begin function local logic
    req = evbuffer_readline(incoming->input);
    if (req == NULL){
        return;    
    }


    char *response;
    parse_json_command(req, response);
    //response = "OMP OMP";
    g_print("PARSED");
    evreturn = evbuffer_new();
    evbuffer_add_printf(evreturn, "%s", response);

    bufferevent_write_buffer(incoming,evreturn);
    evbuffer_free(evreturn);
    free(req);

    g_print("%s", response);
}

parse_json_command関数は次のとおりです...

void parse_json_command(char json_command, char *response){

    //Define Local Variables
    g_print("PARSING");

    response = "YOU KNOW";

    //Print out the recieved message....
    //g_message("%s", json_command);


    /** 
     * TODO: check if the JSON is valid before parsing 
     *          to prevent "Segmentation Defaults" 
     *          and its good sanity checks.
     **/

    //Parse JSON incomming
    /*json_object * jobj = json_tokener_parse(json_command);

    enum json_type type;
    json_object_object_foreach(jobj, key, val){
        g_print("%s\n", key);

        if(g_utf8_collate(key, "cmd") >= 0){
            //Looks like the user has sent a "cmd" (command), lets analyze the "val" (value) of that command to see what the caller/client needs to be attending to...

            //Is the client requesting an "Identity Update" (Pings server: if this is the first time ping, the server and client will exachange keys if the relationship exists the server just accepts the encrypted "ping" packet update)
            type = json_object_get_type(val);
            if(type == json_type_string){
                char* cmd_value;
                cmd_value = json_object_get_string(val);
                //g_print("VALUE:%d\n", g_utf8_collate(cmd_value, "identupdate"));
                if(g_utf8_collate(cmd_value, "identupdate") == 0){
                    //Call "Identity Update Response"
                        //char return_response = p2pserver_json_identupdate_response(json_command);

                }
            }
        }
    }
    */
    return;
}

完全なコード (この記事の執筆時点では数ページしかありません) を見たい場合は、次のリンクからソース コードにアクセスできます: https://github.com/Xenland/P2PCrypt-Server

お時間をいただきありがとうございます。

4

1 に答える 1

2

c は、引数を参照ではなく値で渡します。あなたの問題はここにあります:

void parse_json_command(char json_command, char *response){
    [...]
    response = "YOU KNOW";
    [...]
}

char *response;
parse_json_command(req, response);

response文字列への初期化されていないポインタです。関数内のポインターへの静的文字列へのポインターを割り当てていますが、それは関数の外部ではresponse変更されず、関数内で変更されるだけです。これを修正するにはさまざまな方法があります。おそらく、迅速な修正のための最も簡単な方法は、関数のプロトタイプを の代わりにa を返すように変更することです。responseresponsechar *void

char * parse_json_command(char json_command){
    char *response;
    [...]
    response = "YOU KNOW";
    [...]
    return response;
}

char *response;
response = parse_json_command(req);

また、そこに複数のバイトを渡したい場合、json_command引数はおそらく単一の ではなくchar *またはにする必要があります。const char *char

于 2013-01-27T16:11:03.107 に答える