国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

windows下C語言使用curl庫訪問HTTP下載文件

DS小龍哥-嵌入式技術 ? 2022-09-17 15:57 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

【摘要】 cURL是一個利用URL語法在命令行下工作的文件傳輸工具,1997年首次發行。它支持文件上傳和下載,所以是綜合傳輸工具,但按傳統,習慣稱cURL為下載工具。cURL還包含了用于程序開發的libcurl。

一、前言

cURL是一個利用URL語法在命令行下工作的文件傳輸工具,1997年首次發行。它支持文件上傳和下載,所以是綜合傳輸工具,但按傳統,習慣稱cURL為下載工具。cURL還包含了用于程序開發的libcurl。

cURL支持的通信協議有FTP、FTPS、HTTP、HTTPS、TFTP、SFTP、Gopher、SCP、Telnet、DICT、FILE、LDAP、LDAPS、IMAP、POP3、SMTP和RTSP。

curl還支持SSL認證、HTTP POST、HTTP PUT、FTP上傳, HTTP form based upload、proxies、HTTP/2、cookies、用戶名+密碼認證(Basic, Plain, Digest, CRAM-MD5, NTLM, Negotiate and Kerberos)、file transfer resume、proxy tunneling。

二、curl下載

curl for windows : https://curl.se/windows/

下載頁面如圖:

image-20220513134431494image-20220513134501163

解壓后的可執行文件位置:

image-20220513134530563

下面是解壓后的文件目錄:

image-20220513134631915

在命令行使用curl測試下載文件:

image-20220513134729784

三、通過命令行使用curl

curl可以直接調用函數庫完成功能設計、也可以直接調用可執行文件完成需要的功能,下面這里就介紹,在windows下,通過CreateProcess調用curl命令函數完成文件下載。使用curl實現HTTP協議文件下載成功,通過給定的連接地址,可以完成文件下載,百分比進度返回等等。

/**************************************************作者: DS小龍哥功能: 執行命令參數解釋:CallBackFunction_p func_p  :回調函數,用于通知進度執行過程char *text  //進度的轉碼過程,詳細描述.描述當前這個操作是做什么.char *total_time   //執行的總時間char *cmd //執行的命令**************************************************/int file_down_func(CallBackFunction_p func_p, const char *text, const char *total_time, const  char *cmd){		BOOL run_pipe;		PROCESS_INFORMATION pi;		STARTUPINFO si;		BOOL ret = FALSE;		DWORD flags = CREATE_NO_WINDOW;		char pBuffer[210];		SECURITY_ATTRIBUTES sa;		sa.nLength = sizeof(SECURITY_ATTRIBUTES);		sa.lpSecurityDescriptor = NULL;		sa.bInheritHandle = TRUE;		HANDLE hReadPipe, hWritePipe;		run_pipe = CreatePipe(&hReadPipe, &hWritePipe, &sa, 0);		if (run_pipe != 1)		{			printf("創建匿名管道文件失敗=%d\n", run_pipe);			return -1;		}		ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));		ZeroMemory(&si, sizeof(STARTUPINFO));		si.cb = sizeof(STARTUPINFO);		si.dwFlags |= STARTF_USESTDHANDLES;		si.hStdInput = NULL;		si.hStdError = hWritePipe;		si.hStdOutput = hWritePipe;		wchar_t cmd_wchar[1024];		CharToWchar(cmd, cmd_wchar);		//TCHAR cmd[] = TEXT("ffmpeg -i D:\\123.mp4 -vf reverse D:\\out\\out1.mp4");		ret = CreateProcess(NULL, cmd_wchar, NULL, NULL, TRUE, flags, NULL, NULL, &si, &pi);		if (ret)		{			while (true)			{				DWORD ExitCode = 0;				//判斷進程是否執行結束				printf("正在執行...GetExitCodeProcess\r\n");				GetExitCodeProcess(pi.hProcess, &ExitCode);				printf("ExitCode:%d\r\n", ExitCode);				if (ExitCode == STILL_ACTIVE) //正在運行				{					DWORD RSize = 0;					BOOL run_s = 0;					printf("正在執行...ReadFile\r\n");					run_s = ReadFile(hReadPipe, pBuffer, sizeof(pBuffer), &RSize, NULL);					pBuffer[RSize - 1] = '\0';					printf("執行過程:%s,%d,%d,%s\n", version_str, run_s, RSize, pBuffer);					char number_buff[10]="\0"; //存放百分比					printf("pBuffer=%s\r\n", pBuffer);					//通過回調函數向外部返回進度提示					for (size_t i = 0; i < 10 && pBuffer[i]!='\0'; i++)					{						if (pBuffer[i] >= '0' && pBuffer[i] <= '9')						{							//得到百分比值							for (size_t j = 0; j < 9 && pBuffer[i+j] != '\0'; j++)							{								//printf("@@%c@@\r\n", pBuffer[i + j]);								if (pBuffer[i+j] >= '0' && pBuffer[i+j] <= '9')								{									number_buff[j] = pBuffer[i + j];								}								else								{									number_buff[j] = '\0';									break;								}							}							break;						}					}					//  0  926M    0 6463k    0     0  7378k      0  0:02:08 --:--:--  0:02:08 7386					//如果找到進度的位置					if (strlen(number_buff)>0)					{						std::string  out_str;						out_str = text;						out_str += ",";						out_str += "100";						out_str += ",";						out_str += number_buff;						printf("回調:%s\r\n", out_str.c_str());						//將執行的結果再回調出去						if (func_p)						{							func_p(out_str.c_str());						}					}				}				else //結束				{					printf("執行完畢,ExitCode=%d\r\n", ExitCode);					break;				}			}			printf("正在等待子進程結束....\n");			//等待結束			WaitForSingleObject(pi.hProcess, INFINITE);			CloseHandle(pi.hProcess);			CloseHandle(pi.hThread);			printf("子進程執行完畢....\n");			return 0;		}		printf("子進程創建失敗:%d\n", ret);	return -1;}int main(){    	string VideoCacheFilePath = "D:\\out";	//下載的文件名稱	string file_path = "http://192.168.1.110:8001/Uploads/1/哈哈哈.MP4";	//如果返回為真就表示是網絡地址	if (strstr(file_path.c_str(), "http:") ||		strstr(file_path.c_str(), "https:"))	{		//1.獲取不帶路徑的文件名		string::size_type iPos;		if (strstr(file_path.c_str(), "\"))		{			iPos = file_path.find_last_of('\\') + 1;		}		else		{			iPos = file_path.find_last_of('/') + 1;		}		//得到文件名稱		string base_file = file_path.substr(iPos, file_path.length() - iPos);		//得到完整的文件下載存儲路徑		string VideoPath_tmp = VideoCacheFilePath;		VideoPath_tmp += "\";		VideoPath_tmp += base_file;		//判斷文件是否存在		printf("文件存儲路徑:%s\r\n", VideoPath_tmp.c_str());		FILE *file_p = fopen(VideoPath_tmp.c_str(),"rb");		//不存在就下載		if (file_p == nullptr)		{			//切換目錄,進入到curl命令所在的目錄			_chdir(VideoCacheFilePath.c_str());			string cmd = "curl -O ";			cmd += file_path;			//啟動下載文件			file_down_func(NULL, base_file.c_str(),"100",cmd.c_str());		}		else		{			printf("文件存在不需要下載.\r\n");			fclose(file_p);		}	}	return 0;}
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • C語言
    +關注

    關注

    183

    文章

    7644

    瀏覽量

    145601
  • HTTP
    +關注

    關注

    0

    文章

    537

    瀏覽量

    35374
  • URL
    URL
    +關注

    關注

    0

    文章

    142

    瀏覽量

    16224
  • Curl
    +關注

    關注

    0

    文章

    17

    瀏覽量

    8636
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    curl中的TFTP實現:整數溢導致堆內存越界讀取漏洞

    各部分長度相加后再與緩沖區大小進行比較,從根本上杜絕了整數溢的可能性。同時,sbytes 的計算也改為基于 curl_msnprintf 的實際返回值,更加準確和安全。FINISHED biOK/hzhVF2yKaGc5mK8oeejIYuUYW8I3RsXQCFCiX
    發表于 02-19 13:55

    請問如何實現C語言訪問MCU寄存器?

    單片機的特殊功能寄存器SFR,是SRAM地址已經確定的SRAM單元,在C語言環境對其訪問歸納起來有兩種方法。 采用標準C的強制類型轉換和指
    發表于 12-26 07:00

    C語言特性

    1、高效性:直接操作硬件 C 語言代碼的執行效率極高,這是其最為顯著的優勢之一。它能夠直接訪問硬件資源,與底層硬件進行緊密交互,充分發揮硬件的性能潛力。在嵌入式開發中,硬件資源往往十分有限,對程序
    發表于 11-24 07:01

    C語言和單片機C語言有什么差異

    匯編語言機器才能讀懂,所以每個平臺的編譯器編譯成對應平臺匯編的程序,每個平臺的匯編不一樣,當然編譯器也不一樣。 DOS上的TC2 TC3 WINDOWS上的VC 8051的C51都有自已的編譯器。具體
    發表于 11-14 07:55

    windows環境如何生成bitstream文件

    system.org我明白這個是E203的頂層文件,但是不知道在windows環境這個文件該怎么使用
    發表于 11-06 06:18

    YModem下載文件到U盤失敗,文件0字節,是哪里的問題?

    failed. 2)通過Ymodem往U盤下載文件失敗,(正常結束,U盤文件長度0字節,然后訪問U盤報錯 [E/usbh_msc] cbw transfer error usb mass_storage
    發表于 10-11 10:39

    HTTP開發必備:核心與httpplus擴展應用示例全攻略

    HTTP開發的必備參考!本文匯總核心基礎操作與httpplus擴展高級特性,通過示例解析,讓你快速上手各類HTTP開發需求。
    的頭像 發表于 09-20 15:19 ?3198次閱讀
    <b class='flag-5'>HTTP</b>開發必備:核心<b class='flag-5'>庫</b>與httpplus擴展<b class='flag-5'>庫</b>應用示例全攻略

    【HZ-T536開發板免費體驗】3 - Cangjie Magic調用視覺語言大模型(VLM)真香,是不是可以沒有YOLO和OCR了?

    ,但是交叉編譯所需要的aarch64版本還需要手工下載訪問stdx的主頁,點擊右側的“發行版”,找到最新的版本,在其中現在aarch64的文件(例如
    發表于 08-01 22:15

    數據數據恢復—MongoDB數據庫文件丟失的數據恢復案例

    MongoDB數據數據恢復環境: 一臺操作系統為Windows Server的虛擬機上部署MongoDB數據。 MongoDB數據故障: 工作人員在MongoDB服務仍
    的頭像 發表于 07-01 11:13 ?642次閱讀
    數據<b class='flag-5'>庫</b>數據恢復—MongoDB數據<b class='flag-5'>庫文件</b>丟失的數據恢復案例

    Windows環境32位匯編語言中文資料

    電子發燒友網站提供《Windows環境32位匯編語言中文資料.rar》資料免費下載
    發表于 06-30 15:14 ?0次下載

    提高篇——C語言核心技術(中文版)

    嚴謹的術語表介紹C語言;第二部分描述標準鏈接;第三部分介紹GNU軟件包中常用的編譯和測試工具。 獲取完整文檔資料可下載附件哦!!!!如果內容有幫助可以關注、點贊、評論支持一
    發表于 06-13 16:39

    3D AD文件

    3D文件
    發表于 05-28 13:57 ?6次下載

    PCB標準封裝文件

    PCB標準封裝文件
    發表于 05-22 17:43 ?10次下載

    C語言的歷史及程序介紹

    電子發燒友網站提供《C語言的歷史及程序介紹.pdf》資料免費下載
    發表于 04-09 16:10 ?0次下載

    數據數據恢復——MongoDB數據庫文件拷貝后服務無法啟動的數據恢復

    MongoDB數據數據恢復環境: 一臺Windows Server操作系統虛擬機上部署MongoDB數據。 MongoDB數據故障: 管理員在未關閉MongoDB服務的
    的頭像 發表于 04-09 11:34 ?867次閱讀
    數據<b class='flag-5'>庫</b>數據恢復——MongoDB數據<b class='flag-5'>庫文件</b>拷貝后服務無法啟動的數據恢復