NetEase/libpomelo

pc_request route json 编码失败

Closed this issue · 3 comments

当使用pc_request时 会出现
Fail to json encode for message.
Fail to encode message with json: gate.gateHandler.authUID
Fail to encode request message.
之后线程卡死,追代码发现到msg-json.c里的json_dumps不知是否这里有问题?

在此附上代码

//Login waterfall
void MenuLayer::_doLoginWaterFall()
{
//new a client
pc_client_t* client = pc_client_new();
_connectServer(client);
}

void MenuLayer::_connectServer(pc_client_t* client)
{
const char* ip = GATE_HOST;
const int port = GATE_PORT;
struct sockaddr_in address;

memset(&address, 0, sizeof(struct sockaddr_in));
address.sin_family = AF_INET;
address.sin_port = htons(port);
address.sin_addr.s_addr = inet_addr(ip);

if(pc_client_connect(client, &address))
{
    //Future : Print on the UI
    //Now : log at Console
    CCLOGERROR("Fail to connect to server.");
    pc_client_destroy(client);
    return;
}

//Print on Console
CCLOG("Connect to server.");
//pass to next step
_sendRequest(client);

}

void MenuLayer::_sendRequest(pc_client_t* client)
{
const char* route = "gate.gateHandler.authUID";
json_t* msg = json_object();
json_t* uid = json_string("0");
json_object_set(msg, "uid", uid);
//decref
json_decref(msg);

pc_request_t* req = pc_request_new();
pc_request(client, req, route, msg, _onAuthUIDRequestCallback);

}

void MenuLayer::_onAuthUIDRequestCallback(pc_request_t* req,int status,json_t* resp)
{
if(status==-1)
{
CCLOG("Fail to send request to server");
}
else if(status==0)
{
char* json_str = json_dumps(resp, 0);
if(json_str!=nullptr)
{
CCLOG("server response:%s",json_str);
free(json_str);
}
}

//release
json_t* msg = req->msg;
pc_client_t* client = req->client;
json_decref(msg);
pc_request_destroy(req);

//stop
pc_client_stop(client);

}
//

重现一下,把卡死时的堆栈贴一下吧

json_t* msg = json_object(); // refcout == 1
json_t* uid = json_string("0");
json_object_set(msg, "uid", uid);
//decref
json_decref(msg); // refcount == 0, 会被free,然后msg悬挂

pc_request_t* req = pc_request_new();
pc_request(client, req, route, msg, _onAuthUIDRequestCallback);

这段代码有问题

感谢指正 一时迷茫了
错把json_decref(uid)写成json_decref(msg)
close issue.