fix:修正数据传输部分。
This commit is contained in:
		
							parent
							
								
									334df57b63
								
							
						
					
					
						commit
						29d721ab8a
					
				@ -15,7 +15,7 @@ namespace fs = boost::filesystem;
 | 
				
			|||||||
namespace fs = std::filesystem;
 | 
					namespace fs = std::filesystem;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
CClient::CClient()
 | 
					CClient::CClient() : msg_info_("")
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    client_ = std::make_shared<CTcpClient>(io_context_);
 | 
					    client_ = std::make_shared<CTcpClient>(io_context_);
 | 
				
			||||||
    sleep_.set_timeout(5000);
 | 
					    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_);
 | 
					        TLOGW("down one file success, total:[{}/{}]", cur_down_size_, cur_file_size_);
 | 
				
			||||||
        return true;
 | 
					        return true;
 | 
				
			||||||
    } else {
 | 
					    } 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()) {
 | 
					        if (!down_->file_.is_open()) {
 | 
				
			||||||
            down_->file_.close();
 | 
					            down_->file_.close();
 | 
				
			||||||
            fs::remove(down_->cur_file_);
 | 
					            fs::remove(down_->cur_file_);
 | 
				
			||||||
@ -1034,12 +1034,17 @@ void CClient::handle_frame(CFrameBuffer* buf)
 | 
				
			|||||||
            downloading_ = true;
 | 
					            downloading_ = true;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (will_receive_) {
 | 
					        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()) {
 | 
					            if (down_->file_.fail()) {
 | 
				
			||||||
                report_trans_ret(TRANS_FAILED);
 | 
					                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;
 | 
					        break;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@ -1242,10 +1247,14 @@ void CClient::handle_frame(CFrameBuffer* buf)
 | 
				
			|||||||
        break;
 | 
					        break;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    case TYPE_FILE_INFO: {
 | 
					    case TYPE_FILE_INFO: {
 | 
				
			||||||
        std::string str_size(buf->data_, buf->len_);
 | 
					        CMessageInfo msg_info(buf->fid_);
 | 
				
			||||||
        auto vec = COfStr::split(str_size, ",");
 | 
					        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) {
 | 
					        if (vec.size() < 3) {
 | 
				
			||||||
            TLOGE("invalid file information:{}", str_size);
 | 
					            TLOGE("invalid file information:{}", msg_info.str);
 | 
				
			||||||
            break;
 | 
					            break;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        long long size = std::stoll(vec[1]);
 | 
					        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);
 | 
					    TLOGI("Start Trans File {} To {}", t->cur_file_, str_key);
 | 
				
			||||||
    std::shared_ptr<CFrameBuffer> buf = std::make_shared<CFrameBuffer>();
 | 
					    std::shared_ptr<CFrameBuffer> buf = std::make_shared<CFrameBuffer>();
 | 
				
			||||||
    buf->data_ = new char[g_BuffSize]{};
 | 
					 | 
				
			||||||
    buf->tid_ = str_key;
 | 
					    buf->tid_ = str_key;
 | 
				
			||||||
 | 
					    CMessageInfo msg_info(own_id_);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // ********************************************************
 | 
					    // ********************************************************
 | 
				
			||||||
    // TYPE_FILE_INFO格式:平台([0,win], [1,unix]),大小,权限
 | 
					    // 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;
 | 
					    std::string info_result = plat + "," + str_size + "," + str_perm;
 | 
				
			||||||
    TLOGI("To {} File Size: {} [{}], permissions:{}", str_key, ofen::OfUtil::get_file_size(size), size,
 | 
					    TLOGI("To {} File Size: {} [{}], permissions:{}", str_key, ofen::OfUtil::get_file_size(size), size,
 | 
				
			||||||
          str_perm);
 | 
					          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())) {
 | 
					    if (!send_frame(buf.get())) {
 | 
				
			||||||
        report_trans_ret(TRANS_FAILED, str_key);
 | 
					        report_trans_ret(TRANS_FAILED, str_key);
 | 
				
			||||||
        TLOGE("Stop Trans {} To {} failed.", t->cur_file_, 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->type_ = TYPE_TRANS_FILE;
 | 
				
			||||||
    buf->mark_ = 1;
 | 
					    buf->mark_ = 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    msg_info.data.resize(g_BuffSize);
 | 
				
			||||||
 | 
					    long long send_size = 0;
 | 
				
			||||||
 | 
					    long long cur_send_size = 0;
 | 
				
			||||||
    while (!t->file_.eof()) {
 | 
					    while (!t->file_.eof()) {
 | 
				
			||||||
        if (t->trans_state_ == TRANS_BREAK) {
 | 
					        if (t->trans_state_ == TRANS_BREAK) {
 | 
				
			||||||
            TLOGW("Stop Trans {} To {} failed.", t->cur_file_, str_key);
 | 
					            TLOGW("Stop Trans {} To {} failed.", t->cur_file_, str_key);
 | 
				
			||||||
            report_trans_ret(TRANS_FAILED, str_key);
 | 
					            report_trans_ret(TRANS_FAILED, str_key);
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        t->file_.read(buf->data_, g_BuffSize);
 | 
					        t->file_.read(&msg_info.data[0], g_BuffSize);
 | 
				
			||||||
        buf->len_ = t->file_.gcount();
 | 
					        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())) {
 | 
					        if (!send_frame(buf.get())) {
 | 
				
			||||||
            report_trans_ret(TRANS_FAILED, str_key);
 | 
					            report_trans_ret(TRANS_FAILED, str_key);
 | 
				
			||||||
            TLOGE("Stop Trans {} To {} failed.", t->cur_file_, str_key);
 | 
					            TLOGE("Stop Trans {} To {} failed.", t->cur_file_, str_key);
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        // std::this_thread::sleep_for(std::chrono::milliseconds(10));
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    buf->type_ = TYPE_TRANS_DONE;
 | 
					    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.");
 | 
					        TLOGE("send_file_data_th send DONE failed.");
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    report_trans_ret(TRANS_DONE, str_key);
 | 
					    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()
 | 
					void CClient::hearts()
 | 
				
			||||||
 | 
				
			|||||||
@ -90,6 +90,7 @@ private:
 | 
				
			|||||||
    bool will_receive_{false};
 | 
					    bool will_receive_{false};
 | 
				
			||||||
    bool downloading_{false};
 | 
					    bool downloading_{false};
 | 
				
			||||||
    asio::io_context io_context_;
 | 
					    asio::io_context io_context_;
 | 
				
			||||||
 | 
					    CMessageInfo msg_info_;
 | 
				
			||||||
    std::shared_ptr<CTcpClient> client_;
 | 
					    std::shared_ptr<CTcpClient> client_;
 | 
				
			||||||
    std::map<int, std::shared_ptr<DownClientInfo>> clients_;
 | 
					    std::map<int, std::shared_ptr<DownClientInfo>> clients_;
 | 
				
			||||||
    std::shared_ptr<TransInfomation> down_;
 | 
					    std::shared_ptr<TransInfomation> down_;
 | 
				
			||||||
 | 
				
			|||||||
@ -133,16 +133,15 @@ CFrameBuffer::~CFrameBuffer()
 | 
				
			|||||||
    len_ = 0;
 | 
					    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.id = localtou8(info.id);
 | 
				
			||||||
    info.uuid = localtou8(info.uuid);
 | 
					    info.uuid = localtou8(info.uuid);
 | 
				
			||||||
    info.str = localtou8(info.str);
 | 
					    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];   // 分配内存(调用方负责释放)
 | 
					    *out_buf = new char[len];   // 分配内存(调用方负责释放)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    char* ptr = *out_buf + kz;
 | 
					    char* ptr = *out_buf + kz;
 | 
				
			||||||
@ -169,10 +168,10 @@ void serialize(const CMessageInfo& msg_info, char** out_buf, int& len)
 | 
				
			|||||||
    ptr += str_size;
 | 
					    ptr += str_size;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // 序列化 o
 | 
					    // 序列化 o
 | 
				
			||||||
    int o_size = static_cast<int>(info.o.size());
 | 
					    int o_size = static_cast<int>(info.data.size());
 | 
				
			||||||
    memcpy(ptr, &o_size, sizeof(int));
 | 
					    memcpy(ptr, &o_size, sizeof(int));
 | 
				
			||||||
    ptr += sizeof(int);
 | 
					    ptr += sizeof(int);
 | 
				
			||||||
    memcpy(ptr, info.o.data(), o_size);
 | 
					    memcpy(ptr, info.data.data(), o_size);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    uint8_t ik[32]{};
 | 
					    uint8_t ik[32]{};
 | 
				
			||||||
    hash(msg_info.id.c_str(), ik);
 | 
					    hash(msg_info.id.c_str(), ik);
 | 
				
			||||||
@ -193,7 +192,7 @@ bool deserialize(char* data, int len, CMessageInfo& msg_info)
 | 
				
			|||||||
        return false;
 | 
					        return false;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    CMessageInfo info(msg_info.id);
 | 
					    auto& info = msg_info;
 | 
				
			||||||
    char* ptr = data + kz;
 | 
					    char* ptr = data + kz;
 | 
				
			||||||
    int remaining = len;
 | 
					    int remaining = len;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -259,14 +258,11 @@ bool deserialize(char* data, int len, CMessageInfo& msg_info)
 | 
				
			|||||||
    if (remaining < o_size) {
 | 
					    if (remaining < o_size) {
 | 
				
			||||||
        return false;
 | 
					        return false;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    info.o.assign(ptr, o_size);
 | 
					    info.data.assign(ptr, o_size);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    info.id = u8tolocal(info.id);
 | 
					    info.id = u8tolocal(info.id);
 | 
				
			||||||
    info.uuid = u8tolocal(info.uuid);
 | 
					    info.uuid = u8tolocal(info.uuid);
 | 
				
			||||||
    info.str = u8tolocal(info.str);
 | 
					    info.str = u8tolocal(info.str);
 | 
				
			||||||
    info.o = u8tolocal(info.o);
 | 
					 | 
				
			||||||
    msg_info = info;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    return true;
 | 
					    return true;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -349,7 +345,7 @@ CMessageInfo::CMessageInfo(const CMessageInfo& info)
 | 
				
			|||||||
    id = info.id;
 | 
					    id = info.id;
 | 
				
			||||||
    uuid = info.uuid;
 | 
					    uuid = info.uuid;
 | 
				
			||||||
    str = info.str;
 | 
					    str = info.str;
 | 
				
			||||||
    o = info.o;
 | 
					    data.assign(info.data.begin(), info.data.end());
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
CMessageInfo& CMessageInfo::operator=(const CMessageInfo& info)
 | 
					CMessageInfo& CMessageInfo::operator=(const CMessageInfo& info)
 | 
				
			||||||
@ -360,6 +356,6 @@ CMessageInfo& CMessageInfo::operator=(const CMessageInfo& info)
 | 
				
			|||||||
    id = info.id;
 | 
					    id = info.id;
 | 
				
			||||||
    uuid = info.uuid;
 | 
					    uuid = info.uuid;
 | 
				
			||||||
    str = info.str;
 | 
					    str = info.str;
 | 
				
			||||||
    o = info.o;
 | 
					    data.assign(info.data.begin(), info.data.end());
 | 
				
			||||||
    return *this;
 | 
					    return *this;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -50,10 +50,10 @@ struct CMessageInfo {
 | 
				
			|||||||
    std::string id;
 | 
					    std::string id;
 | 
				
			||||||
    std::string uuid;
 | 
					    std::string uuid;
 | 
				
			||||||
    std::string str;
 | 
					    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);
 | 
					bool deserialize(char* data, int len, CMessageInfo& msg_info);
 | 
				
			||||||
std::string u8tolocal(const std::string& str);
 | 
					std::string u8tolocal(const std::string& str);
 | 
				
			||||||
std::string localtou8(const std::string& str);
 | 
					std::string localtou8(const std::string& str);
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user