void protobuf_codec::handle_message(connection_ptr& conn) const { loki::buffer* buffer = conn->get_buffer(); while (buffer->data_size() >= MSG_NAME_LENGTH_SIZE + MIN_MSG_NAME_SIZE + MSG_HEADER_LENGTH) { const uint32_t flag = buffer->get<uint32_t>(); const uint32_t msg_len = flag & 0x0000ffff; if (msg_len + MSG_HEADER_LENGTH > buffer->data_size()) { //message not enough, wait break; } if (msg_len > MAX_MSG_LENGTH || msg_len < MSG_NAME_LENGTH_SIZE + MIN_MSG_NAME_SIZE) { LOG(ERROR)<<"message length error "<<msg_len<<",readable="<<buffer->data_size(); conn->close(); break; } char buff[MAX_MSG_LENGTH]; size_t len = sizeof(buff); LOG(INFO)<<__func__<<", flag="<<flag; bool ret = conn->restore_msg((const char*)buffer->data_ptr() + MSG_HEADER_LENGTH, flag, buff, len); if (!ret) { LOG(ERROR)<<"restore msg error"; conn->close(); break; } uint32_t errorcode = 0; MessagePtr message = parse(buff, len, errorcode); if (errorcode == 0 && message) { callback_(conn, message); buffer->consume(MSG_HEADER_LENGTH + msg_len); } else { LOG(ERROR)<<"Parse message error ,errorcode="<<errorcode; conn->close(); break; } } }