使用CURLOPT_NOSIGNAL后必须启用异步DNS,因此需要重新编译libcurl,使其支持c-ares。
curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1L);//禁用掉alarm信号,防止多线程中使用超时崩溃
curl_easy_setopt(curl, CURLOPT_FORBID_REUSE, 1L); //禁掉alarm后会有大量CLOSE_WAIT
-------------------------------------------
下面自己编译libcurl支持c-ares
下载c-ares:
http://c-ares.haxx.se/download/c-ares-1.10.0.tar.gz
解压后用VS2010打开c-ares-1.10.0\vc\vc6aws.dsw
编译dll,生成release版cares.dll和cares.lib
编译openssl和zlib(略过,之前我们已经编译过啦)
编译libcurl
进入curl-7.26.0\winbuild文件夹。
新建一个build_release.bat文件,内容如下:
set INCLUDE=%INCLUDE%;C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\include\ set LIB=%LIB%;C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\lib\ nmake /f makefile.vc mode=dll DEBUG=no VC=10 WITH_SSL=dll WITH_ZLIB=dll USE_IDN=no USE_SSSPI=yes USE_IPV6=yes GEN_PDB=yes
注:我的操作系统是windows 7 x64并且安装了win8 sdk,因此在cmd命令中改写include和lib。
保存它。
在curl-7.26.0同级目录建立一个deps文件夹,并且在它下面再建立lib、include、bin三个文件夹。
把openssl和zlib以及c-cares的头文件和库复制到它们下面。目录结构如下:
├─bin (8 files)
│ cares.dll
│ cares.pdb
│ caresd.dll
│ libeay32.dll
│ libeay32.pdb
│ ssleay32.dll
│ ssleay32.pdb
│ zlib1.dll
├─include (22 files)
│ ares.h
│ ares_build.h
│ ares_data.h
│ ares_dns.h
│ ares_getenv.h
│ ares_getopt.h
│ ares_inet_net_pton.h
│ ares_iphlpapi.h
│ ares_ipv6.h
│ ares_library_init.h
│ ares_llist.h
│ ares_nowarn.h
│ ares_platform.h
│ ares_private.h
│ ares_rules.h
│ ares_setup.h
│ ares_strcasecmp.h
│ ares_strdup.h
│ ares_version.h
│ ares_writev.h
│ zconf.h
│ zlib.h
│─openssl (这个目录是复制openssl-1.0.0c\inc32下面的openssl文件夹)
└─lib (7 files)
cares.lib
caresd.lib
ibcares.lib
libcaresd.lib
libeay32.lib
ssleay32.lib
zlib.lib
打开MakefileBuild.vc 大约98行
SSL_LIBS = libeay32.lib ssleay32.lib caresd.lib #caresd.lib是我们新添加的dll版c-ares
打开curl-7.26.0\lib\config-win32.h 大约613行
/* #define USE_ARES 1 */
去掉这一行的注释,并且注释掉后面的 #define USE_THREADS_WIN32 1
打开vs2010命令提示符
执行build_release.bat文件,OK等一会儿就看到
curl-7.26.0\builds\libcurl-release-dll-ssl-dll-zlib--sspi文件夹生成了,里面有我们需要的libcurl版本。