首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C++ FTP 協議實戰:基於 STOR 命令實現文件上傳功能詳解

     編輯:程式設計疑難解答

C++ 實現 FTP 文件上傳:STOR 命令深度解析與代碼實踐

FTP(文件傳輸協議)中的 STOR 命令是客戶端向服務器上傳文件的核心指令。本文系統講解 STOR 命令的工作流程、數據連接模式(主動/被動),並提供基於 C++ Socket 的完整上傳實現方案,幫助開發者快速掌握 FTP 協議編程精髓。

STOR 命令工作原理

STOR <filename> 命令告訴服務器:「我要上傳一個文件,請準備接收」。完整流程包含三階段:

  1. 控制連接建立:客戶端連接服務器 21 端口,完成用戶認證(USER/PASS)。
  2. 數據連接協商:客戶端發送 PASV 進入被動模式(推薦,穿透防火牆),服務器返回 IP 和端口;或發送 PORT 指定主動模式端口。
  3. 文件傳輸執行:發送 STOR filename,服務器回應 150 Opening data connection,隨後通過數據連接發送文件二進制內容,傳輸結束後服務器回應 226 Transfer complete。

關鍵代碼實現(核心邏輯)

// 1. 進入被動模式獲取數據端口
send(sockCtrl, "PASV\r\n", 6, 0);
recv(sockCtrl, buf, sizeof(buf), 0);
// 解析回應中的 IP 和端口 (格式: 227 Entering Passive Mode (h1,h2,h3,h4,p1,p2))
// 計算 dataPort = p1 * 256 + p2

// 2. 連接數據端口
SOCKET sockData = socket(AF_INET, SOCK_STREAM, 0);
connect(sockData, (sockaddr*)&dataAddr, sizeof(dataAddr));

// 3. 發送 STOR 命令
string cmd = "STOR " + filename + "\r\n";
send(sockCtrl, cmd.c_str(), cmd.length(), 0);
recv(sockCtrl, buf, sizeof(buf), 0); // 等待 150 回應

// 4. 讀取本地文件並發送
ifstream file(filename, ios::binary);
char buffer[4096];
while (file.read(buffer, sizeof(buffer)) || file.gcount() > 0) {
    send(sockData, buffer, file.gcount(), 0);
}
file.close();

// 5. 關閉數據連接,讀取 226 完成回應
closesocket(sockData);
recv(sockCtrl, buf, sizeof(buf), 0);

工程實踐注意事項

  • 編碼處理:文件名含中文時需協商 UTF-8(OPTS UTF8 ON)或雙方約定編碼。
  • 斷點續傳:結合 REST 命令實現斷點續傳,上傳前發送 REST <offset>。
  • 異常處理:網絡中斷、磁盤空間不足、權限拒絕等場景需捕獲並重試或回滾。
  • 第三方庫推薦:生產環境建議使用成熟庫如 libcurl、Poco::Net::FTPClientSession,避免重複造輪子。

參考資源

完整項目代碼與詳細註釋可參考:CSDN 專欄實戰教程,涵蓋主動/被動模式切斷、大文件分塊傳輸、進度條顯示等企業級特性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved