libCurl
- LibCurl基本框架
- LibCurl主要函数
- curl_global_init(long flags)
- curl _global_cleanup(void)
- curl_easy_init()
- curl_easy_cleanup()
- curl_easy_setopt(CURL *handle,CURLoption option,parameter)
- curl_easy_perform(CURL *handle)
- curl_easy_getinfo()
- curl_version()
- curl_getdate()
- curl_formadd()
- curl_formfree()
- curl_slist_append()
- slist_free_all()
- curl_easy_escape()
- curl_easy_unescape()
- curl_easy_setopt中的CURLoption宏解释
- BEHAVIOR OPTIONS
- CALLBACK OPTIONS
- CURLOPT_WRITEFUNCTION
- CURLOPT_WRITEDATA
- CURLOPT_READFUNCTION
- CURLOPT_READDATA
- CURLOPT_IOCTLFUNCTION
- CURLOPT_IOCTLDATA
- CURLOPT_SEEKFUNCTION
- CURLOPT_SEEKDATA
- CURLOPT_SOCKOPTFUNCTION
- CURLOPT_SOCKOPTDATA
- CURLOPT_OPENSOCKETFUNCTION
- CURLOPT_OPENSOCKETDATA
- CURLOPT_CLOSESOCKETFUNCTION
- CURLOPT_CLOSESOCKETDATA
- CURLOPT_PROGRESSFUNCTION
- CURLOPT_PROGRESSDATA
- CURLOPT_XFERINFOFUNCTION
- CURLOPT_XFERINFODATA
- CURLOPT_HEADERFUNCTION
- CURLOPT_HEADERDATA
- CURLOPT_DEBUGFUNCTION
- CURLOPT_DEBUGDATA
- CURLOPT_SSL_CTX_FUNCTION
- CURLOPT_SSL_CTX_DATA
- CURLOPT_CONV_TO_NETWORK_FUNCTION
- CURLOPT_CONV_FROM_NETWORK_FUNCTION
- CURLOPT_CONV_FROM_UTF8_FUNCTION
- CURLOPT_INTERLEAVEFUNCTION
- CURLOPT_INTERLEAVEDATA
- CURLOPT_CHUNK_BGN_FUNCTION
- CURLOPT_CHUNK_END_FUNCTION
- CURLOPT_CHUNK_DATA
- CURLOPT_FNMATCH_FUNCTION
- CURLOPT_FNMATCH_DATA
- CURLOPT_SUPPRESS_CONNECT_HEADERS
- ERROR OPTIONS
- NETWORK OPTIONS
- CURLOPT_URL
- CURLOPT_PATH_AS_IS
- CURLOPT_PROTOCOLS
- CURLOPT_REDIR_PROTOCOLS
- CURLOPT_DEFAULT_PROTOCOL
- CURLOPT_PROXY
- CURLOPT_PRE_PROXY
- CURLOPT_PROXYPORT
- CURLOPT_PROXYTYPE
- CURLOPT_NOPROXY
- CURLOPT_HTTPPROXYTUNNEL
- CURLOPT_CONNECT_TO
- CURLOPT_SOCKS5_AUTH
- CURLOPT_SOCKS5_GSSAPI_SERVICE
- CURLOPT_SOCKS5_GSSAPI_NEC
- CURLOPT_PROXY_SERVICE_NAME
- CURLOPT_SERVICE_NAME
- CURLOPT_INTERFACE
- CURLOPT_LOCALPORT
- CURLOPT_LOCALPORTRANGE
- CURLOPT_DNS_CACHE_TIMEOUT
- CURLOPT_DNS_USE_GLOBAL_CACHE
- CURLOPT_BUFFERSIZE
- CURLOPT_PORT
- CURLOPT_TCP_FASTOPEN
- CURLOPT_TCP_NODELAY
- CURLOPT_ADDRESS_SCOPE
- CURLOPT_TCP_KEEPALIVE
- CURLOPT_TCP_KEEPIDLE
- CURLOPT_TCP_KEEPINTVL
- CURLOPT_UNIX_SOCKET_PATH
- CURLOPT_ABSTRACT_UNIX_SOCKET
- NAMES and PASSWORDS OPTIONS (Authentication)
- CURLOPT_NETRC
- CURLOPT_NETRC_FILE
- CURLOPT_USERPWD
- CURLOPT_PROXYUSERPWD
- CURLOPT_USERNAME
- CURLOPT_PASSWORD
- CURLOPT_LOGIN_OPTIONS
- CURLOPT_PROXYUSERNAME
- CURLOPT_PROXYPASSWORD
- CURLOPT_HTTPAUTH
- CURLOPT_TLSAUTH_USERNAME
- CURLOPT_PROXY_TLSAUTH_USERNAME
- CURLOPT_TLSAUTH_PASSWORD
- CURLOPT_PROXY_TLSAUTH_PASSWORD
- CURLOPT_TLSAUTH_TYPE
- CURLOPT_PROXY_TLSAUTH_TYPE
- CURLOPT_PROXYAUTH
- CURLOPT_SASL_IR
- CURLOPT_XOAUTH2_BEARER
- HTTP OPTIONS
- CURLOPT_AUTOREFERER
- CURLOPT_ACCEPT_ENCODING
- CURLOPT_TRANSFER_ENCODING
- CURLOPT_FOLLOWLOCATION
- CURLOPT_UNRESTRICTED_AUTH
- CURLOPT_MAXREDIRS
- CURLOPT_POSTREDIR
- CURLOPT_PUT
- CURLOPT_POST
- CURLOPT_POSTFIELDS
- CURLOPT_POSTFIELDSIZE
- CURLOPT_POSTFIELDSIZE_LARGE
- CURLOPT_COPYPOSTFIELDS
- CURLOPT_HTTPPOST
- CURLOPT_REFERER
- CURLOPT_USERAGENT
- CURLOPT_HTTPHEADER
- CURLOPT_HEADEROPT
- CURLOPT_PROXYHEADER
- CURLOPT_HTTP200ALIASES
- CURLOPT_COOKIE
- CURLOPT_COOKIEFILE
- CURLOPT_COOKIEJAR
- CURLOPT_COOKIESESSION
- CURLOPT_COOKIELIST
- CURLOPT_HTTPGET
- CURLOPT_REQUEST_TARGET
- CURLOPT_HTTP_VERSION
- CURLOPT_IGNORE_CONTENT_LENGTH
- CURLOPT_HTTP_CONTENT_DECODING
- CURLOPT_HTTP_TRANSFER_DECODING
- CURLOPT_EXPECT_100_TIMEOUT_MS
- CURLOPT_PIPEWAIT
- CURLOPT_STREAM_DEPENDS
- CURLOPT_STREAM_DEPENDS_E
- CURLOPT_STREAM_WEIGHT
- SMTP OPTIONS
- TFTP OPTIONS
- FTP OPTIONS
- CURLOPT_FTPPORT
- CURLOPT_QUOTE
- CURLOPT_POSTQUOTE
- CURLOPT_PREQUOTE
- CURLOPT_APPEND
- CURLOPT_FTP_USE_EPRT
- CURLOPT_FTP_USE_EPSV
- CURLOPT_FTP_USE_PRET
- CURLOPT_FTP_CREATE_MISSING_DIRS
- CURLOPT_FTP_RESPONSE_TIMEOUT
- CURLOPT_FTP_ALTERNATIVE_TO_USER
- CURLOPT_FTP_SKIP_PASV_IP
- CURLOPT_FTPSSLAUTH
- CURLOPT_FTP_SSL_CCC
- CURLOPT_FTP_ACCOUNT
- CURLOPT_FTP_FILEMETHOD
- RTSP OPTIONS
- PROTOCOL OPTIONS
- CURLOPT_TRANSFERTEXT
- CURLOPT_PROXY_TRANSFER_MODE
- CURLOPT_CRLF
- CURLOPT_RANGE
- CURLOPT_RESUME_FROM
- CURLOPT_RESUME_FROM_LARGE
- CURLOPT_CUSTOMREQUEST
- CURLOPT_FILETIME
- CURLOPT_DIRLISTONLY
- CURLOPT_NOBODY
- CURLOPT_INFILESIZE
- CURLOPT_INFILESIZE_LARGE
- CURLOPT_UPLOAD
- CURLOPT_MIMEPOST
- CURLOPT_MAXFILESIZE
- CURLOPT_MAXFILESIZE_LARGE
- CURLOPT_TIMECONDITION
- CURLOPT_TIMEVALUE
- CONNECTION OPTIONS
- CURLOPT_TIMEOUT
- CURLOPT_TIMEOUT_MS
- CURLOPT_LOW_SPEED_LIMIT
- CURLOPT_LOW_SPEED_TIME
- CURLOPT_MAX_SEND_SPEED_LARGE
- CURLOPT_MAX_RECV_SPEED_LARGE
- CURLOPT_MAXCONNECTS
- CURLOPT_FRESH_CONNECT
- CURLOPT_FORBID_REUSE
- CURLOPT_CONNECTTIMEOUT
- CURLOPT_CONNECTTIMEOUT_MS
- CURLOPT_IPRESOLVE
- CURLOPT_CONNECT_ONLY
- CURLOPT_USE_SSL
- CURLOPT_RESOLVE
- CURLOPT_DNS_INTERFACE
- CURLOPT_DNS_LOCAL_IP4
- CURLOPT_DNS_LOCAL_IP6
- CURLOPT_DNS_SERVERS
- CURLOPT_ACCEPTTIMEOUT_MS
- SSL and SECURITY OPTIONS
- CURLOPT_SSLCERT
- CURLOPT_PROXY_SSLCERT
- CURLOPT_SSLCERTTYPE
- CURLOPT_PROXY_SSLCERTTYPE
- CURLOPT_SSLKEY
- CURLOPT_PROXY_SSLKEY
- CURLOPT_SSLKEYTYPE
- CURLOPT_PROXY_SSLKEYTYPE
- CURLOPT_KEYPASSWD
- CURLOPT_PROXY_KEYPASSWD
- CURLOPT_SSL_ENABLE_ALPN
- CURLOPT_SSL_ENABLE_NPN
- CURLOPT_SSLENGINE
- CURLOPT_SSLENGINE_DEFAULT
- CURLOPT_SSL_FALSESTART
- CURLOPT_SSLVERSION
- CURLOPT_PROXY_SSLVERSION
- CURLOPT_SSL_VERIFYHOST
- CURLOPT_PROXY_SSL_VERIFYHOST
- CURLOPT_SSL_VERIFYPEER
- CURLOPT_PROXY_SSL_VERIFYPEER
- CURLOPT_SSL_VERIFYSTATUS
- CURLOPT_CAINFO
- CURLOPT_PROXY_CAINFO
- CURLOPT_ISSUERCERT
- CURLOPT_CAPATH
- CURLOPT_PROXY_CAPATH
- CURLOPT_CRLFILE
- CURLOPT_PROXY_CRLFILE
- CURLOPT_CERTINFO
- CURLOPT_PINNEDPUBLICKEY
- CURLOPT_PROXY_PINNEDPUBLICKEY
- CURLOPT_RANDOM_FILE
- CURLOPT_EGDSOCKET
- CURLOPT_SSL_CIPHER_LIST
- CURLOPT_PROXY_SSL_CIPHER_LIST
- CURLOPT_SSL_SESSIONID_CACHE
- CURLOPT_SSL_OPTIONS
- CURLOPT_PROXY_SSL_OPTIONS
- CURLOPT_KRBLEVEL
- CURLOPT_GSSAPI_DELEGATION
- SSH OPTIONS
- OTHER OPTIONS
- TELNET OPTIONS
- RETURN VALUE
- EXAMPLE
- SEE ALSO
- libCurl使用
LibCurl基本框架
libcurl是一个跨平台的网络协议库,支持http, https, ftp, gopher, telnet, dict, file, 和ldap 协议。libcurl同样支持HTTPS证书授权,HTTP POST, HTTP PUT, FTP 上传, HTTP基本表单上传,代理,cookies,和用户认证。想了解更多相关介绍可以登录官网https://curl.haxx.se/。
在基于LibCurl的程序里,主要采用callback function (回调函数)的形式完成传输任务,用户在启动传输前设置好各类参数和回调函数,当满足条件时libcurl将调用用户的回调函数实现特定功能。下面是利用libcurl完成传输任务的流程:
LibCurl主要函数
curl_global_init(long flags)
描述:这个函数只能用一次。(其实在调用curl_global_cleanup 函数后仍然可再用)
如果这个函数在curl_easy_init函数调用时还没调用,它讲由libcurl库自动完成。
参数:flags
- CURL_GLOBAL_ALL:初始化所有的可能的调用。
- CURL_GLOBAL_SSL : 如果libcurl在编译时被设定支持SSL,那么该参数用于初始化相应的SSL库。初始化支持 安全套接字层。
- CURL_GLOBAL_WIN32:初始化win32套接字winsock库,只能应用于windows平台,如果没有正确初始化,应用程序就不能使用socket.
- CURL_GLOBAL_NOTHING:没有额外的初始化。
curl _global_cleanup(void)
描述:在结束libcurl使用的时候,用来对curl_global_init做的工作清理。类似于close的函数。
curl_easy_init()
描述:curl_easy_init用来初始化一个CURL的指针(有些像返回FILE类型的指针一样). 相应的在调用结束时要用curl_easy_cleanup一般curl_easy_init意味着一个会话的开始. 它的返回值一般都用在easy系列的函数中.函数清理.
curl_easy_cleanup()
描述:在结束libcurl使用的时候,用来对curl_global_init做的工作清理。类似于close的函数。释放内存。
curl_easy_setopt(CURL *handle,CURLoption option,parameter)
描述: 这个函数非常重要.几乎所有的curl 程序都要频繁的使用它.它告诉curl库.程序将有如何的行为. 比如要查看一个网页的html代码等.(这个函数有些像ioctl函数)参数:
-
CURL *handle类型的指针,是由curl_easy_init()返回的句柄。
-
CURLoption 类型的选项:
-
parameter 这个参数既可以是函数的指针,或者是一个curl_off_t类型,也可以是某个对象的指针,也可以是个long型的变量。它用什么这取决于第二个参数.CURLoption这个参数的取值很多,具体可以查看man手册。
curl_easy_perform(CURL *handle)
描述:这个函数在初始化CURL类型的指针 以及curl_easy_setopt完成后调用. 就像字面的意思所说perform就像是个舞台.让我们设置的option 运作起来.它将连接到远程站点,执行必要的命令并接收传输,每当它接收数据,它调用我们以前设置的回调函数,该函数可以一次获得一个字节或许多字节。传输完成后函数返回一个参数:CURL类型的指针.
该函数完成curl_easy_setopt指定的所有选项,本节重点介绍curl_easy_perform的返回值。返回0意味一切ok,非0代表错误发生。主要错误码说明:
- CURLE_OK
任务完成一切完好 - CURLE_UNSUPPORTED_PROTOCOL
不支持的协议,由URL的头部指定 - CURLE_COULDNT_CONNECT
不能连接到remote主机或者代理 - CURLE_REMOTE_ACCESS_DENIED
访问初拒绝 - CURLE_HTTP_RETURNED_ERROR
http返回错误
6.CURLE_READ_ERROR
读本地文件错误
7.CURLE_REMOTE_FILE_NOT_FOUND
访问文件没有找到文件不存在
curl_easy_getinfo()
curl_version()
描述:打印当前curl库的版本。
curl_getdate()
curl_formadd()
curl_formfree()
curl_slist_append()
slist_free_all()
curl_easy_escape()
curl_easy_unescape()
curl_easy_setopt中的CURLoption宏解释
BEHAVIOR OPTIONS
CURLOPT_VERBOSE
在使用该选项且第 3 个参数为 1 时,curl 库会显示详细的操作信息。这对程序的调试具有极大的帮助。
CURLOPT_HEADER
使用该选项时,第 3 个参数设置为 1,那么会通知 curl 库在输出时要同时包含 "头部“ 和 "主题内容" 两个部分。该选项仅是对那些同时包含了”头部“和”主题内容“这两部分的协议而言(如 HTTP)。
CURLOPT_NOPROGRESS
该选项关闭下载进度,为使用CURLOPT_PROGRESSFUNCTION被调用,此参数必须被设置为false;
CURLOPT_NOSIGNAL
屏蔽其它信号
CURLOPT_WILDCARDMATCH
CALLBACK OPTIONS
CURLOPT_WRITEFUNCTION
使用该选项时,要求第 3 个参数中的回调函数必须是下面的函数原型:
size_t function( char *ptr, size_t size, size_t nmemb, void *stream);
在启动会话时,一旦检测到有需要接收的数据时,回调函数被调用。ptr 所指向的数据大小由 size 和 nmemb 的乘积获得。函数最后需要返回接收数据的大小。如果不使用该函数,那么接收到的数据会直接打印到终端;使用该函数,那么接收到的数据保存在 ptr 所执向的区域,可以利用此来保存接收下来的数据。
如果你没有通过CURLOPT_WRITEFUNCTION属性给easy handle设置回调函数,libcurl会提供一个默认的回调函数,它只是简单的将接收到的数据打印到标准输出。你也可以通过CURLOPT_WRITEDATA属性给默认回调函数传递一个已经打开的文件指针,用于将数据输出到文件里。
CURLOPT_WRITEDATA
使用该选项时,第 3 个参数作为用户数据的指针而传递到使用 CURLOPT_WRITEFUNCTION 选项时指定的回调函数中(第 4 个参数)。如果不想用回调函数而保存数据,那么可以使用 CURLOPT_WRITEDATA 选项,使用该选项时,函数的第 3 个参数必须是个 FILE 指针,函数会将接收到的数据自动的写到这个 FILE 指针所指向的文件流中。
CURLOPT_READFUNCTION
需要读取数据传递给远程主机时将调用CURLOPT_READFUNCTION指定的函数,函数原型:
size_t function( char *ptr, size_t size, size_t nmemb, void *stream);
在 CURLOPT_READFUNCTION 的回调函数里,第 1 个参数 ptr 指针用来接收从第 4 个参数传递过来的数据(这个参数往往是个文件流指针),而这个参数是使用 CURLOPT_READDATA 选项时传递过来的。
CURLOPT_READDATA
表明CURLOPT_READFUNCTION函数原型中的stream指针来源。
CURLOPT_IOCTLFUNCTION
CURLOPT_IOCTLDATA
CURLOPT_SEEKFUNCTION
CURLOPT_SEEKDATA
CURLOPT_SOCKOPTFUNCTION
CURLOPT_SOCKOPTDATA
CURLOPT_OPENSOCKETFUNCTION
CURLOPT_OPENSOCKETDATA
CURLOPT_CLOSESOCKETFUNCTION
CURLOPT_CLOSESOCKETDATA
CURLOPT_PROGRESSFUNCTION
指定的函数正常情况下每秒被libcurl调用一次
CURLOPT_PROGRESSDATA
批定的参数将作为CURLOPT_PROGRESSFUNCTION指定函数的参数,整个处理与下载数据回调用处理相同。
CURLOPT_XFERINFOFUNCTION
上传或下载的字节数,使用回调函数和CURLOPT_PROGRESSFUNCTION功能一样。是在新版中加入。回调函数原型:
int progress_callback(void *p,curl_off_t dltotal,curl_off_t dlnow,curl_off_t ultotal,curl_off_t ulnow)
dltotal需要下载的总字节数,dlnow是已经下载的字节数。ultotal是将要上传的字节数,ulnow是已经上传的字节数。如果仅仅是下载或上传其中一个将会是0。p是用户自定义参数,通过设置CURLOPT_XFERINFODATA属性来传递。此函数返回非0值将会中断传输。错误代码是CURLE_ABORTED_BY_CALLBACK.
CURLOPT_XFERINFODATA
CURLOPT_HEADERFUNCTION
回调函数原型:
size_t function(void *ptr,size_t size,size_t nmemb,void *stream);
该选项与上面第 3 个选项 CURLOPT_WRITEFUNCTION 类似,只要它一接收到头部信息时,它就会执行回调函数。需要注意的是,回调函数里处理的头部包含了所有收到的响应的头部信息,而不只是最后一次的响应。如果需要处理其中的一个头部,那么自己需要在所收集的头部信息中进行区分。
CURLOPT_HEADERDATA
和CURLOPT_WRITEDATA 选项功能一样,表示在接收到头部信息并调用回调函数时,给回调函数传递第 4 个参数。
该指针表明CURLOPT_HEADERFUNCTION函数的stream指针来源。
CURLOPT_DEBUGFUNCTION
CURLOPT_DEBUGDATA
CURLOPT_SSL_CTX_FUNCTION
CURLOPT_SSL_CTX_DATA
CURLOPT_CONV_TO_NETWORK_FUNCTION
CURLOPT_CONV_FROM_NETWORK_FUNCTION
CURLOPT_CONV_FROM_UTF8_FUNCTION
CURLOPT_INTERLEAVEFUNCTION
CURLOPT_INTERLEAVEDATA
CURLOPT_CHUNK_BGN_FUNCTION
CURLOPT_CHUNK_END_FUNCTION
CURLOPT_CHUNK_DATA
CURLOPT_FNMATCH_FUNCTION
CURLOPT_FNMATCH_DATA
CURLOPT_SUPPRESS_CONNECT_HEADERS
ERROR OPTIONS
CURLOPT_ERRORBUFFER
CURLOPT_STDERR
CURLOPT_FAILONERROR
CURLOPT_KEEP_SENDING_ON_ERROR
NETWORK OPTIONS
CURLOPT_URL
这个选项后面接实际要处理的 URL ,这个 URL 是一个以 '\0' 结尾的字符串或参数指针。如果 URL 参数不写上协议头(如 "http://" 或者 "ftp:// 等等 ),那么函数会自己进行猜解所给的主机上用的是哪一种服务协议。假如你给的这个地址是一个不被 支持的协议,那么在其后执行 curl_easy_perform()函数或 curl_multi_perform() 函数时, libcurl 将返回错误(CURLE_UNSUPPORTED_PROTOCOL)。这个选项是唯一一个必须在 curl_easy_perform() 调用之前就要设置的选项。
curl_easy_setopt(handle,CURLOPT_URL,"http://domain.com")
URL标识了你要在此处访问的远程资源。
CURLOPT_PATH_AS_IS
CURLOPT_PROTOCOLS
CURLOPT_REDIR_PROTOCOLS
CURLOPT_DEFAULT_PROTOCOL
CURLOPT_PROXY
CURLOPT_PRE_PROXY
CURLOPT_PROXYPORT
CURLOPT_PROXYTYPE
CURLOPT_NOPROXY
CURLOPT_HTTPPROXYTUNNEL
CURLOPT_CONNECT_TO
CURLOPT_SOCKS5_AUTH
CURLOPT_SOCKS5_GSSAPI_SERVICE
CURLOPT_SOCKS5_GSSAPI_NEC
CURLOPT_PROXY_SERVICE_NAME
CURLOPT_SERVICE_NAME
CURLOPT_INTERFACE
CURLOPT_LOCALPORT
CURLOPT_LOCALPORTRANGE
CURLOPT_DNS_CACHE_TIMEOUT
CURLOPT_DNS_USE_GLOBAL_CACHE
CURLOPT_BUFFERSIZE
CURLOPT_PORT
CURLOPT_TCP_FASTOPEN
CURLOPT_TCP_NODELAY
CURLOPT_ADDRESS_SCOPE
CURLOPT_TCP_KEEPALIVE
CURLOPT_TCP_KEEPIDLE
CURLOPT_TCP_KEEPINTVL
CURLOPT_UNIX_SOCKET_PATH
CURLOPT_ABSTRACT_UNIX_SOCKET
NAMES and PASSWORDS OPTIONS (Authentication)
CURLOPT_NETRC
CURLOPT_NETRC_FILE
CURLOPT_USERPWD
CURLOPT_PROXYUSERPWD
CURLOPT_USERNAME
CURLOPT_PASSWORD
CURLOPT_LOGIN_OPTIONS
CURLOPT_PROXYUSERNAME
CURLOPT_PROXYPASSWORD
CURLOPT_HTTPAUTH
CURLOPT_TLSAUTH_USERNAME
CURLOPT_PROXY_TLSAUTH_USERNAME
CURLOPT_TLSAUTH_PASSWORD
CURLOPT_PROXY_TLSAUTH_PASSWORD
CURLOPT_TLSAUTH_TYPE
CURLOPT_PROXY_TLSAUTH_TYPE
CURLOPT_PROXYAUTH
CURLOPT_SASL_IR
CURLOPT_XOAUTH2_BEARER
HTTP OPTIONS
CURLOPT_AUTOREFERER
CURLOPT_ACCEPT_ENCODING
CURLOPT_TRANSFER_ENCODING
CURLOPT_FOLLOWLOCATION
CURLOPT_UNRESTRICTED_AUTH
CURLOPT_MAXREDIRS
CURLOPT_POSTREDIR
CURLOPT_PUT
CURLOPT_POST
CURLOPT_POSTFIELDS
CURLOPT_POSTFIELDSIZE
该选项要求第 3 个参数 parameter 是一个 void * 指针,它指向一个向 HTTP 服务器 POST 出去的一段数据,这段数据要根据服务器的具体要求填写。
CURLOPT_POSTFIELDSIZE_LARGE
CURLOPT_COPYPOSTFIELDS
CURLOPT_HTTPPOST
CURLOPT_REFERER
CURLOPT_USERAGENT
该选项要求传递一个以 '\0' 结尾的字符串指针,这个字符串用来在向服务器请求时发送 HTTP 头部中的 User-Agent 信息,有些服务器是需要检测这个信息的,如果没有设置 User-Agent,那么服务器拒绝请求。设置后,可以骗过服务器对此的检查。
CURLOPT_HTTPHEADER
CURLOPT_HEADEROPT
CURLOPT_PROXYHEADER
CURLOPT_HTTP200ALIASES
CURLOPT_COOKIE
CURLOPT_COOKIEFILE
CURLOPT_COOKIEJAR
CURLOPT_COOKIESESSION
CURLOPT_COOKIELIST
CURLOPT_HTTPGET
CURLOPT_REQUEST_TARGET
CURLOPT_HTTP_VERSION
CURLOPT_IGNORE_CONTENT_LENGTH
CURLOPT_HTTP_CONTENT_DECODING
CURLOPT_HTTP_TRANSFER_DECODING
CURLOPT_EXPECT_100_TIMEOUT_MS
CURLOPT_PIPEWAIT
CURLOPT_STREAM_DEPENDS
CURLOPT_STREAM_DEPENDS_E
CURLOPT_STREAM_WEIGHT
SMTP OPTIONS
CURLOPT_MAIL_FROM
CURLOPT_MAIL_RCPT
CURLOPT_MAIL_AUTH
TFTP OPTIONS
CURLOPT_TFTP_BLKSIZE
CURLOPT_TFTP_NO_OPTIONS
FTP OPTIONS
CURLOPT_FTPPORT
CURLOPT_QUOTE
给 FTP 或 SFTP 传递命令。这些命令应该放在 struct slist 链表中存储,使用时需要用 curl_slist_append() 函数将这些命令打包起来,然后一起发送出去。
CURLOPT_POSTQUOTE
和CURLOPT_QUOTE功能类似,它们的共同点都是给 FTP 或 SFTP 传递命令。这些命令应该放在 struct slist 链表中存储,使用时需要用 curl_slist_append() 函数将这些命令打包起来,然后一起发送出去。
它们的不同点是:CURLOPT_QUOTE 选项要求命令要在 FTP 传输请求之前就要发送到库,而 CURLOPT_POSTQUOTE 则可以在 FTP 传输请求发送完后发送。
CURLOPT_PREQUOTE
CURLOPT_APPEND
设置为1的参数告诉curl追加到远程文件,而不是覆盖它,这只有在上传到FTP站点时才有用。
CURLOPT_FTP_USE_EPRT
CURLOPT_FTP_USE_EPSV
CURLOPT_FTP_USE_PRET
CURLOPT_FTP_CREATE_MISSING_DIRS
CURLOPT_FTP_RESPONSE_TIMEOUT
CURLOPT_FTP_ALTERNATIVE_TO_USER
CURLOPT_FTP_SKIP_PASV_IP
CURLOPT_FTPSSLAUTH
CURLOPT_FTP_SSL_CCC
CURLOPT_FTP_ACCOUNT
CURLOPT_FTP_FILEMETHOD
RTSP OPTIONS
CURLOPT_RTSP_REQUEST
CURLOPT_RTSP_SESSION_ID
CURLOPT_RTSP_STREAM_URI
CURLOPT_RTSP_TRANSPORT
CURLOPT_RTSP_CLIENT_CSEQ
CURLOPT_RTSP_SERVER_CSEQ
PROTOCOL OPTIONS
CURLOPT_TRANSFERTEXT
指定libcurl的FTP传输模式,后面的值为1,则为ASCII,0为二进制Binary,如果使用了错误模式,在下载过程中服务器会给你一个553
CURLOPT_PROXY_TRANSFER_MODE
CURLOPT_CRLF
CURLOPT_RANGE
断点续传,指定传输分片,格式"0-200"
CURLOPT_RESUME_FROM
CURLOPT_RESUME_FROM_LARGE
CURLOPT_CUSTOMREQUEST
CURLOPT_FILETIME
CURLOPT_DIRLISTONLY
该选项列出服务器上的目录列表。和list命令一样。设置为1时有效。
CURLOPT_NOBODY
使用该选项时,若第 3 个参数设为 1,这样在输出中就不会包含主体内容部分。这仅是对在传输的所有内容中,含有“头部”和“主题内容”两部分的协议而言。如 HTTP(S) 服务器,在这种情况下将会使 libcurl 库仅发出一个头部请求。
CURLOPT_INFILESIZE
当向服务器上传文件时,该选项用来告诉 curl 库期望上传的文件的大小。使用该选项时,应该给函数第 3 个参数的应该是个 long 型变量。如果用的是 SCP 传输,那么该选项强制使用 CURLOPT_INFILESIZE_LARGE 。
CURLOPT_INFILESIZE_LARGE
该选项和 CURLOPT_INFILESIZE 功能一样,但是它要求函数的第 3 个参数必须是个 curl_off_t 类型。curl_off_t 为 int64_t 类型,而 int64_t 定义在 stdint.h 中:
if __WORDSIZE == 64
typedef long int int64_t;
# else
extension
typedef long long int int64_t;
由上面定义知,一般的,如果是 32 位平台,它就是 long long 型,表示 64 位的;如果是 64 位平台,它就是 long 型,也为 64 位。总之,就是个 64 位的。
CURLOPT_UPLOAD
在使用该选项时,第 3 个参数设置为 1,表示要准备上传文件。这个参数往往会配合 CURLOPT_READDATA,CURLOPT_INFILESIZE_LARGE,以及 CURLOPT_INFILESIZE 这几个选项一起用。如果是使用 HTTP 协议,那么使用 PUT 的方法进行上传,除非另有指定。
CURLOPT_MIMEPOST
CURLOPT_MAXFILESIZE
CURLOPT_MAXFILESIZE_LARGE
CURLOPT_TIMECONDITION
CURLOPT_TIMEVALUE
CONNECTION OPTIONS
CURLOPT_TIMEOUT
CURLOPT_TIMEOUT_MS
CURLOPT_LOW_SPEED_LIMIT
CURLOPT_LOW_SPEED_TIME
CURLOPT_MAX_SEND_SPEED_LARGE
CURLOPT_MAX_RECV_SPEED_LARGE
CURLOPT_MAXCONNECTS
CURLOPT_FRESH_CONNECT
CURLOPT_FORBID_REUSE
CURLOPT_CONNECTTIMEOUT
CURLOPT_CONNECTTIMEOUT_MS
CURLOPT_IPRESOLVE
CURLOPT_CONNECT_ONLY
CURLOPT_USE_SSL
CURLOPT_RESOLVE
CURLOPT_DNS_INTERFACE
CURLOPT_DNS_LOCAL_IP4
CURLOPT_DNS_LOCAL_IP6
CURLOPT_DNS_SERVERS
CURLOPT_ACCEPTTIMEOUT_MS
SSL and SECURITY OPTIONS
CURLOPT_SSLCERT
CURLOPT_PROXY_SSLCERT
CURLOPT_SSLCERTTYPE
CURLOPT_PROXY_SSLCERTTYPE
CURLOPT_SSLKEY
CURLOPT_PROXY_SSLKEY
CURLOPT_SSLKEYTYPE
CURLOPT_PROXY_SSLKEYTYPE
CURLOPT_KEYPASSWD
CURLOPT_PROXY_KEYPASSWD
CURLOPT_SSL_ENABLE_ALPN
CURLOPT_SSL_ENABLE_NPN
CURLOPT_SSLENGINE
CURLOPT_SSLENGINE_DEFAULT
CURLOPT_SSL_FALSESTART
CURLOPT_SSLVERSION
CURLOPT_PROXY_SSLVERSION
CURLOPT_SSL_VERIFYHOST
CURLOPT_PROXY_SSL_VERIFYHOST
CURLOPT_SSL_VERIFYPEER
CURLOPT_PROXY_SSL_VERIFYPEER
CURLOPT_SSL_VERIFYSTATUS
CURLOPT_CAINFO
CURLOPT_PROXY_CAINFO
CURLOPT_ISSUERCERT
CURLOPT_CAPATH
CURLOPT_PROXY_CAPATH
CURLOPT_CRLFILE
CURLOPT_PROXY_CRLFILE
CURLOPT_CERTINFO
CURLOPT_PINNEDPUBLICKEY
CURLOPT_PROXY_PINNEDPUBLICKEY
CURLOPT_RANDOM_FILE
CURLOPT_EGDSOCKET
CURLOPT_SSL_CIPHER_LIST
CURLOPT_PROXY_SSL_CIPHER_LIST
CURLOPT_SSL_SESSIONID_CACHE
CURLOPT_SSL_OPTIONS
CURLOPT_PROXY_SSL_OPTIONS
CURLOPT_KRBLEVEL
CURLOPT_GSSAPI_DELEGATION
SSH OPTIONS
CURLOPT_SSH_AUTH_TYPES
CURLOPT_SSH_COMPRESSION
CURLOPT_SSH_HOST_PUBLIC_KEY_MD5
CURLOPT_SSH_PUBLIC_KEYFILE
CURLOPT_SSH_PRIVATE_KEYFILE
CURLOPT_SSH_KNOWNHOSTS
CURLOPT_SSH_KEYFUNCTION
CURLOPT_SSH_KEYDATA
OTHER OPTIONS
CURLOPT_PRIVATE
CURLOPT_SHARE
CURLOPT_NEW_FILE_PERMS
CURLOPT_NEW_DIRECTORY_PERMS
TELNET OPTIONS
CURLOPT_TELNETOPTIONS
RETURN VALUE
CURLE_OK (zero) means that the option was set properly, non-zero means an error occurred as <curl/curl.h>defines. See the libcurl-errors man page for the full list with descriptions.
If you try to set an option that libcurl doesn't know about, perhaps because the library is too old to support it or the option was removed in a recent version, this function will return CURLE_UNKNOWN_OPTION. If support for the option was disabled at compile-time, it will return CURLE_NOT_BUILT_IN.
EXAMPLE
CURL *curl = curl_easy_init();
if(curl) {
CURLcode res;
curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
res = curl_easy_perform(curl);
curl_easy_cleanup(curl);
}
SEE ALSO
libCurl使用
1. libcurl的全局初始化及释放
CURLcode curl_global_init(long flags)
flags:CURL_GLOBAL_ALL //初始化所有的可能的调用。
CURL_GLOBAL_SSL //初始化支持 安全套接字层。
CURL_GLOBAL_WIN32 //初始化win32套接字库。
CURL_GLOBAL_NOTHING //没有额外的初始化。
void curl_global_cleanup(void) //结果时清除
应该在程序开始时调用初始化函数. 虽然不调用这个初始化函数, libcurl会在curl_easy_init()函数中自动调用. 但在多线程处理时, 可能会出现多次自动调用的情况.
2. 初始化下载handle及释放
CURL *curl=curl_easy_init();
curl_easy_cleanup(curl);
3. 设置下载属性,及常用参数
CURLcode curl_easy_setopt(CURL *handle, CURLoption option, parameter);
1. 设置下载数据的回调函数
option:
CURLOPT_WRITEFUNCTION //设置回调函数
回调函数原型为: size_t function( void *ptr, size_t size, size_t nmemb, void *userp); 函数将在libcurl接收到数据后被调用。
void *ptr是下载回来的数据.
void *userp是用户指针, 用户通过这个指针传输自己的数据.
CURLOPT_WRITEDATA
设置回调函数中的void *userp指针的来源。
2. 下载进度控制
option:
CURLOPT_NOPROGRESS
为了使CURLOPT_PROGRESSFUNCTION被调用. CURLOPT_NOPROGRESS必须被设置为false.
CURLOPT_PROGRESSFUNCTION
CURLOPT_PROGRESSFUNCTION 指定的函数正常情况下每秒被libcurl调用一次.
CURLOPT_PROGRESSDATA
CURLOPT_PROGRESSDATA指定的参数将作为CURLOPT_PROGRESSFUNCTION指定函数的参数.
整个处理与下载数据回调的处理相同.
3. 其它常用属性.
option:
CURLOPT_URL
设置访问的URI.
CURLOPT_NOSIGNAL
屏蔽其它信号.
CURLOPT_HEADER
取数据时连同HTTP头部一起取回.
CURLOPT_HEADERFUNCTION
CURLOPT_HEADERDATA
只取HTTP头部数据, 处理与下载数据回调的处理相同.
CURLOPT_TIMEOUT
超时时间.
CURLOPT_CONNECTIONTIMEOUT
连接等待时间.
CURLOPT_FOLLOWLOCATION
设置支持302重定向
CURLOPT_RANGE
断点续传, 指定传输分片, 格式:"0-200"
4. 开始下载
CURLcode curl_easy_perform(CURL *handle);
全局初始化:
curl_global_init()
CURL_GLOBAL_WIN32 //
#include <iostram>
int main(int argc,char **argv)
CURLode return_code;
return_code=curl_global_init(CURL_GLOBAL_WIN32); //全局初始化
if(CURLE_OK !=return_code)
{
//如果初始化失败
cerr<<"init libcurl failed."<<endl;
return -1;
}
cout<<curl_version()<<endl; //当前版本的字符串描述
curl_version_info_data *p_version=curl_version_info(CURL_VERSION_NOW);
curl_global_cleanup();
return 0;
示列
获取网站包括HTTP头部信息在内的500字节数据.
size_t callback_get_head(void *ptr, size_t size, size_t nmemb, void *userp)
{
strcat( userp, ptr);
return size * nmemb; //必须返回这个大小, 否则只回调一次, 不清楚为何.
}
void *get_head_thread(void *)
{
CURL *curl = curl_easy_init();
curl_easy_setopt(curl, CURLOPT_URL, "www.163.com"); //设置下载的URI
curl_easy_setopt(curl, CURLOPT_TIMEOUT, 20); //设置超时
curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1); //屏蔽其它信号
curl_easy_setopt(curl, CURLOPT_HEADER, 1); //下载数据包括HTTP头部
curl_easy_setopt(curl, CURLOPT_RANGE, "0-500"); //用于断点续传, 设置下载的分片
char buffer[MAXHEADLEN] = {0x0};
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, callback_get_head); //设置下载数据的回调函数
curl_easy_setopt(curl, CURLOPT_WRITEDATA, buffer);
curl_easy_perform(curl);
curl_easy_cleanup(curl);
//此时网站HTTP头信息已经存放在buffer内.
}
说明: void *get_head_thread(void *), 从函数名就可以看出, 这个函数内部的libcurl操作可以放到多线程进行处理, 唯一要注意的就是libcurl的全局初始化必须放在线程之外.
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析