diff --git a/client/client.cpp b/client/client.cpp index 4fe6153..7a4618a 100644 --- a/client/client.cpp +++ b/client/client.cpp @@ -15,7 +15,7 @@ namespace fs = boost::filesystem; namespace fs = std::filesystem; #endif -CClient::CClient() +CClient::CClient() : msg_info_("") { client_ = std::make_shared(io_context_); sleep_.set_timeout(5000); @@ -507,7 +507,7 @@ bool CClient::down_one_file(int remote_id, const std::string& file, const std::s TLOGW("down one file success, total:[{}/{}]", cur_down_size_, cur_file_size_); return true; } else { - TLOGW("down one file {} failed.", down_->cur_file_); + TLOGW("down one file {} failed, size not matched.", down_->cur_file_); if (!down_->file_.is_open()) { down_->file_.close(); fs::remove(down_->cur_file_); @@ -1034,12 +1034,17 @@ void CClient::handle_frame(CFrameBuffer* buf) downloading_ = true; } if (will_receive_) { - down_->file_.write(buf->data_, buf->len_); + msg_info_.id = buf->fid_; + if (!deserialize(buf->data_, buf->len_, msg_info_)) { + TLOGE("{} TRANS deserialize failed.", __LINE__); + break; + } + down_->file_.write(msg_info_.data.c_str(), msg_info_.data.size()); if (down_->file_.fail()) { report_trans_ret(TRANS_FAILED); - TLOGW("no matched write and data. {}", buf->len_); + TLOGW("no matched write and data. {}", msg_info_.data.size()); } - cur_down_size_ += buf->len_; + cur_down_size_ += msg_info_.data.size(); } break; } @@ -1242,10 +1247,14 @@ void CClient::handle_frame(CFrameBuffer* buf) break; } case TYPE_FILE_INFO: { - std::string str_size(buf->data_, buf->len_); - auto vec = COfStr::split(str_size, ","); + CMessageInfo msg_info(buf->fid_); + if (!deserialize(buf->data_, buf->len_, msg_info)) { + TLOGE("{} TRANS deserialize failed.", __LINE__); + break; + } + auto vec = COfStr::split(msg_info.str, ","); if (vec.size() < 3) { - TLOGE("invalid file information:{}", str_size); + TLOGE("invalid file information:{}", msg_info.str); break; } long long size = std::stoll(vec[1]); @@ -1280,8 +1289,8 @@ void CClient::send_file_data_th(const char* keys) TLOGI("Start Trans File {} To {}", t->cur_file_, str_key); std::shared_ptr buf = std::make_shared(); - buf->data_ = new char[g_BuffSize]{}; buf->tid_ = str_key; + CMessageInfo msg_info(own_id_); // ******************************************************** // TYPE_FILE_INFO格式:平台([0,win], [1,unix]),大小,权限 @@ -1307,7 +1316,8 @@ void CClient::send_file_data_th(const char* keys) std::string info_result = plat + "," + str_size + "," + str_perm; TLOGI("To {} File Size: {} [{}], permissions:{}", str_key, ofen::OfUtil::get_file_size(size), size, str_perm); - buf->len_ = std::snprintf(buf->data_, g_BuffSize, "%s", info_result.c_str()); + msg_info.str = info_result; + serialize(msg_info, &buf->data_, buf->len_); if (!send_frame(buf.get())) { report_trans_ret(TRANS_FAILED, str_key); TLOGE("Stop Trans {} To {} failed.", t->cur_file_, str_key); @@ -1316,20 +1326,25 @@ void CClient::send_file_data_th(const char* keys) buf->type_ = TYPE_TRANS_FILE; buf->mark_ = 1; + msg_info.data.resize(g_BuffSize); + long long send_size = 0; + long long cur_send_size = 0; while (!t->file_.eof()) { if (t->trans_state_ == TRANS_BREAK) { TLOGW("Stop Trans {} To {} failed.", t->cur_file_, str_key); report_trans_ret(TRANS_FAILED, str_key); return; } - t->file_.read(buf->data_, g_BuffSize); - buf->len_ = t->file_.gcount(); + t->file_.read(&msg_info.data[0], g_BuffSize); + cur_send_size = t->file_.gcount(); + msg_info.data.resize(cur_send_size); + send_size += cur_send_size; + serialize(msg_info, &buf->data_, buf->len_); if (!send_frame(buf.get())) { report_trans_ret(TRANS_FAILED, str_key); TLOGE("Stop Trans {} To {} failed.", t->cur_file_, str_key); return; } - // std::this_thread::sleep_for(std::chrono::milliseconds(10)); } buf->type_ = TYPE_TRANS_DONE; @@ -1337,7 +1352,7 @@ void CClient::send_file_data_th(const char* keys) TLOGE("send_file_data_th send DONE failed."); } report_trans_ret(TRANS_DONE, str_key); - TLOGD("Trans File {} To {} Done !!!", t->cur_file_, str_key); + TLOGD("Trans File {} To {} Done !!!, {}", t->cur_file_, str_key, send_size); } void CClient::hearts() diff --git a/client/client.h b/client/client.h index 1ec5fef..56f346b 100644 --- a/client/client.h +++ b/client/client.h @@ -90,6 +90,7 @@ private: bool will_receive_{false}; bool downloading_{false}; asio::io_context io_context_; + CMessageInfo msg_info_; std::shared_ptr client_; std::map> clients_; std::shared_ptr down_; diff --git a/util/util.cpp b/util/util.cpp index 2a27f80..84715e5 100644 --- a/util/util.cpp +++ b/util/util.cpp @@ -133,16 +133,15 @@ CFrameBuffer::~CFrameBuffer() len_ = 0; } -void serialize(const CMessageInfo& msg_info, char** out_buf, int& len) +void serialize(CMessageInfo& msg_info, char** out_buf, int& len) { - CMessageInfo info(msg_info); + auto& info = msg_info; info.id = localtou8(info.id); info.uuid = localtou8(info.uuid); info.str = localtou8(info.str); - info.o = localtou8(info.o); // 计算总长度 - len = sizeof(int) * 4 + info.id.size() + info.uuid.size() + info.str.size() + info.o.size() + kz; + len = sizeof(int) * 4 + info.id.size() + info.uuid.size() + info.str.size() + info.data.size() + kz; *out_buf = new char[len]; // 分配内存(调用方负责释放) char* ptr = *out_buf + kz; @@ -169,10 +168,10 @@ void serialize(const CMessageInfo& msg_info, char** out_buf, int& len) ptr += str_size; // 序列化 o - int o_size = static_cast(info.o.size()); + int o_size = static_cast(info.data.size()); memcpy(ptr, &o_size, sizeof(int)); ptr += sizeof(int); - memcpy(ptr, info.o.data(), o_size); + memcpy(ptr, info.data.data(), o_size); uint8_t ik[32]{}; hash(msg_info.id.c_str(), ik); @@ -193,7 +192,7 @@ bool deserialize(char* data, int len, CMessageInfo& msg_info) return false; } - CMessageInfo info(msg_info.id); + auto& info = msg_info; char* ptr = data + kz; int remaining = len; @@ -259,14 +258,11 @@ bool deserialize(char* data, int len, CMessageInfo& msg_info) if (remaining < o_size) { return false; } - info.o.assign(ptr, o_size); + info.data.assign(ptr, o_size); info.id = u8tolocal(info.id); info.uuid = u8tolocal(info.uuid); info.str = u8tolocal(info.str); - info.o = u8tolocal(info.o); - msg_info = info; - return true; } @@ -349,7 +345,7 @@ CMessageInfo::CMessageInfo(const CMessageInfo& info) id = info.id; uuid = info.uuid; str = info.str; - o = info.o; + data.assign(info.data.begin(), info.data.end()); } CMessageInfo& CMessageInfo::operator=(const CMessageInfo& info) @@ -360,6 +356,6 @@ CMessageInfo& CMessageInfo::operator=(const CMessageInfo& info) id = info.id; uuid = info.uuid; str = info.str; - o = info.o; + data.assign(info.data.begin(), info.data.end()); return *this; } diff --git a/util/util.h b/util/util.h index cfdbe7d..81c7b6b 100644 --- a/util/util.h +++ b/util/util.h @@ -50,10 +50,10 @@ struct CMessageInfo { std::string id; std::string uuid; std::string str; - std::string o; + std::string data; }; -void serialize(const CMessageInfo& msg_info, char** out_buf, int& len); +void serialize(CMessageInfo& msg_info, char** out_buf, int& len); bool deserialize(char* data, int len, CMessageInfo& msg_info); std::string u8tolocal(const std::string& str); std::string localtou8(const std::string& str);