QFtp斷點續傳

2021-08-24 23:21:47 字數 3044 閱讀 8138

首先明確一點:實現ftp斷點續傳,需要伺服器支援,我使用的是centos 下的vsftpd作為ftp伺服器。

ftp連線一般是有兩個連線,一種連線時客戶端c與伺服器端s傳送命令,一種連線是用於資料的傳輸。而ftp連線支援兩種模式

port模式(主動模式):涉及到的埠號有21和20,當客戶端c向伺服器端s通過埠21傳送請求鏈結時,伺服器端接收連線,並開啟一條命令鏈路。當客戶端需要傳輸資料時,便會通過命令鏈路向伺服器端傳送port命令請求:我開啟了***埠,你連線我吧。伺服器端接受請求,通過埠號為21向客戶端***埠建立一條資料傳輸鏈路傳送資料。

passiv模式(被動模式):客戶端c向伺服器端(埠21)傳送請求連線,伺服器端接收並開啟一條命令鏈路。當客戶端需要傳輸資料時,會通過命令鏈路像伺服器端傳送passiv命令:我開啟了***埠,你連線我吧,伺服器端接受請求,從埠1024-5000中隨機選擇乙個埠與客戶端建立鏈結,並傳送命令:我開啟了***埠,你過來鏈結吧,客戶端接受後就向該埠傳送資料。

由此可知,port模式是客戶端開啟乙個本地埠,等待伺服器端進行資料連線,而passiv模式是由伺服器開啟乙個埠,等待客戶端進行資料連線。

qftp預設採用(pasv)被動模式進行檔案傳輸

qftp續傳:

以下是我封裝的ftpmanager

//標頭檔案

#ifndef ftpmanager_h

#define ftpmanager_h

#include #include #include #include #include #include "qftp.h"

class ftpmanager : public qobject;

#endif // ftpmanager_h

//實現

#include "ftpmanager.h"

class ftpmanager;

ftpmanager::ftpmanager(qstring _host, qstring username, qstring passwd, qint16 _port, qobject *parent):

qobject(parent),

m_username(username),

m_passwd(passwd),

m_file(0),

m_isopenfile(false)

ftpmanager::~ftpmanager()

//停止ftp動作

void ftpmanager::s_abort()

void ftpmanager::s_dloadfile(qstring _remotefile,qstring _localfile,bool isrese)

else

}else

else

}} //上傳檔案(當isrese==true為續傳上傳)

void ftpmanager::s_uloadfile(qstring _localfile,qstring _remotefile,bool isrese)

else

}else

} //更新進度條

void ftpmanager::s_updateprogress(qint64 _used, qint64 _total)

//ftp服務提示資訊

void ftpmanager::s_commandfinish(int tmp, bool en)

}if (myftp->currentcommand() == qftp::login)

if (myftp->currentcommand() == qftp::get)

else

m_file->close();

m_isopenfile = false;

delete m_file;

m_file = null;

}else if(myftp->currentcommand() == qftp::put)

else

m_file->close();

m_isopenfile = false;

delete m_file;

m_file = null;

}else if (myftp->currentcommand() == qftp::close)}}

測試用的小例子

#include "mainwindow.h"

#include "ui_mainwindow.h"

mainwindow::mainwindow(qwidget *parent) :

qmainwindow(parent),

ui(new ui::mainwindow)

mainwindow::~mainwindow()

//更新進度條

void mainwindow::s_updateprogess(int _val)

//更新進度條

void mainwindow::s_updateprogess2(int _val)

void mainwindow::on_downloadbn_clicked()

//普通上傳

void mainwindow::on_uploadbn_clicked()

void mainwindow::on_downloadbn_2_clicked()

//停止

void mainwindow::on_abort_clicked()

//上傳(續傳)

void mainwindow::on_abort_2_clicked()

//停止

void mainwindow::on_abort_3_clicked()

//普通檔案上傳

HTTP 斷點續傳

客戶端請求域 range 格式如下例子 第乙個500位元組 位元組偏移量0 499,包括0和499 range bytes 0 499 第二個500位元組 位元組偏移量500 999,包括500和999 range bytes 500 999 最後500位元組 位元組偏移量9500 9999,包括9...

IOS斷點續傳

asihttprequest可以實現斷點續傳。網上有一些介紹類似使用 request setallowresumeforfiledownloads yes 不過,通過asihttprequest的非同步請求以及delegate還是可以實現斷點續傳的。本文還是以grails編寫斷點續傳伺服器端為例。非...

linux斷點續傳

在linux伺服器上經常要用scp傳輸大檔案,可能由於網路等原因出現間接性中斷,導致傳輸一半的檔案突然中斷。其實scp是可以續傳的,它需要rsync以及它的ssh協議 舉例如下 rsync p rsh ssh home.tar 192.168.205.34 home home.tar,再輸出密碼後,...