需求
用 C 語言實現 FTP 客戶端,用於文件傳輸與系統文件更新,要求點對點直連。
核心步驟
- 掌握 FTP 協議:RFC 959,理解命令通道(21 端口)與數據通道(主動模式 20 端口 / 被動模式隨機端口)雙通道機制,熟悉核心命令:
USER, PASS, TYPE, PASV, PORT, LIST, RETR, STOR, QUIT。
- Socket 編程基礎:阻塞/非阻塞模式,
select/poll/epoll 多路復用,TCP 粘包/拆包處理(FTP 命令以 \r\n 分隔)。
- 實現雙通道管理:
- 命令通道:持久連接,發送命令、接收應答碼(1xx/2xx/3xx/4xx/5xx)。
- 數據通道:每次傳輸前協商(
PASV 被動模式最通用,穿透防火牆),建立臨時連接傳輸文件內容,傳輸完畢關閉。
- 文件更新機制:
- 斷點續傳:
REST 命令指定偏移量。
- 完整性校驗:傳輸後對比 MD5/SHA256。
- 版本管理:服務端維護文件清單(JSON/XML),客戶端比對決定增量更新。
工程建議
- 不要重複造輪子:優先使用成熟庫
libcurl(支持 FTP/FTPS/SFTP,跨平台,穩健)。
- 若必須自寫:模塊化設計,分離協議解析、Socket 通信、文件業務邏輯。
- 充分測試:主動/被動模式、大文件、斷網重連、並發傳輸。
FTP 看似簡單,邊界情況極多,**生產環境強烈建議直接集成 libcurl**。