add:添加异常发送失败时,关闭打开的文件,添加退出时关闭打开的文件。
This commit is contained in:
		
							parent
							
								
									0cafcaf643
								
							
						
					
					
						commit
						c3fde429ad
					
				@ -17,6 +17,17 @@ CClient::CClient(const std::shared_ptr<spdlog::logger>& logger) : logger_(logger
 | 
			
		||||
 | 
			
		||||
CClient::~CClient()
 | 
			
		||||
{
 | 
			
		||||
    if (down_->file_) {
 | 
			
		||||
        fclose(down_->file_);
 | 
			
		||||
        down_->file_ = nullptr;
 | 
			
		||||
    }
 | 
			
		||||
    std::lock_guard<std::mutex> lock(mutex_);
 | 
			
		||||
    for (const auto& item : up_) {
 | 
			
		||||
        if (item.second->file_) {
 | 
			
		||||
            fclose(item.second->file_);
 | 
			
		||||
            item.second->file_ = nullptr;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void CClient::run(const std::string& ip, const std::string& port)
 | 
			
		||||
@ -169,7 +180,7 @@ bool CClient::down_one_file(const std::string& id, const std::string& file)
 | 
			
		||||
    return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void CClient::cancel_trans_file(const std::string& key)
 | 
			
		||||
void CClient::report_trans_ret(TransState state, const std::string& key)
 | 
			
		||||
{
 | 
			
		||||
    std::shared_ptr<TransInfomation> t = nullptr;
 | 
			
		||||
    if (key.empty()) {
 | 
			
		||||
@ -180,15 +191,14 @@ void CClient::cancel_trans_file(const std::string& key)
 | 
			
		||||
            t = up_[key];
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (t == nullptr) {
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    t->trans_state_ = TRANS_FAILE;
 | 
			
		||||
    t->trans_state_ = state;
 | 
			
		||||
    if (t->file_) {
 | 
			
		||||
        fclose(t->file_);
 | 
			
		||||
        if (key.empty()) {
 | 
			
		||||
        t->file_ = nullptr;
 | 
			
		||||
        if (key.empty() && t->trans_state_ == TRANS_FAILED) {
 | 
			
		||||
            fs::remove(t->cur_file_);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@ -296,7 +306,7 @@ void CClient::handle_frame(CFrameBuffer* buf)
 | 
			
		||||
        }
 | 
			
		||||
        if (t->file_ == nullptr) {
 | 
			
		||||
            logger_->error("open file {} failed.", t->cur_file_);
 | 
			
		||||
            cancel_trans_file(buf->mark_ == 0 ? id : "");
 | 
			
		||||
            report_trans_ret(TRANS_FAILED, buf->mark_ == 0 ? id : "");
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
        std::shared_ptr<CFrameBuffer> tmp = std::make_shared<CFrameBuffer>();
 | 
			
		||||
@ -305,7 +315,7 @@ void CClient::handle_frame(CFrameBuffer* buf)
 | 
			
		||||
        tmp->tid_ = buf->fid_;
 | 
			
		||||
        if (!send_frame(tmp.get())) {
 | 
			
		||||
            logger_->error("TYPE_OPEN_FILE send ready failed.");
 | 
			
		||||
            cancel_trans_file(buf->mark_ == 0 ? id : "");
 | 
			
		||||
            report_trans_ret(TRANS_FAILED, buf->mark_ == 0 ? id : "");
 | 
			
		||||
        }
 | 
			
		||||
        break;
 | 
			
		||||
    }
 | 
			
		||||
@ -346,6 +356,7 @@ void CClient::send_file_data_th()
 | 
			
		||||
    while (!feof(t->file_)) {
 | 
			
		||||
        buf->len_ = fread(buf->data_, 1, g_BuffSize, t->file_);
 | 
			
		||||
        if (!send_frame(buf.get())) {
 | 
			
		||||
            report_trans_ret(TRANS_FAILED, str_key);
 | 
			
		||||
            logger_->error("send_file_data_th send failed.");
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
@ -355,6 +366,6 @@ void CClient::send_file_data_th()
 | 
			
		||||
    if (!send_frame(buf.get())) {
 | 
			
		||||
        logger_->error("send_file_data_th send DONE failed.");
 | 
			
		||||
    }
 | 
			
		||||
    cancel_trans_file(str_key);
 | 
			
		||||
    report_trans_ret(TRANS_DONE, str_key);
 | 
			
		||||
    logger_->debug("Trans File {} To {} Done !!!", t->cur_file_, str_key);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -14,7 +14,7 @@ struct DownClientInfo {
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum TransState {
 | 
			
		||||
    TRANS_FAILE,
 | 
			
		||||
    TRANS_FAILED,
 | 
			
		||||
    TRANS_ING,
 | 
			
		||||
    TRANS_REDAY,
 | 
			
		||||
    TRANS_DONE
 | 
			
		||||
@ -25,7 +25,7 @@ struct TransInfomation {
 | 
			
		||||
    std::string cur_remote_file_;
 | 
			
		||||
    std::string cur_file_;
 | 
			
		||||
    FILE* file_{};
 | 
			
		||||
    TransState trans_state_{TRANS_FAILE};
 | 
			
		||||
    TransState trans_state_{TRANS_FAILED};
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class CClient
 | 
			
		||||
@ -43,7 +43,7 @@ public:
 | 
			
		||||
    bool up_task(const std::string& cmd);
 | 
			
		||||
    bool cancel_task();
 | 
			
		||||
    bool down_one_file(const std::string& id, const std::string& file);
 | 
			
		||||
    void cancel_trans_file(const std::string& key = "");
 | 
			
		||||
    void report_trans_ret(TransState state, const std::string& key = "");
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
    bool send_frame(CFrameBuffer* buf);
 | 
			
		||||
 | 
			
		||||
@ -3,7 +3,7 @@
 | 
			
		||||
#include <of_util.h>
 | 
			
		||||
 | 
			
		||||
using namespace ofen;
 | 
			
		||||
 | 
			
		||||
constexpr int g_MaxCacheLen = 1024 * 1024 * 50;
 | 
			
		||||
constexpr int g_ParseThreadNum = 1;
 | 
			
		||||
CTcpServer::CTcpServer(asio::io_context& io_context, const std::shared_ptr<spdlog::logger>& logger)
 | 
			
		||||
    : io_context_(io_context), logger_(logger), acceptor_(io_context)
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user