Почему evbuffer_add_printf будет принимать только статические переменные, а не "динамические"?
До сих пор я получил свой код libev, чтобы успешно возвращать статическую строку с надписью "OMP OMP", однако, когда я пишу функцию, которая возвращает "статическую" строку, она никогда не работает. (Замечание: идея в том, чтобы превратить ту же функцию в динамический отклик, но для гибкого тестирования мне нужно, чтобы это сначала сработало). Мой код для обратного вызова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
Спасибо за ваше время и помощь!
1 ответ
c передает аргументы по значению, а не по ссылке. Ваша проблема здесь:
void parse_json_command(char json_command, char *response){
[...]
response = "YOU KNOW";
[...]
}
char *response;
parse_json_command(req, response);
response
неинициализированный указатель на строку Вы назначаете указатель на статическую строку response
указатель в функции, но это не меняет response
вне функции, он просто меняется response
в рамках функции. Есть разные способы исправить это. Вероятно, самым простым для быстрого исправления будет изменение прототипа функции для возврата char *
вместо 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
, если вы хотите передать более одного байта там.