window下编译libcurl支持IPV6功能

近期接到一个项目需求,之前做的软件里边调用的接口所在服务器要改成IPV6,需要我们做好改造支持。
软件使用libcurl开源库实现网络通信的,libcurl本身是支持IPv6的,但可以在编译和使用中关闭或禁用,现在软件直接使用现成的libcurl静态库,之前curl怎么编译的都不知道了,导致现有程序不支持调用IPV6服务的接口。

1. 项目代码中添加支持IPV6测试

查阅资料,curl在使用时,如果要支持IPV6,在代码中调用
CURL_EXTERN CURLcode curl_easy_setopt(CURL curl, CURLoption option, …);
函数添加IPV6功能即可,实际如下:
curl_easy_setopt(curl, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_WHATEVER);
curl为来自于curl_easy_init()初始化创建的CURL
的指针,
CURLOPT_IPRESOLVE为设置的类型,表示这次IP解析相关的参数,
CURL_IPRESOLVE_WHATEVER为设置的值,可以设置CURL_IPRESOLVE_V4表示仅支持IPV4,CURL_IPRESOLVE_V6表示仅支持IPV6,和CURL_IPRESOLVE_WHATEVER表示IPV4和IPV6都支持;
修改设置编译后,测试发现还是不支持IPV6。
问题在哪?在于使用的libcurl的静态库可能本身就不支持或被禁用,在libcurl源码(libcurl和后面用到的openssl源码可以自行在开源网站上下载)中查看curl/lib/curl_config.h(有些版本可能是curl_config.h.cmake文件)
在这里插入图片描述
查看并设置#define ENABLE_IPV6 1,(,有些是#cmakedefine ENABLE_IPV6 1,1表示源码支持IPV6,0表示不支持)
使用 nmake重新编译curl,curl依赖opensssl开源库,所以为确保编译curl成功,先做好openssl的编译安装工作。

2. 编译openssl库
用nmake编译openssl依次用一下命令,这里用到perl工具:
perl Configure VC-WIN32 no-shared no-asm no-tests -D_WIN32_WINNT=0x0501 --prefix=C:\openssl_lib
nmake
nmake install完成
openssl库编译也比较复杂,可自行查阅资料确保openssl编译安装成功
在这里插入图片描述

3. 编译libcurl库
安装完openssl(注意看上面命令中,我们把openssl安装到了C:\openssl_lib下,下面编译curl要用到),开始编译libcurl,使用命令如下:
开始菜单管理员权限打开VS2010命令提示(如果要x86版本,就打开x86命令)
cd /d 到curl目录下的winbuild文件夹中
在这里插入图片描述

nmake /f Makefile.vc mode=static VC=10 WITH_DEVEL=C:\openssl_lib WITH_SSL=static MACHINE=x86 ENABLE_SSPI=no ENABLE_IPV6=yes ENABLE_IDN=no debug=no
在这里插入图片描述

上面Makefile.vc是启动winbuild文件夹下Makefile.vc文件
mode=static表示本次编译输出libcurl为静态库,若要编译出动态库改为mode=dll即可
VC=10表示编译器用的VS2010版本,你可以用VC=14,表示用的VS2015,其他如VS2008,VS2017,VS2019自行查阅版本号;
WITH_DEVEL=c:\openssl表示当前依赖目录为c:\openssl
WITH_SSL=static表示依赖的openssl库使用静态库
MACHINE=x86表示编译输出32位版本
ENABLE_SSPI=no,ENABLE_IDN=no,debug=no表示禁用SSPI,IDN,debug,若要启用,no改为yes即可;
ENABLE_IPV6=yes就是本次重点,将ENABLE_IPV6设置位yes,表示curl此次编译的支持使用IPV6。
编译完成后,curl目录下生成builds文件夹,在builds文件夹下生成三个子文件夹,取非curl和lib结尾的那个文件夹里边就是我们实际要的,该子文件夹里边"bin"是curl的测试程序,可以直接通过命令行验证,"include"使用curl需要包括的头文件,"lib"编译出来的使用curl需要的静态库。
在这里插入图片描述

4. 验证结果
编译出来后,我们直接用"bin"下的curl.exe测试下是否支持IPV6,cmd命令开启,cd /d curl.exe的目录,执行curl IPV6的域名;
很多电脑和网络目前都还不支持IPV6,所以这里测试有问题,可能不是编译的curl有问题,而是你的电脑系统和你使用的网络的原因。
用ping测试电脑支持IPV6与否,cmd里输入命令ping -6 IPV6的IP地址
在浏览器输入网址“http://test-ipv6.com/”,测试你的网络是否支持IPV6
5. 代码引用
在代码中引入curl的头文件,并在配置中加上libcurl的静态库,调用代码大致如下:

 int PostEx(const char* strUrl, const char* pszPost, 
	const char* pszCookie)
{
	CURLcode res;
	m_strResponse = "";
	CURL* curl = curl_easy_init();
	if (NULL == curl)
	{
		return CURLE_FAILED_INIT;
	}
	if (m_bDebug)
	{
		curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);
		curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, OnDebug);
	}
	struct curl_slist *headers = NULL;
	headers = curl_slist_append(headers, "Postman-Token: b736f1eb-1475-4f8d-ac47-021df32cabe3");
	headers = curl_slist_append(headers, "Cache-Control: no-cache");
	headers = curl_slist_append(headers, "Content-Type: application/x-www-form-urlencoded");
	headers = curl_slist_append(headers, "content-type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW");
	curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);

	curl_easy_setopt(curl, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_WHATEVER);//这里就是我们添加的设置支持IPV6的代码
	curl_easy_setopt(curl, CURLOPT_URL, strUrl);
	curl_easy_setopt(curl, CURLOPT_POST, 1);
	//strData +=strPost.c_str();
	curl_easy_setopt(curl, CURLOPT_POSTFIELDS, pszPost);
	curl_easy_setopt(curl, CURLOPT_READFUNCTION, NULL);
	curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, OnWriteData);
	curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&m_strResponse);
	curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);
	curl_easy_setopt(curl, CURLOPT_TIMEOUT, 60*5);

	if ((pszCookie != NULL)&&(strlen(pszCookie)>0))
	{ 
		curl_easy_setopt(curl, CURLOPT_COOKIEFILE, (void *)&pszCookie);
		curl_easy_setopt(curl, CURLOPT_COOKIEJAR, (void *)&pszCookie);
	}

	curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 60);
	curl_easy_setopt(curl, CURLOPT_TIMEOUT, 60);
	res = curl_easy_perform(curl);
	if (res != CURLE_OK)
		m_strResponse = "";

	curl_easy_cleanup(curl);
	return res;
}
 
  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 要使libcurl支持openssl,需要进行以下步骤: 1. 确保系统已经安装了openssl库和开发包。可以使用包管理器来安装这些依赖项(例如apt-get、yum等)。 2. 下载libcurl的源代码,并解压缩。 3. 进入解压后的libcurl源代码目录,打开命令行终端。 4. 运行以下命令来配置编译选项: ```shell ./configure --with-ssl ``` 该命令会自动检测系统上已安装的openssl版本,并将其与libcurl进行链接。 5. 运行以下命令进行编译: ```shell make ``` 这将编译libcurl库,并生成可执行文件。 6. 最后,运行以下命令来安装libcurl: ```shell sudo make install ``` 这将把编译好的libcurl库文件复制到系统的标准库目录中,以便其他程序可以使用。 完成以上步骤后,libcurl就已经成功编译支持openssl了。我们可以在新的程序中使用libcurl进行https请求,而不需要额外的配置。 ### 回答2: libcurl是一个强大且广泛使用的开源网络传输库,可以用来进行HTTP、FTP、SMTP等网络协议的数据传输。为了支持使用OpenSSL进行安全的数据传输,需要在编译libcurl时进行相应的配置。 首先,需要安装OpenSSL库。可以从OpenSSL官方网站下载最新的源代码,并按照其提供的指导进行安装。 接下来,在编译libcurl之前,需要确保系统已经安装了OpenSSL的开发库。这些库通常包含在类似libssl-dev或openssl-devel的软件包中。可以使用系统的包管理工具进行安装。 在编译libcurl时,需要指定使用OpenSSL的选项。在配置libcurl时,可以使用以下命令: ./configure --with-ssl 这样会告诉编译系统使用OpenSSL进行编译,并在编译过程中链接OpenSSL的库文件。 在配置完成后,可以使用make命令进行编译,并使用make install命令进行安装。 安装完成后,可以在编写代码时使用libcurl库进行网络传输的开发。在代码中,可以通过设置相应的选项来使用OpenSSL进行安全传输。例如,可以通过设置CURLOPT_SSL_VERIFYPEER选项为1来验证服务器的证书,通过设置CURLOPT_SSL_VERIFYHOST选项为2来验证服务器的主机名。 总之,编译libcurl支持OpenSSL需要先安装OpenSSL库和开发库,然后在配置和编译libcurl时指定使用OpenSSL的选项。在代码中,可以通过设置相应的选项来进行安全传输的设置。 ### 回答3: 要编译libcurl支持OpenSSL,您需要按照以下步骤操作: 1. 首先,确保您的系统已经安装了OpenSSL。您可以在终端中运行以下命令来检查: ``` openssl version ``` 如果OpenSSL已经安装,您将看到OpenSSL的版本信息。 2. 下载libcurl源代码。您可以从libcurl官方网站(https://curl.se/download.html)或GitHub仓库(https://github.com/curl/curl)下载最新版本的libcurl。 3. 解压源代码文件,并进入解压后的目录。 4. 在终端中运行以下命令来配置编译选项: ``` ./configure --with-ssl ``` 这将配置libcurl以启用OpenSSL支持。 5. 运行以下命令编译libcurl: ``` make ``` 这将编译libcurl,生成可执行文件。 6. 最后,在终端中运行以下命令安装libcurl: ``` make install ``` 这将安装libcurl到系统中。 完成以上步骤后,您已成功编译支持OpenSSL的libcurl。您可以在项目中使用libcurl来进行网络通信,并使用OpenSSL进行安全通信。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值