void EasyP2P::on_message(int sock, string message) { append_buf(sock, message); switch (get_state(sock)) { case EasyP2PState::NICK: { string result; if ( !read_until(message, "\n", result, 0) ) { need_buf(sock, message, true); return; } regex r(R"(^(\w+)\s+)"); smatch m; if (!regex_search(result, m, r)) { string message = "Invalid nickname!"; _scheduler.write_line(sock, message); return; } auto nick = m[1]; if (_n2s.find(nick) != _n2s.end()) { string message = "ALready exist!"; _scheduler.write_line(sock, message); return; } _n2s[nick] = sock; _s2n[sock] = nick; _scheduler.write_line(sock, "Nickname OK!"); _scheduler.write_line(sock, "You can type cmd now!"); set_state(sock, EasyP2PState::CMD); break; } case EasyP2PState::CMD: { string result; regex r(R"(^\w+\s+(\w+))"); while (true) { if ( !read_until(message, "\n", result, 0) ) { need_buf(sock, message, true); return; } if ( result.find("list") == 0 ) { on_list(sock); } else if ( result.find("info ") == 0 ) {
bool ClientServer::recv_session_id(int worker_client, string& message) { append_buf(worker_client, message); uint32_t session_id_n; if ( need_buf(worker_client, message, !Protocol::read(message, session_id_n)) ) { return false; } auto session_id = ntohl(session_id_n); _c2s[worker_client] = session_id; _s2c[session_id] = worker_client; return true; }
void Redis::on_message(int client, string message) { append_buf(client, message); StreamReader s(message); size_t offset = 0; try { do { auto r = parse_response(s); offset = s.offset(); if (_callbacks.empty()) { L.error_log("callbacks empty for redis response"); break; } auto cb = _callbacks.front(); _callbacks.pop(); cb.second(r); //notify wait _scheduler.fire<::Client::ON_PACKET_OK, GUID&>(cb.first); } while (!s.end()); } catch (ReaderException e) { //TODO error handle switch (e) { case ReaderException::AG: { need_buf(client, offset > 0 ? message.substr(offset) : message, true); return; } case ReaderException::NG: { _scheduler.close(client); return; } } } }