国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

c語言實(shí)現(xiàn)https客戶端 源碼+詳細(xì)注釋(OpenSSL下載,visual studio編譯器環(huán)境配置)

這篇具有很好參考價(jià)值的文章主要介紹了c語言實(shí)現(xiàn)https客戶端 源碼+詳細(xì)注釋(OpenSSL下載,visual studio編譯器環(huán)境配置)。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

OpenSSL的下載和環(huán)境配置

請參考:openssl下載安裝教程
步驟:官網(wǎng)下載->安裝到選定目錄->配置環(huán)境變量->打開命令窗口檢查是否安裝成功
注意:
打開命令窗口(快捷鍵win+r,在彈出窗口內(nèi)輸入cmd按回車),輸入命令openssl version如果顯示openssl版本則表示安裝成功。
我出現(xiàn)的問題:明明安裝上了卻顯示

B:>openssl version
‘openssl’ 不是內(nèi)部或外部命令,也不是可運(yùn)行的程序
或批處理文件。

解決方法:更改到lib目錄,輸入命令:

B:\OpenSSL-Win64\lib>openssl.exe

因?yàn)槲业陌姹緊penssl.exe文件在lib目錄下,可以在OpenSSL-Win64文件夾里直接搜索openssl.exe,就知道在哪個(gè)目錄下了。
運(yùn)行之后再輸入openssl version就會顯示版本,例:

B:\OpenSSL-Win64\bin>openssl version
OpenSSL 3.1.0 14 Mar 2023 (Library: OpenSSL 3.1.0 14 Mar 2023)

出現(xiàn)版本信息代表安裝成功。

visual studio項(xiàng)目環(huán)境配置

我使用visual studio2019版本,以下步驟僅供參考。
1.在屬性頁頂端右邊,把平臺改成x64(根據(jù)自己需要),點(diǎn)擊右側(cè)配置管理器按鈕,將此項(xiàng)目的平臺改成x64(根據(jù)自己需要)。
2.打開項(xiàng)目界面,在上方菜單欄選擇項(xiàng)目->屬性
3.在左側(cè)選擇VC++目錄,選擇包含目錄,編輯,粘貼openssl的include目錄的絕對路徑。

例如:B:\OpenSSL-Win64\include

選擇庫目錄,編輯,粘貼openssl的lib目錄的絕對路徑

例如:B:\OpenSSL-Win64\lib

4.選擇左側(cè)C/C++常規(guī),選擇附加包含目錄,編輯,粘貼openssl的include目錄的絕對路徑。

例如:B:\OpenSSL-Win64\include

5.選擇左側(cè)鏈接器,選擇下側(cè)輸入,選擇右側(cè)附加依賴項(xiàng),編輯,寫入libssl.lib,libcrypto.lib的路徑。在lib目錄中,打開自己下載的openssl文件夾看一下具體是哪個(gè)路徑,不同版本可能不同,我使用的版本是 3.1.0 14

例如:
B:\OpenSSL-Win64\lib\libssl.lib
B:\OpenSSL-Win64\lib\libcrypto.lib

注意:編譯器所有無法識別SSL…的問題都是環(huán)境沒配置好,再仔細(xì)看一下上述步驟,都是一步步配置過的,親測OK。

代碼實(shí)現(xiàn)

思路

c語言實(shí)現(xiàn)https客戶端 源碼+詳細(xì)注釋(OpenSSL下載,visual studio編譯器環(huán)境配置),c語言,c語言,https,visual studio,ssl

源碼

#include<stdio.h>
#include <winsock2.h>
#include <ws2tcpip.h> 
#include <openssl/ssl.h>
#pragma comment(lib, "Ws2_32.lib")
int main() {
	// 初始化 Winsock(windows套接字)
	/*WSADATA是windows API定義的一個(gè)結(jié)構(gòu),存儲關(guān)于winsock實(shí)現(xiàn)的詳細(xì)信息*/
	WSADATA wsaData;
	/*WSAStartup()這個(gè)函數(shù)用于初始化Winsock庫,
	MAKEWORD(2, 2)相當(dāng)于創(chuàng)建了一個(gè)對Winsock 2.2的版本請求,
	&wsaData用于將wsaData地址結(jié)構(gòu)傳入函數(shù)
	*/
	if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
		/*
		WSAStartup返回了一個(gè)非0的值則代表初始化失敗
		*/
		printf("WSAStartup failed\n");
		return 1;
	}
	printf("客戶端Winsock初始化成功\n");
	printf("————————————————————\n");
	//創(chuàng)建客戶端對象
	/*聲明一個(gè)整型變量socket_fd用來存儲套接字描述符
	*/
	int socket_fd;
	/*socket()函數(shù)用于創(chuàng)建一個(gè)新的套接字,
	AF_INET指定了地址族為ipv4,
	SOCK_STREAM指定了套接字類型為流式套接字,即TCP
	第三個(gè)參數(shù),通常用來指定協(xié)議
	*/
	if ((socket_fd = socket(AF_INET, SOCK_STREAM, 0))== 0){
		perror("socket failed");
		exit(EXIT_FAILURE);
	}
	/*聲明一個(gè)結(jié)構(gòu)體變量sock_addr,用于存儲套接字地址信息(IPv4)
	*/
	struct sockaddr_in sock_addr;	
	sock_addr.sin_family = AF_INET; //使用ipv4地址族
	/*htons() 函數(shù)用于將主機(jī)字節(jié)順序轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)順序,確保在不同架構(gòu)的計(jì)算機(jī)上,端口號的表示都是一致的。
	*/
	sock_addr.sin_port = htons(8080); //設(shè)置端口號為8080
	
	//設(shè)置網(wǎng)絡(luò)ip
	/*調(diào)用inet_pton()函數(shù)將字符串形式的IP地址轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)序的二進(jìn)制IP地址,
	并存儲到sock_addr.sin_addr中
	*/
	if (inet_pton(AF_INET, "192.168.1.128", &sock_addr.sin_addr) <= 0) {
		/*inet_pton()函數(shù)返回值如果小于等于零,表示轉(zhuǎn)換失敗*/
		perror("inet_pton() failed");
		exit(EXIT_FAILURE);
	}
	printf("創(chuàng)建客戶端對象成功,嘗試連接服務(wù)器\n");
	printf("————————————————————\n");
	//連接服務(wù)器
	if ((connect(socket_fd, (struct sockaddr*)&sock_addr, sizeof(sock_addr)) < 0)) {
		perror("connect failed\n");
		exit(EXIT_FAILURE);
	}
	printf("對服務(wù)器發(fā)起連接\n");

	//初始化openssl庫

	//SSL庫初始化
	SSL_library_init();
	//載入所有SSL算法
	SSLeay_add_ssl_algorithms();
	//載入所有SSL錯(cuò)誤消息
	SSL_load_error_strings();
	//創(chuàng)建SSL會話環(huán)境
	//使用 TLS_client_method() 函數(shù)創(chuàng)建了一個(gè) SSL 上下文結(jié)構(gòu)(SSL_CTX)
	/*TLS_client_method()
	const SSL_METHOD *TLS_client_method(void);
	函數(shù)的返回值用于指定SSL/TSL連接使用的方法,這個(gè)方法指定了客戶端如何與服務(wù)器端建立連接。
	通過調(diào)用該函數(shù),獲取一個(gè)用于SSL/TSL客戶端的SSL_METHOD結(jié)構(gòu),這個(gè)結(jié)構(gòu)被傳遞給SSL_CTX_new()函數(shù),用于創(chuàng)建SSL_CTX上下文對象。
	  SSL_CTX_new()
	  SSL_CTX *SSL_CTX_new(const SSL_METHOD *method);
	  根據(jù)指定的SSL/TLS方法創(chuàng)建一個(gè)SSL/TSL上下文對象,該上下文對象包含了SSL/TSL連接的所有配置信息,包括加密算法、證書、私鑰等。
	  若創(chuàng)建失敗返回NULL。
	*/
	SSL_CTX* pctxSSL = SSL_CTX_new(TLS_client_method());
	if (pctxSSL == NULL) {
		printf("error ssl_ctx_new\n");
		return -1;
	}
	/*
	基于之前創(chuàng)建的 SSL 上下文(SSL_CTX),創(chuàng)建了一個(gè) SSL 對象,該對象將使用指定的上下文對象來配置 SSL/TLS 連接
	*/
	SSL* psslSSL = SSL_new(pctxSSL);
	if (psslSSL == NULL) {
		printf("error ssl_new\n");
	}
	/*SSL_set_fd()函數(shù)用于將一個(gè)套接字文件描述符與SSL對象關(guān)聯(lián)起來,從而使SSL對象可以在該套接字上進(jìn)行SSL/TSL加密通信。
	*/
	SSL_set_fd(psslSSL, socket_fd);
	//使用之前創(chuàng)建的 SSL 結(jié)構(gòu)(SSL),建立了 SSL 連接。
	/*SSL_connect()函數(shù)嘗試與遠(yuǎn)程服務(wù)器建立安全連接。iErrorConnect表示連接的狀態(tài),如果連接失敗返回值小于零。
	*/
	INT iErrorConnect = SSL_connect(psslSSL);
	if (iErrorConnect < 0) {
		//打印錯(cuò)誤碼
		printf("error SSL_connect,iErrorConnect=%d\n", iErrorConnect);
		//打印當(dāng)前SSL連接所使用的加密算法
		/*SSL_get_cipher() 函數(shù)返回一個(gè)指向當(dāng)前 SSL 連接所使用的加密算法字符串的指針。
		*/
	}
	/*SSL_get_cipher() 函數(shù)返回一個(gè)指向當(dāng)前 SSL 連接所使用的加密算法字符串的指針。
	*/
	printf("SSL connection using:%s\n", SSL_get_cipher(psslSSL));

	//準(zhǔn)備http請求
	char http[] = "GET /index.html HTTP/1.1\r\nHost: 192.168.10.124:8080\r\nConnection: keep-alive\r\nCache-Control: max-age=0\r\nUpgrade-Insecure-Requests: 1\r\nMozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36\r\ntext/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9\r\nAccept-Encoding: gzip, deflate\r\nAccept-Language: zh-CN,zh;q=0.9\r\n\r\n";
	
	
	//通過SSL連接發(fā)送http get請求,發(fā)送成功則返回發(fā)送的字節(jié)數(shù),否則返回一個(gè)負(fù)值表示發(fā)送失敗
	/*SSL_write()函數(shù)用于在SSL連接上寫入數(shù)據(jù),將http中的數(shù)據(jù)寫入到與psslSSL相關(guān)的SSL連接中
	* 返回值小于零表示寫入失敗
	*/
	INT iErroeWrite = SSL_write(psslSSL,http,strlen(http));
	if (iErroeWrite<0) {
		printf("error SSL_write\n");
		return -1;
	}

	char buf[2048] = {0};
	/*
	
	*/
	INT iLength = 1;
	/*調(diào)用SSL_read函數(shù)從SSL連接中讀取數(shù)據(jù)
	第一個(gè)參數(shù):SSL連接對象
	第二個(gè)參數(shù):指向接收緩沖區(qū)的指針
	第三個(gè)參數(shù):緩沖區(qū)的大小
	函數(shù)返回讀取到的字節(jié)數(shù)
	*/
	while ((iLength=SSL_read(psslSSL,buf, sizeof(buf)))>=1) {
	}
		
	printf("讀取數(shù)據(jù)成功\n");
	printf("服務(wù)器端給出的回應(yīng)是%s\n", buf);
	//關(guān)閉SSL連接
	SSL_shutdown(psslSSL);
	//釋放SSL數(shù)據(jù)結(jié)構(gòu)
	SSL_free(psslSSL);
	//釋放SSL_CTX數(shù)據(jù)結(jié)構(gòu)
	SSL_CTX_free(pctxSSL);
	//關(guān)閉套接字
	closesocket(socket_fd);
	WSACleanup();
	return 0;
}

參考鏈接

1.c語言https實(shí)現(xiàn)客戶端
2.visual studio openssl環(huán)境配置
3.https協(xié)議詳解文章來源地址http://www.zghlxwxcb.cn/news/detail-853090.html

到了這里,關(guān)于c語言實(shí)現(xiàn)https客戶端 源碼+詳細(xì)注釋(OpenSSL下載,visual studio編譯器環(huán)境配置)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • (二) 用QWebSocket 實(shí)現(xiàn)服務(wù)端和客戶端(詳細(xì)代碼直接使用)

    目錄 前言 一、服務(wù)器的代碼: 1、服務(wù)器的思路 2、具體服務(wù)器的代碼示例 二、客戶端的代碼: 1、客戶端的思路(和服務(wù)器類似) 2、具體客戶端的代碼示例 前言 ????????要是想了解QWebSocket的詳細(xì)知識,還得移步到上一篇文章: WebSocket 詳解,以及用QWebSocket 實(shí)現(xiàn)服務(wù)端

    2024年01月20日
    瀏覽(24)
  • 基于智能手機(jī)的醫(yī)院服務(wù)客戶端設(shè)計(jì)與實(shí)現(xiàn)(論文+源碼)_kaic

    基于智能手機(jī)的醫(yī)院服務(wù)客戶端設(shè)計(jì)與實(shí)現(xiàn)(論文+源碼)_kaic

    摘 ?要 近年來,隨著中國經(jīng)濟(jì)的迅猛發(fā)展,醫(yī)療技術(shù)水平也在不斷提高,但由于人口數(shù)目巨大,導(dǎo)致醫(yī)療資源人均分配不足的情況依舊十分嚴(yán)峻。預(yù)約掛號一直是制約醫(yī)療機(jī)構(gòu)服務(wù)質(zhì)量提高的主要環(huán)節(jié)之一。在傳統(tǒng)預(yù)約掛號方式下,繁瑣的預(yù)約掛號流程和醫(yī)療信息不透明給就

    2024年02月13日
    瀏覽(18)
  • QT充當(dāng)客戶端模擬瀏覽器等第三方客戶端對https進(jìn)行雙向驗(yàn)證

    QT充當(dāng)客戶端模擬瀏覽器等第三方客戶端對https進(jìn)行雙向驗(yàn)證

    在 ssl單向證書和雙向證書校驗(yàn)測試及搭建流程 文章中,已經(jīng)做了基于https的單向認(rèn)證和雙向認(rèn)證,,, 在進(jìn)行雙向認(rèn)證時(shí),采用的是curl工具或?yàn)g覽器充當(dāng)客戶端去驗(yàn)證。 此次采用QT提供的接口去開發(fā)客戶端向服務(wù)器發(fā)送請求,來驗(yàn)證https的雙向認(rèn)證流程。 依然以 ssl單向證書

    2024年02月14日
    瀏覽(95)
  • opensssl BIO方式https客戶端

    廢話不多說,代碼中使用了兩種https客戶端的實(shí)現(xiàn)方式。

    2024年01月19日
    瀏覽(35)
  • TCP/IP C 語言實(shí)現(xiàn)單個(gè)客戶端和服務(wù)端 TCP 通信

    ?這是多線程服務(wù)端 這是單線程服務(wù)端? 這是客戶端 ?

    2024年02月21日
    瀏覽(21)
  • Linux系統(tǒng)編程,使用C語言實(shí)現(xiàn)簡單的FTP(服務(wù)器/客戶端)

    Linux系統(tǒng)編程,使用C語言實(shí)現(xiàn)簡單的FTP(服務(wù)器/客戶端)

    前言 跟著上官社長 陳哥花了一個(gè)月的時(shí)間終于把Linux系統(tǒng)編程學(xué)的差不多了,這一個(gè)月真的是頭疼啊,各種bug,調(diào)的真心心累,不過好在問題都解決掉了,在此也感謝一下答疑老師,給我提供了很多的思路,本文章是對前段時(shí)間學(xué)習(xí)Linux,做一個(gè)小小的總結(jié),才疏學(xué)淺,只學(xué)

    2024年02月12日
    瀏覽(23)
  • 網(wǎng)絡(luò)編程-Socket通信實(shí)現(xiàn)服務(wù)器與客戶端互傳文件(JAVA語言實(shí)現(xiàn))

    網(wǎng)絡(luò)編程-Socket通信實(shí)現(xiàn)服務(wù)器與客戶端互傳文件(JAVA語言實(shí)現(xiàn))

    在網(wǎng)絡(luò)通信協(xié)議下,實(shí)現(xiàn)網(wǎng)絡(luò)互連的不同計(jì)算機(jī)上運(yùn)行的程序間可以進(jìn)行數(shù)據(jù)交換. 網(wǎng)絡(luò)編程三要素:ip地址、端口、協(xié)議 ip地址: 每臺計(jì)算機(jī)指定的一個(gè)標(biāo)識符,127.0.0.1是回送地址,可以代表本機(jī)地址 ,一般用來測試使用 ipconfig:命令行中查看本機(jī)地址 ping ip地址:檢查網(wǎng)絡(luò)是

    2023年04月14日
    瀏覽(31)
  • 多進(jìn)程并發(fā)TCP服務(wù)器模型(含客戶端)(網(wǎng)絡(luò)編程 C語言實(shí)現(xiàn))

    摘要 :大家都知道不同pc間的通信需要用到套接字sockte來實(shí)現(xiàn),但是服務(wù)器一次只能收到一個(gè)客戶端發(fā)來的消息,所以為了能讓服務(wù)器可以接收多個(gè)客戶端的連接與消息的傳遞,我們就引入了多進(jìn)程并發(fā)這樣一個(gè)概念。聽名字就可以知道--需要用到進(jìn)程,當(dāng)然也有多線程并發(fā)

    2024年02月17日
    瀏覽(105)
  • JAVA客戶端導(dǎo)入證書來訪問HTTPS的方法

    JAVA客戶端導(dǎo)入證書來訪問HTTPS的方法

    1、 java 把證書都放在了 D:jdks1.8jrelibsecurity 這個(gè)路徑下的cacerts 文件里面。 我們進(jìn)入jdk/bin這個(gè)路徑,使用keytool工具。 2、 輸入以下命令 keytool -import -aliias [證書名字] -keystore [cacerts路徑] -file [證書地址] 即可。 如果是自己的網(wǎng)站可以從服務(wù)商那里下載,如果是別人的網(wǎng)站那

    2023年04月17日
    瀏覽(22)
  • ESP32 HTTPS客戶端POST請求(跳過證書驗(yàn)證)

    ESP32 HTTPS客戶端POST請求(跳過證書驗(yàn)證)

    本文例程為ESP32 HTTPS客戶端POST請求 只有HTTPS請求部分,聯(lián)網(wǎng)部分省略默。。。 樂鑫ESP-IDF API參考文檔 函數(shù) esp_http_client_init 結(jié)構(gòu)體 constesp_http_client_config_t 此結(jié)構(gòu)體用于配置HTTP/HTTPS參數(shù) 設(shè)置HTTP/HTTPS請求方法 此接口可以手動設(shè)置HTTP請求方式(可以覆蓋配置結(jié)構(gòu)體的設(shè)置) 設(shè)置

    2024年02月05日
    瀏覽(238)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包