FTP(文件傳輸協議)中的 STOR 命令是客戶端向服務器上傳文件的核心指令。本文系統講解 STOR 命令的工作流程、數據連接模式(主動/被動),並提供基於 C++ Socket 的完整上傳實現方案,幫助開發者快速掌握 FTP 協議編程精髓。
STOR <filename> 命令告訴服務器:「我要上傳一個文件,請準備接收」。完整流程包含三階段:
PASV 進入被動模式(推薦,穿透防火牆),服務器返回 IP 和端口;或發送 PORT 指定主動模式端口。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);
OPTS UTF8 ON)或雙方約定編碼。REST 命令實現斷點續傳,上傳前發送 REST <offset>。libcurl、Poco::Net::FTPClientSession,避免重複造輪子。完整項目代碼與詳細註釋可參考:CSDN 專欄實戰教程,涵蓋主動/被動模式切斷、大文件分塊傳輸、進度條顯示等企業級特性。