Пример #1
0
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 ) {
Пример #2
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;
}
Пример #3
0
	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;
				}
			}

		}

	}