add:添加心跳机制,检测传输失败时自动发现提示。
This commit is contained in:
		
							parent
							
								
									c3fde429ad
								
							
						
					
					
						commit
						3a68984857
					
				@ -13,10 +13,13 @@ CClient::CClient(const std::shared_ptr<spdlog::logger>& logger) : logger_(logger
 | 
			
		||||
    send_pool_ = std::make_shared<CThreadPool>(g_SendPoolNum);
 | 
			
		||||
    send_pool_->init();
 | 
			
		||||
    supported_.push_back("Get");
 | 
			
		||||
    sleep_.set_timeout(2000);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
CClient::~CClient()
 | 
			
		||||
{
 | 
			
		||||
    th_run_ = false;
 | 
			
		||||
    sleep_.contiune();
 | 
			
		||||
    if (down_->file_) {
 | 
			
		||||
        fclose(down_->file_);
 | 
			
		||||
        down_->file_ = nullptr;
 | 
			
		||||
@ -28,20 +31,30 @@ CClient::~CClient()
 | 
			
		||||
            item.second->file_ = nullptr;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    if (hearts_.joinable()) {
 | 
			
		||||
        hearts_.join();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void CClient::run(const std::string& ip, const std::string& port)
 | 
			
		||||
{
 | 
			
		||||
    th_run_ = true;
 | 
			
		||||
    if (!client_->connect(ip, port)) {
 | 
			
		||||
        logger_->info("{} connect err.", __FUNCTION__);
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
    client_->register_func([&](CFrameBuffer* buf) { handle_frame(buf); });
 | 
			
		||||
    client_->async_recv();
 | 
			
		||||
    hearts_ = std::thread([&]() { hearts(); });
 | 
			
		||||
    std::thread thread([&]() { io_context_.run(); });
 | 
			
		||||
    logger_->warn("SupportCmd:Get|Up|Down|Cancel");
 | 
			
		||||
    char line[512]{};
 | 
			
		||||
    while (std::cin.getline(line, 512)) {
 | 
			
		||||
 | 
			
		||||
        if (!th_run_) {
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        std::string cmd_input(line);
 | 
			
		||||
        if (cmd_input == "end") {
 | 
			
		||||
            break;
 | 
			
		||||
@ -101,7 +114,9 @@ bool CClient::down_task(const std::string& param)
 | 
			
		||||
 | 
			
		||||
    // 开始传输文件
 | 
			
		||||
    for (const auto& item : vec) {
 | 
			
		||||
        down_one_file(task_list_[id]->id, item);
 | 
			
		||||
        if (!down_one_file(task_list_[id]->id, item)) {
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return true;
 | 
			
		||||
}
 | 
			
		||||
@ -175,8 +190,12 @@ bool CClient::down_one_file(const std::string& id, const std::string& file)
 | 
			
		||||
    down_->trans_state_ = TRANS_REDAY;
 | 
			
		||||
    while (down_->trans_state_ != TRANS_DONE) {
 | 
			
		||||
        std::this_thread::sleep_for(std::chrono::milliseconds(10));
 | 
			
		||||
        if (!th_run_) {
 | 
			
		||||
            logger_->error("Interrup When Receive File.");
 | 
			
		||||
            report_trans_ret(TRANS_FAILED);
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -214,6 +233,7 @@ bool CClient::send_frame(CFrameBuffer* buf)
 | 
			
		||||
        logger_->error("{} pack failed.", __FUNCTION__);
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
    std::lock_guard<std::mutex> lock(send_mut_);
 | 
			
		||||
    if (!client_->send(out_buf, out_len)) {
 | 
			
		||||
        logger_->error("{} send failed.", __FUNCTION__);
 | 
			
		||||
        delete[] out_buf;
 | 
			
		||||
@ -369,3 +389,16 @@ void CClient::send_file_data_th()
 | 
			
		||||
    report_trans_ret(TRANS_DONE, str_key);
 | 
			
		||||
    logger_->debug("Trans File {} To {} Done !!!", t->cur_file_, str_key);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void CClient::hearts()
 | 
			
		||||
{
 | 
			
		||||
    std::shared_ptr<CFrameBuffer> buf = std::make_shared<CFrameBuffer>();
 | 
			
		||||
    buf->type_ = TYPE_HEARTS;
 | 
			
		||||
    while (th_run_) {
 | 
			
		||||
        sleep_.sleep();
 | 
			
		||||
        if (!send_frame(buf.get())) {
 | 
			
		||||
            logger_->error("{} send failed.", __FUNCTION__);
 | 
			
		||||
            th_run_ = false;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -6,6 +6,7 @@
 | 
			
		||||
#include <string>
 | 
			
		||||
#include "file_oper.h"
 | 
			
		||||
#include <of_util.h>
 | 
			
		||||
#include <memory>
 | 
			
		||||
 | 
			
		||||
using namespace ofen;
 | 
			
		||||
struct DownClientInfo {
 | 
			
		||||
@ -51,6 +52,7 @@ private:
 | 
			
		||||
private:
 | 
			
		||||
    void handle_frame(CFrameBuffer* buf);
 | 
			
		||||
    void send_file_data_th();
 | 
			
		||||
    void hearts();
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
    std::shared_ptr<spdlog::logger> logger_;
 | 
			
		||||
@ -61,6 +63,10 @@ private:
 | 
			
		||||
    std::shared_ptr<TransInfomation> down_;
 | 
			
		||||
    std::map<std::string, std::shared_ptr<TransInfomation>> up_;
 | 
			
		||||
    std::mutex mutex_;
 | 
			
		||||
    std::mutex send_mut_;
 | 
			
		||||
    std::shared_ptr<CThreadPool> send_pool_;
 | 
			
		||||
    std::string work_key_;
 | 
			
		||||
    std::thread hearts_;
 | 
			
		||||
    CThreadSleep sleep_;
 | 
			
		||||
    bool th_run_{false};
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										2
									
								
								ofen
									
									
									
									
									
								
							
							
								
								
								
								
								
								
									
									
								
							
						
						
									
										2
									
								
								ofen
									
									
									
									
									
								
							@ -1 +1 @@
 | 
			
		||||
Subproject commit ab87624a333e385e08abb82ac623bce8da798539
 | 
			
		||||
Subproject commit cf6168a89a784521df0c9d63a049bc025daa1b85
 | 
			
		||||
@ -241,6 +241,10 @@ void CTcpServer::th_client(std::shared_ptr<asio::ip::tcp::socket> socket, const
 | 
			
		||||
            while (true) {
 | 
			
		||||
                auto* frame = CTransProtocal::parse(cache->buffer_);
 | 
			
		||||
                if (frame) {
 | 
			
		||||
                    if (frame->type_ == TYPE_HEARTS) {
 | 
			
		||||
                        delete frame;
 | 
			
		||||
                        continue;
 | 
			
		||||
                    }
 | 
			
		||||
                    frame->fid_ = client_key;
 | 
			
		||||
                    std::lock_guard<std::mutex> lock(buf_mut_);
 | 
			
		||||
                    cache_.push_back(frame);
 | 
			
		||||
 | 
			
		||||
@ -19,7 +19,8 @@ enum FrameType : int16_t {
 | 
			
		||||
    TYPE_READY_TRANS,
 | 
			
		||||
    TYPE_INTERRUPT,
 | 
			
		||||
    TYPE_NO_HIT_TASK,
 | 
			
		||||
    TYPE_WAITTING
 | 
			
		||||
    TYPE_WAITTING,
 | 
			
		||||
    TYPE_HEARTS
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
using namespace ofen;
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user