【學習筆記】FTP庫函數學習

【學習筆記】FTP庫函數學習

FTP基本指令步驟

1、初始化會話句柄:CURL *curl = curl_easy_init();

2、設置會話選項: 設置服務器地址,設置登錄用戶和密碼

curl_easy_setopt(curl, CURLOPT_URL, ftp_server);

curl_easy_setopt(curl, CURLOPT_USERNAME, user);

curl_easy_setopt(curl, CURLOPT_PASSWORD, pass);

啟用被動模式(兼容性更好)

curl_easy_setopt(curl, CURLOPT_FTP_USE_EPSV, 1L);

開啟調試模式,查看詳細交互

curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);

3、執行會話操作:CURLcode res = curl_easy_perform(curl);

注意:執行會話操作之前,可以將要執行的命令先放到命令序列中,先放先執行。命令序列:struct curl_slist *cmd_list = NULL

 12     char cwd_cmd[256];    // 切換目錄命令 13     char delete_cmd[256]; // 刪除文件命令24     // 構建切換目錄命令(CWD)和刪除命令(DELE) 25     snprintf(cwd_cmd, sizeof(cwd_cmd), "CWD %s", target_dir); 26     snprintf(delete_cmd, sizeof(delete_cmd), "DELE %s", filename); 40     // 添加命令序列:先切換目錄,再刪除文件 41     cmd_list = curl_slist_append(cmd_list, cwd_cmd);    // 第一步:切換到目標目錄 42     cmd_list = curl_slist_append(cmd_list, delete_cmd); // 第二步:刪除文件 43     curl_easy_setopt(curl, CURLOPT_POSTQUOTE, cmd_list); 44  45     // 執行操作 46     res = curl_easy_perform(curl); 

4、釋放會話資源:curl_easy_cleanup(curl); // 釋放資源,避免內存泄漏

注意:在大型項目中,curl_global_init 只需要調用一次,且應放在程序生命周期的早期(初始化階段),配合 curl_global_cleanup 在程序退出時釋放資源。

FTP基本指令&日志

服務器日志:

-virtual-machine:/var/log$ sudo tail -f /var/log/vsftpd.log

查看服務器是否開啟:

sudo systemctl status vsftpd

重啟服務器服務:

sudo systemctl restart vsftpd

重啟之后可以查看日志:

sudo journalctl -u vsftpd.service # 查看vsftpd的詳細日志

手動運行查看錯誤日志:

sudo /usr/sbin/vsftpd /etc/vsftpd.conf

防火墻對某個端口的處理:

-virtual-machine:/etc$ sudo ufw status | grep 59924

系統對某個端口的監聽:

-virtual-machine:/etc$ sudo netstat -tunlp | grep 59924

開放端口:開放端口: sudo ufw allow 123/udp sudo ufw reload

##注意事項:

1、配置文件注意事項:/etc/vsftpd.conf文件中不可以有多余的空格,都則編譯報錯。

2、查看防火墻開放的端口,確保被動模式下服務器開的端口范圍都是開放的:sudo ufw status

3、一般采用被動模式:客戶端自己給一個端口去連接服務器,服務器支持被動模式,并且需要開放一定數量的端口來做交互。就是上面所說的防火墻開放的50000:50010端口。

工作原理

  • 客戶端連接到服務器的 21 端口(默認的控制連接端口)。
  • 服務器返回狀態碼 220,表示服務已就緒。
  • 客戶端發送用戶名(USER 命令),服務器返回 331,表示需要密碼。
  • 客戶端發送密碼(PASS 命令),服務器返回 230,表示登錄成功。

FTP 支持兩種模式傳輸文件:

  • 主動模式:服務器主動連接到客戶端的數據端口。
  • 被動模式:客戶端連接到服務器的數據端口。

測試

登錄測試:

#include <stdio.h>
#include "curl.h"// 回調函數:處理服務器返回的信息(如登錄成功提示)
size_t ftp_response_callback(void *contents, size_t size, size_t nmemb, void *userp) {size_t realsize = size * nmemb;printf("服務器響應: %.*s\n", (int)realsize, (char *)contents);return realsize;
}// FTP登錄函數
int ftp_login(const char *server_ip, const char *username, const char *password) {CURL *curl;CURLcode res;char ftp_url[128];// 初始化libcurlcurl_global_init(CURL_GLOBAL_DEFAULT);curl = curl_easy_init();if (curl) {// 構建FTP服務器URL(僅登錄,不操作文件)snprintf(ftp_url, sizeof(ftp_url), "ftp://%s/", server_ip);// 設置FTP服務器地址curl_easy_setopt(curl, CURLOPT_URL, ftp_url);// 設置登錄用戶名和密碼curl_easy_setopt(curl, CURLOPT_USERNAME, username);curl_easy_setopt(curl, CURLOPT_PASSWORD, password);// 啟用被動模式(EPSV 是現代被動模式,優先使用)curl_easy_setopt(curl, CURLOPT_FTP_USE_EPSV, 1L);// 設置服務器響應的回調函數(用于顯示登錄結果)curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, ftp_response_callback);// 啟用詳細輸出(可選,用于調試)curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);// 執行登錄操作(本質是建立連接并驗證身份)printf("正在連接到FTP服務器: %s...\n", server_ip);res = curl_easy_perform(curl);// 檢查登錄結果if (res != CURLE_OK) {fprintf(stderr, "登錄失敗: %s\n", curl_easy_strerror(res));curl_easy_cleanup(curl);curl_global_cleanup();return 1;} else {printf("登錄成功!已連接到FTP服務器: %s\n", server_ip);}// 清理資源curl_easy_cleanup(curl);}curl_global_cleanup();return 0;
}int main() {// 你的FTP服務器信息(與命令行登錄一致)const char *server_ip = "";  // 服務器IPconst char *username = "";       // 用戶名const char *password = “";    // 密碼// 執行FTP登錄if (ftp_login(server_ip, username, password) != 0) {printf("FTP登錄過程失敗\n");return 1;}return 0;
}

刪除文件:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <curl/curl.h>// 登錄FTP,切換到指定目錄并刪除文件
int ftp_cd_and_delete(const char *ftp_server, const char *target_dir, const char *filename, const char *user, const char *pass) {CURL *curl = NULL;CURLcode res;struct curl_slist *cmd_list = NULL;char cwd_cmd[256];    // 切換目錄命令char delete_cmd[256]; // 刪除文件命令// 初始化libcurlcurl_global_init(CURL_GLOBAL_DEFAULT);curl = curl_easy_init();if (!curl) {fprintf(stderr, "初始化curl失敗\n");return 1;}// 構建切換目錄命令(CWD)和刪除命令(DELE)snprintf(cwd_cmd, sizeof(cwd_cmd), "CWD %s", target_dir);snprintf(delete_cmd, sizeof(delete_cmd), "DELE %s", filename);printf("準備執行切換目錄命令: %s\n", cwd_cmd);printf("準備執行刪除命令: %s\n", delete_cmd);// 設置FTP服務器地址(根目錄)curl_easy_setopt(curl, CURLOPT_URL, ftp_server);// 設置登錄信息curl_easy_setopt(curl, CURLOPT_USERNAME, user);curl_easy_setopt(curl, CURLOPT_PASSWORD, pass);// 啟用被動模式(兼容性更好)curl_easy_setopt(curl, CURLOPT_FTP_USE_EPSV, 1L);// 開啟調試模式,查看詳細交互curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);// 添加命令序列:先切換目錄,再刪除文件cmd_list = curl_slist_append(cmd_list, cwd_cmd);    // 第一步:切換到目標目錄cmd_list = curl_slist_append(cmd_list, delete_cmd); // 第二步:刪除文件curl_easy_setopt(curl, CURLOPT_POSTQUOTE, cmd_list);// 執行操作res = curl_easy_perform(curl);if (res != CURLE_OK) {fprintf(stderr, "操作失敗: %s\n", curl_easy_strerror(res));curl_slist_free_all(cmd_list);curl_easy_cleanup(curl);curl_global_cleanup();return 1;}// 清理資源curl_slist_free_all(cmd_list);curl_easy_cleanup(curl);curl_global_cleanup();return 0;
}int main() {// FTP服務器信息(請根據實際情況修改)const char *ftp_server = "";  // 服務器根目錄const char *target_dir = "";  // 目標目錄路徑const char *username = “";const char *password = "";const char *target_file = "";  // 要刪除的文件名// 步驟1:登錄FTP,切換到目標目錄,刪除文件printf("1. 正在登錄FTP服務器...\n");printf("2. 正在切換到目錄: %s\n", target_dir);printf("3. 正在刪除文件: %s\n", target_file);if (ftp_cd_and_delete(ftp_server, target_dir, target_file, username, password) != 0) {fprintf(stderr, "刪除操作失敗,程序退出\n");return 1;} else {printf("文件 %s 已成功刪除\n", target_file);}return 0;
}printf("3. 正在刪除文件: %s\n", target_file);if (ftp_cd_and_delete(ftp_server, target_dir, target_file, username, password) != 0) {fprintf(stderr, "刪除操作失敗,程序退出\n");return 1;} else {printf("文件 %s 已成功刪除\n", target_file);}return 0;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/92124.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/92124.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/92124.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ARM Cortex-M異常處理高級特性詳解

1. 異常處理概述 ARM Cortex-M處理器提供了高效的異常處理機制&#xff0c;包含多種硬件優化特性&#xff0c;顯著提升了中斷響應性能和系統效率。這些特性對于實時嵌入式系統和網絡協議棧&#xff08;如LwIP&#xff09;的性能至關重要。 1.1 Cortex-M異常處理架構 Cortex-M異…

【圖像算法 - 08】基于 YOLO11 的抽煙檢測系統(包含環境搭建 + 數據集處理 + 模型訓練 + 效果對比 + 調參技巧)

一、項目背景與需求 【打怪升級 - 08】基于 YOLO11 的抽煙檢測系統&#xff08;包含環境搭建 數據集處理 模型訓練 效果對比 調參技巧&#xff09;今天我們使用YOLO11來訓練一個抽煙檢測系統&#xff0c;基于YOLO11的抽煙檢測系統。我們使用了大概兩萬張圖片的數據集訓練了…

vue2升級vue3中v-model的寫法改造

vue2選項式 <template><div><el-rowclass"group-title":title"$t(restore_default_parameters)">{{ $t(restore_default_parameters) }}</el-row><el-form-item :label"$t(restore_default_parameters)" class"…

5G-LEO 簡介

1. 什么是 5G-LEO 5G-LEO 指的是將 5G 新空口&#xff08;5G NR&#xff09;服務擴展到低軌衛星&#xff08;LEO&#xff09;上的非地面網絡&#xff08;NTN, Non-Terrestrial Network&#xff09;方案。通過在距地面約500–2 000 km 的低軌道衛星上部署通信載荷&#xff0c;5G…

【MCAL】AUTOSAR架構下SPI數據同步收發具體實現

目錄 前言 正文 1.依賴的SPI硬件特性 1.1. SPI時隙參數配置 1.2. SPI數據發送和接收模式 2.MCAL中的SPI配置 3.軟件的具體實現 3.1. Spi_SyncTransmit 3.2. Spi_lSyncTransmit 3.3. Spi_lSyncStartJob 3.4. Spi_lSyncTransmitData8Bit 3.5. Spi_lSynTransErrCheck …

SQL157 更新記錄(一)

描述現有一張試卷信息表examination_info&#xff0c;表結構如下圖所示&#xff1a;FiledTypeNullKeyExtraDefaultCommentidint(11)NOPRIauto_increment(NULL)自增IDexam_idint(11)NOUNI(NULL)試卷IDtagchar(32)YES(NULL)類別標簽difficultychar(8)YES(NULL)難度durationint(11…

懸賞任務系統小程序/APP源碼,推薦任務/發布任務/會員服務

1. 我們承諾及優勢本店源碼承諾&#xff1a;1&#xff09;. 店長親測 - 100%完整可運行2&#xff09;. 含詳細安裝文檔3&#xff09;. 支持二次開發定制4&#xff09;. 專業客服隨時解答5&#xff09;. 技術團隊保障質量2. 功能詳細說明主要功能 模塊 角色 解釋說明 用戶登錄和…

Ubuntu20.04系統上使用YOLOv5訓練自己的模型-1

在Ubuntu系統上使用YOLOv5訓練自己的模型&#xff0c;你需要遵循以下步驟。這里我將詳細說明如何從準備數據集到訓練模型的整個過程。 步驟 1: 安裝依賴項 首先&#xff0c;確保你的Ubuntu系統上安裝了Python、PyTorch和必要的庫。你可以使用以下命令安裝這些依賴項&#xff1a…

解決微信小程序中camera組件被view事件穿透觸發對焦以及camera的bindtap事件

view跟camera組件同級 不要用bind:tap和catch:tap 替換用catch:touchstart即可解決&#xff01; 如果你不放心&#xff0c;可以再加個透明蒙版&#xff0c;這樣就不會觸發了&#xff01;&#xff08;不加這個也行&#xff0c;但是必須要用catch:touchstart&#xff09;<!-- …

【Redis】移動設備離線通知推送全流程實現:系統推送服務與Redis的協同應用

在移動應用開發中&#xff0c;應用未啟動時的通知推送是提升用戶體驗的核心需求之一。當用戶未主動啟動 App 時&#xff0c;如何通過手機通知欄觸達用戶&#xff0c;確保關鍵信息&#xff08;如訂單提醒、系統警報&#xff09;不丟失&#xff1f;本文將嘗試解析從 系統推送服務…

WebView 中控制光標

在 WebView 中控制光標&#xff08;如移動焦點、獲取/設置光標位置、顯示/隱藏光標等&#xff09;需要根據具體場景和平臺&#xff08;Android/iOS/Web&#xff09;采用不同的方法。以下是常見場景的解決方案&#xff1a;一、Web 頁面中的光標控制&#xff08;JavaScript&#…

2025國賽數學建模C題詳細思路模型代碼獲取,備戰國賽算法解析——決策樹

2025國賽數學建模C題詳細思路模型代碼獲取見文末名片 決策樹算法&#xff1a;從原理到實戰&#xff08;數模小白友好版&#xff09; 1. 決策樹是什么&#xff1f;——用生活例子理解核心概念 想象你周末想決定是否去野餐&#xff0c;可能會這樣思考&#xff1a; 根節點&#xf…

從底層架構到多元場景:計算機構成與應用的深度剖析

一、引言1.1 研究背景與意義在當今數字化時代&#xff0c;計算機已成為推動社會進步和經濟發展的核心力量&#xff0c;其身影遍布生活、工作、學習的各個角落。從個人日常使用的筆記本電腦、智能手機&#xff0c;到企業運營中不可或缺的服務器、大型機&#xff0c;再到科研領域…

控制建模matlab練習08:根軌跡

此練習主要是&#xff1a;在matlab中繪制根軌跡的方法。 一、在matlab中建立對應系統 1、例如&#xff0c;對于如圖的反饋系統。 2、其中開環傳遞函數G(s)、閉環傳遞函數Gcl(s)。3、因此&#xff0c;其閉環傳遞函數的根軌跡&#xff0c;就可以直接在matlab中繪制出來。 4、直接…

【Spring Boot 快速入門】七、阿里云 OSS 文件上傳

這里寫自定義目錄標題準備阿里云 OSS參照官方 SDK 編寫入門程序案例數據準備案例集成阿里云 OSS前端測試代碼app.jsstyle.cssindex.html效果圖準備阿里云 OSS 注冊登錄阿里云&#xff0c;然后點擊控制臺&#xff0c;在左上角菜單欄搜索對象存儲 OSS&#xff0c;點擊并開通點擊…

分布式微服務--Nacos作為配置中心(二)

前言&#xff1a;Nacos 是什么&#xff1f; Nacos&#xff08;Naming and Configuration Service&#xff09;是阿里巴巴開源的一個更易于構建云原生應用的動態服務發現、配置管理和服務管理平臺。我們可以使用它&#xff1a; ?作為注冊中心&#xff08;服務發現&#xff09; …

家庭/公司內部網絡內網穿透:無公網IP怎么設置外網遠程訪問?

家庭寬帶內網穿透如何實現&#xff1f;需公網IP嗎&#xff1f;公司內部的網址服務怎么提供互聯網訪問&#xff1f;相信很多人都有遇到家庭網和公司內部網下&#xff0c;搭建了服務器&#xff0c;或網絡硬件設備&#xff0c;需要在異地遠程訪問使用的情況。家庭和公司內部寬帶內…

水庫防洪安全雨水情監測預警系統

水庫防洪安全雨水情監測預警系統是一種高度集成現代信息技術與水利工程管理的綜合性智能化管理平臺&#xff0c;該系統主要應用于水庫及其周邊流域的實時水情監測與預警工作。通過部署先進的傳感設備和監測網絡&#xff0c;該系統能夠全天候不間斷地采集水庫庫區及周邊區域的降…

【論文閱讀】Editing Large Language Models: Problems, Methods, and Opportunities

Editing Large Language Models: Problems, Methods, and Opportunities原文摘要研究背景與問題提出核心問題&#xff1a;盡管LLM已具備強大的能力&#xff0c;但如何長期維持其時效性并修正錯誤仍缺乏系統方法論。現狀&#xff1a;近年來&#xff0c;針對LLMs的模型編輯技術興…

金融數據可視化的強力引擎 —— QtitanDataGrid在金融行業的應用實踐

QtitanDataGrid是一款適用于Qt的商業化DataGrid 組件&#xff0c;它使得表格數據可以直接面向終端用戶。這個組件吸收了用戶界面結構顯示表格方面所有的現代化技術的精華&#xff0c;是目前Qt市場上唯一一款擁有如此高級功能和出色性能的網格組件。這個Qt數據網格組件使用純C創…