A. qtftp涓嬭澆鍑犱釜鏂囦歡澶瑰拰鍐呭
qtftp涓嬭澆鍑犱釜鏂囦歡澶瑰拰鍐呭規庝箞鎿嶄綔錛焣tftp涓嬭澆鍑犱釜鏂囦歡澶瑰拰鍐呭硅繖鏍鋒搷浣滐細
1銆佸緩絝婩TP榪炴帴錛氫嬌鐢≦TFTP鎻愪緵鐨勫嚱鏁幫紝寤虹珛涓嶧TP鏈嶅姟鍣ㄧ殑榪炴帴錛岄渶瑕佹彁渚涙湇鍔″櫒鐨処P鍦板潃銆佺鍙e彿鍜岀櫥褰曞嚟璇侊紙渚嬪傜敤鎴峰悕鍜屽瘑鐮侊級銆
2銆佸垪鍑虹洰褰曞唴瀹癸細浣跨敤QTFTP鎻愪緵鐨勫嚱鏁幫紝鍒楀嚭瑕佷笅杞界殑鏂囦歡澶逛腑鐨勫唴瀹癸紝鍙浠ユ寚瀹氭枃浠跺す鐨勮礬寰勫苟鑾峰彇璇ヨ礬寰勪笅鐨勬枃浠跺拰瀛愭枃浠跺す鍒楄〃銆
3銆佷笅杞芥枃浠跺拰鏂囦歡澶癸細鏍規嵁闇奼備嬌鐢≦TFTP鎻愪緵鐨勪笅杞藉嚱鏁幫紝閫愪釜鎴栨壒閲忎笅杞芥枃浠跺拰鏂囦歡澶廣傛枃浠跺す錛堜篃縐頒負鐩褰曪級鏄璁$畻鏈虹郴緇熶腑鐢ㄤ簬緇勭粐鍜屽瓨鍌ㄦ枃浠剁殑涓縐嶅瑰櫒錛屽寘鍚鍏朵粬鏂囦歡澶瑰拰鏂囦歡錛屼互褰㈡垚灞傛$粨鏋勬潵緇勭粐鍜岀$悊鏂囦歡銆
B. Qt網路編程:QHostAddress、QNetworkAddressEntry、QNetworkProxy
QHostAddress(主機地址)
QHostAddress 以平台和協議獨立的方式保存IPv4 或IPv6 地址。通常與QTcpSocket、QTcpServer和QUdpSocket一起使用,用於連接到主機或設置伺服器。
特殊地址類型包括:Any,表示IPv4、IPv6任意地址,綁定此地址的socket將同時監聽IPv4和IPv6介面。
轉換模式類型為:ConvertUnspecifiedAddress,所有未指定的地址視為相等,即AnyIPv4、AnyIPv6和Any。
QHostAddress成員函數包括:clear()、isBroadcast()、isEqual()、isGlobal()、isInSubnet()、isLinkLocal()、isLoopback()、isMulticast()、isNull()、isUniqueLocalUnicast()和parseSubnet()等,分別用於清空、判斷廣播地址、比較地址、確認全局地址、檢查子網、識別鏈路本地、環回地址、多播地址、空地址和唯一本地單播地址。
QNetworkAddressEntry(網路地址條目)
QNetworkAddressEntry封裝了網路介面的數據,每個介面可以包含多個IP地址,並可關聯網路掩碼和廣播地址。
DnsEligibilityStatus枚舉指示主機地址是否符合DNS或其他域名解析機制的發布條件。
成員函數包括:broadcast()、clearAddressLifetime()、dnsEligibility()、ip()、isLifetimeKnown()、isPermanent()、isTemporary()、netmask()、preferredLifetime()、prefixLength()和validityLifetime()等,分別用於返回廣播地址、重置地址生命周期、獲取DNS資格狀態、獲取IP地址、確認地址生命周期已知、確定地址是否永久、識別臨時地址、獲取網路掩碼、返回首選生命周期、獲取前綴長度和返回有效生命周期。
QNetworkProxy(網路代理)
QNetworkProxy提供Qt網路類配置網路層代理支持的方法,支持SOCKS5代理協議,包括身份驗證和IPV4/IPV6。
SOCKS5支持功能有:TunnelingCapability(隧道功能)、ListeningCapability(監聽功能)、UdpTunnelingCapability(UDP隧道功能)和HostNameLookupCapability(主機名查找功能)。
HTTP代理支持身份驗證和TCP連接,具備TunnelingCapability和HostNameLookupCapability。
Caching-only HTTP和Caching FTP僅在HTTP和FTP請求中有效,支持CachingCapability和HostNameLookupCapability。
QNetworkProxy成員函數包括:applicationProxy()、hasRawHeader()、header()、isCachingProxy()、isTransparentProxy()和setApplicationProxy()等,分別用於獲取應用程序級網路代理、檢查請求頭是否用於代理、獲取已知網路請求頭值、確認是否支持緩存功能、判斷是否支持隧道功能、設置應用程序級網路代理。
C. 用QT編程,如何實現軟體自動更新
跟QT沒什麼關系,實現自動更新主要有以下幾個步驟:
實現一個更新伺服器。
在你的軟體里按照自定義的規則設計一個版本號。
每次你更新軟體過後在更新伺服器端留存你更新的版本號,並記錄每次更新後有哪些組件進行了更新。
在你的軟體每次啟動的時候訪問伺服器,獲取最新的版本號並與本地的軟體版本號進行對比,如果本地版本號更低則查詢有哪些組件進行了更新,並從更新伺服器端進行下載並更改過的組件並自動覆蓋。
普通的軟體更新流程大概就是這樣了,你問這個問題說明你多半沒學習過伺服器編程的相關內容,所以建議你先去選擇一個常見的架構學習一下,自然就會了。
D. Qt三種方式實現FTP上傳功能
FTP協議是用於文件傳輸的一種協議,簡稱「文件傳輸協議」,屬於TCP/IP協議組的一部分,適用於在互聯網上傳輸大文件。FTP協議有主動模式和被動模式兩種,本文僅作簡要介紹。
實現Qt項目中FTP上傳功能,主要有三種方式:Qt4 QFtp、Qt5 QNetworkAccessManager和POCO中的FTPClientSession。
1. Qt4 QFtp:為Qt4專設的FTP傳輸類,包含了創建目錄、刪除目錄、刪除文件、獲取文件列表、上傳、下載等常規操作介面。然而,由於Qt5棄用了該模塊,轉而使用QNetworkAccessManager。
2. Qt5 QNetworkAccessManager:是Qt中的網路請求模塊,包含HTTP的post、get和put操作,適用於Qt5中實現FTP上傳功能。但不支持FTP創建目錄、刪除目錄、刪除文件、獲取文件列表等功能,僅限上傳和下載操作。
3. POCO FTPClientSession:POCO網路模塊內的FTP實現類,提供了創建目錄、刪除目錄、刪除文件、獲取文件列表等介面。其功能基本涵蓋了所有FTP上傳需求。
三種方式各有優缺點,使用過程中面臨各種問題。下面對比分析:
1. QFtp:雖然功能全面,但在Qt5中被廢棄,需要自行編譯源碼,可能遇到編碼問題。優點在於介面完整、使用方便;缺點是編碼和異常處理復雜,尤其在網路中斷時,無法及時反饋異常信號。
2. QNetworkAccessManager:操作簡單、集成度高,異常處理友好,斷網後能及時反饋,支持超時後繼續上傳,提高了開發效率。但功能較為單一,僅限於上傳下載操作。
3. FTPClientSession:使用簡單、介面完整,異常處理通過拋出異常實現,如刪除不存在的文件夾、創建已存在的文件夾等。缺點在於沒有提供上傳下載進度介面或回調,計算進度較為繁瑣。網路異常處理不夠友好。
FTPClientSession在獲取伺服器文件列表時,若文件名包含空格,會導致文件名分段,影響文件列表的正確讀取。與QFtp相比,FTPClientSession的文件上傳默認方式為二進制流,而QFtp和FTPClientSession允許調整上傳方式,QNetworkAccessManager默認使用二進制流上傳,可能導致文件大小變化,這是一個重要的問題。
就實際使用經驗而言,QFtp相對更適合,能滿足需求,但需自行處理異常情況。
本文僅概述三種實現方式的優缺點,後續文章將詳細介紹如何使用這些方法,並展示在實際代碼中遇到的各種問題。
E. qt實現ftp創建文件夾命令
本文實例為大家分享了QT實現FTP上傳文件的具體代碼,供大家參考,具體內容如下
兩台電腦通過網線建立本地連接,保證網關在同一段;
伺服器端打開ftp;
控制面板→程序→啟用或關閉windows功能→windows功能→Internet信息服務
啟用「FTP服務」FTP擴展性」 IIS管理控制台」
開始屏幕的搜索中輸入「IIS」,然後點擊打開「IIS管理器」
打開「IIS管理器」後,在左欄的「網站」上點擊右鍵,打開「添加FTP站點」
然後按照提示填寫站點信息
點擊「下一步」,按照下圖提示,設置「綁定和SSL設置」,在「IP地址」處,可以用內網IP也可以用外網IP,訪客自然也就根據你的IP設定來決定;
點擊「下一步」,設置「身份驗證和授權信息」
然後在本機瀏覽器地址欄中輸入「ftp://填寫的IP」測試一下
客戶端網頁測試遠程訪問;
客戶端(另一台電腦)瀏覽器地址欄中輸入「ftp://填寫的IP」測試一下
客戶端cmd測試遠程訪問;
win+r打開運行窗口,輸入cmd
回車打開cmd命令窗口
cmd命令中輸入:ftp回車
回車切換至ftp命令窗口,輸入命令:open,回車提示:到
到即所要連接測試的ftp地址,我們輸入:IP 22
即:ip地址+空格+埠號,沒有+號
回車後彈出用戶一行,輸入ftp的用戶名後回車,輸入ftp用戶名對應的密碼
輸入密碼後回車,如果提示,user logged in就說么ftp創建無問題
客戶端程序測試遠程訪問。
新建程序,添加ftpclass.cpp、ftpclass.h,復制main.cpp內容到程序入口函數
注意:/項目-屬性-常規-字元集-使用多位元組字元集/
//main.cpp
#include "stdafx.h"
#include "ftpclass.h"
void main()
{
printf("------- 開始測試!------\n");
printf("01--創建連接 %d\n", FtpClass::createConnection());
printf("02--打開目標ftp %d\n", FtpClass::createTable());
/*可以讀取ini內參數
FtpClass::ftp_Ip = TEXT("Ini讀取");
FtpClass::ftp_Port = TEXT("Ini讀取");
FtpClass::ftp_User = TEXT("Ini讀取");
FtpClass::ftp_Password = TEXT("Ini讀取");
FtpClass::ftp_Fixed_Path = TEXT("Ini讀取");*/
printf("03--創建文件夾 %d\n", FtpClass::createFolder("自動生成目錄1","自動生成目錄2","自動生成目錄3"));
/*上傳目標路徑*/
printf("04--上傳文件 %d\n", FtpClass::insert( "D:/a.txt", "b.txt"));
/*本機文件需要上傳文件*/ /*上傳後文件名稱,可以和本地文件名稱不一樣,類型最好別換*/
printf("05--關閉通訊 %d\n", FtpClass::createClose());
printf("------ 結束測試!------\n");
return ;
}
//ftpclass.h
/*項目-屬性-常規-字元集-使用多位元組字元集*/
/*wininet.lib、shlwapi.lib可以直接添加到附加依賴項*/
/*BOOL_VERIFY、NULL_VERIFY 程序結束判斷*/
#pragma once
#pragma comment(lib,"wininet.lib")
#pragma comment(lib,"shlwapi.lib")
#define BOOL_VERIFY(emStatus_bool,switch_bool) \
if (emStatus_bool == true)\
{return true;}\
else{\
if (switch_bool == 3) printf(" FTP_03_err:創建文件夾失敗!%d\n"); \
if (switch_bool == 4) printf(" FTP_04_err:上傳文件失敗!\n"); \
if (switch_bool == 5) printf(" FTP_05_err:關閉窗口句柄失敗!\n"); \
return false;\
}
#define NULL_VERIFY(emStatus_null,switch_null) \
if (emStatus_null != NULL)\
{return true;}\
else{\
if (switch_null == 1) {printf(" FTP_01_err:打開通訊錯誤 Error:%d\n", GetLastError());}\
if (switch_null == 2) {printf(" FTP_02_err:建立連接錯誤 Error:%d\n", GetLastError());}\
return false;\
}
#include "stdafx.h"//沒用
#include <afxinet.h>//MFC相關
#include "wininet.h"//調用FTP相關類
#include "shlwapi.h"//調用文件操作相關類
class FtpClass
{
public:
/*ini讀取變數*/
static CString ftp_Ip;//目標ip
static CString ftp_Port;//目標埠
static CString ftp_User;//目標賬戶
static CString ftp_Password;//目標密碼
static CString ftp_Fixed_Path;//目標固定路徑
static CString ftp_Free_Path;//目標自己生成路徑
/*全局變數*/
static BOOL pRes;
static HINTERNET hInternet;
static HINTERNET hConnect;
/*全局函數*/
static bool createConnection(); //創建一個連接
static bool createTable();
static bool ThreadInternetConnect(PVOID )
//打開目標ftp
static bool createFolder(CString temp1, CString temp2, CString temp3); //上傳文件
static bool insert(CString temp, CString temp1); //出入數據
static bool createClose(); //斷開連接
};
//ftpclass.cpp
#include "stdafx.h"
#include "ftpclass.h"
CString FtpClass::ftp_Ip = TEXT("192.168.3.104");
CString FtpClass::ftp_Port = TEXT("21");
CString FtpClass::ftp_User = TEXT("Administrator");
CString FtpClass::ftp_Password = TEXT("xinxin");
CString FtpClass::ftp_Fixed_Path = TEXT("1級固定目錄/2級固定目錄/3級固定目錄");
CString FtpClass::ftp_Free_Path = TEXT("自動生成目錄");
BOOL FtpClass::pRes = false;
HINTERNET FtpClass::hInternet = NULL;
HINTERNET FtpClass::hConnect = NULL;
//創建一個連接
bool FtpClass::createConnection() {
/*ftp_Ip = TEXT("Ini讀取");
ftp_Port = TEXT("Ini讀取");
ftp_User = TEXT("Ini讀取");
ftp_Password = TEXT("Ini讀取");
ftp_Fixed_Path = TEXT("Ini讀取");*/
hInternet = InternetOpen(NULL, INTERNET_OPEN_TYPE_DIRECT,
NULL, NULL, INTERNET_FLAG_NO_CACHE_WRITE);
NULL_VERIFY(hInternet,1);
}
bool FtpClass::ThreadInternetConnect(PVOID param) {
// 打開http
hConnect = InternetConnect(hInternet, ftp_Ip, INTERNET_DEFAULT_FTP_PORT,//INTERNET_DEFAULT_FTP_PORT 第三個參數默認值21
ftp_User, ftp_Password, INTERNET_SERVICE_FTP,
INTERNET_FLAG_EXISTING_CONNECT || INTERNET_FLAG_PASSIVE, 0);
return 1;
}
//打開目標ftp
bool FtpClass::createTable()
{
/*hConnect = InternetConnect(hInternet, ftp_Ip, 25,//INTERNET_DEFAULT_FTP_PORT 第三個參數默認值21
ftp_User, ftp_Password, INTERNET_SERVICE_FTP,
INTERNET_FLAG_EXISTING_CONNECT || INTERNET_FLAG_PASSIVE, 0);
NULL_VERIFY(hConnect,2);*/
HANDLE hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThreadInternetConnect, (LPVOID)NULL, 0, NULL);
//超時3秒,如果等待結果是超時
if (WaitForSingleObject(hThread, 3 * 1000) == WAIT_TIMEOUT) {
TerminateThread(hThread, 0);
CloseHandle(hThread);
NULL_VERIFY(hConnect, 2);
}
NULL_VERIFY(hConnect, 2);
}
//上傳文件
bool FtpClass::createFolder(CString temp1, CString temp2, CString temp3)
{
/*新建文件件每次只能創建一級,多個需要分多次創建*/
pRes = false;
ftp_Free_Path = "";
ftp_Free_Path = ftp_Fixed_Path + "/" + temp1;
FtpCreateDirectory(hConnect, ftp_Free_Path);
ftp_Free_Path = ftp_Free_Path + "/" + temp2;
FtpCreateDirectory(hConnect, ftp_Free_Path);
ftp_Free_Path = ftp_Free_Path + "/" + temp3;
pRes = FtpCreateDirectory(hConnect, ftp_Free_Path);
BOOL_VERIFY(pRes,3);
}
//出入數據
bool FtpClass::insert(CString temp, CString temp1)
{
pRes = false;
ftp_Free_Path = ftp_Free_Path + "/" +temp1;
pRes = FtpPutFile(hConnect, temp,/*本機文件*/
ftp_Free_Path, /*TEXT("一級目錄/二級目錄/三級目錄/a.txt"),*/
FTP_TRANSFER_TYPE_ASCII, 0);
BOOL_VERIFY(pRes,4);
}
//斷開連接
bool FtpClass::createClose()
{
pRes = false;
if (InternetCloseHandle(hConnect))
pRes = InternetCloseHandle(hInternet);
BOOL_VERIFY(pRes,5);
}
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。