js[“password”] = pwd;
string request = js.dump();
g_isLoginSuccess = false;
int len = send(clientfd, request.c_str(), strlen(request.c_str()) + 1, 0);
if (len == -1)
{
cerr << “send login msg error:” << request << endl;
}
sem_wait(&rwsem); // 等待信号量,由子线程处理完登录的响应消息后,通知这里
if (g_isLoginSuccess)
{
// 进入聊天主菜单页面
isMainMenuRunning = true;
mainMenu(clientfd);
}
}
break;
case 2: // register业务
{
char name[50] = {0};
char pwd[50] = {0};
cout << “username:”;
cin.getline(name, 50);
cout << “userpassword:”;
cin.getline(pwd, 50);
json js;
js[“msgid”] = REG_TYPE;
js[“name”] = name;
js[“password”] = pwd;
string request = js.dump();
int len = send(clientfd, request.c_str(), strlen(request.c_str()) + 1, 0);
if (len == -1)
{
cerr << “send reg msg error:” << request << endl;
}
sem_wait(&rwsem); // 等待信号量,子线程处理完注册消息会通知
}
break;
case 3: // quit业务
close(clientfd);
sem_destroy(&rwsem);
exit(0);
default:
cerr << “invalid input!” << endl;
break;
}
}
return 0;
}
// 处理注册的响应逻辑
void doRegResponse(json &responsejs)
{
if (0 != responsejs[“errno”].get()) // 注册失败
{
cerr << “name is already exist, register error!” << endl;
}
else // 注册成功
{
cout << "name register success, userid is " << responsejs[“id”]
<< “, do not forget it!” << endl;
}
}
// 处理登录的响应逻辑
void doLoginResponse(json &responsejs)
{
if (0 != responsejs[“errno”].get()) // 登录失败
{
cerr << responsejs[“errmsg”] << endl;
g_isLoginSuccess = false;
}
else // 登录成功
{
// 记录当前用户的id和name
g_currentUser.setID(responsejs[“id”].get());
g_currentUser.setname(responsejs[“name”]);
// 记录当前用户的好友列表信息
if (responsejs.contains(“friends”)) //如果有,贸然解析有崩溃的风险,JSON模块可脆弱
{
// 初始化
g_currentUserFriendList.clear();
vector vec = responsejs[“friends”];
for (string &str : vec)
{
json js = json::parse(str);
User user;
user.setID(js[“id”].get());
user.setname(js[“name”]);
user.setstate(js[“state”]);
g_currentUserFriendList.push_back(user);
}
}
// 记录当前用户的群组列表信息
if (responsejs.contains(“groups”))
{
// 初始化
g_currentUserGroupList.clear();
vector vec1 = responsejs[“groups”];
for (string &groupstr : vec1)
{
json grpjs = json::parse(groupstr);
Group group;
group.setId(grpjs[“id”].get());</