• 忘掉天地
  • 仿佛也想不起自己
bingliaolongBingliaolong  2023-11-20 17:57 Aet 隐藏边栏 |   抢沙发  26 
文章评分 1 次,平均分 5.0

特点

  1. libcurl 基本是线程安全的,但在多线程环境下需要注意
  2. 避免在多个线程中共享同一个 CURL 句柄
    1. 使用共享句柄(CURLSH)时需特别注意线程安全

性能

  1. 考虑使用持久连接(Keep-Alive

    1. 尽可能重用 CURL 句柄以利用持久连接(Keep-Alive),这可以提高性能
  2. 根据需要设置合适的超时选项

安全

  1. 如果涉及敏感数据,确保使用 HTTPS
  2. 考虑验证服务器的 SSL 证书

断点续传

  1. 如果需要,可以通过设置 CURLOPT_RANGE 来支持断点续传

基本步骤

  1. 初始化
    1. 初始化libcurl

  1. 创建curl句柄

  1. 设置curl选项

  1. 执行curl请求
    1. 需要检查返回值,以确定是否发生了错误
    2. 使用 curl_easy_strerror() 函数获取错误描述

  1. 资源清理
    1. 使用 curl_easy_cleanup() 清理 CURL 句柄
    2. 使用 curl_global_cleanup() 清理 libcurl 库(通常在程序结束时执行)

其他选项

URL

  1. CURLOPT_URL:设置请求的 URL
  2. CURLOPT_REFERER:设置 HTTP Referer 头部

网络选项

  1. CURLOPT_TIMEOUT:设置最大请求时间
  2. CURLOPT_CONNECTTIMEOUT:设置连接超时时间
  3. CURLOPT_FOLLOWLOCATION:启用或禁用重定向

SSL/TLS

  1. CURLOPT_SSL_VERIFYPEER:是否验证对等证书
  2. CURLOPT_SSL_VERIFYHOST:验证服务器证书的主机名
  3. CURLOPT_CAINFO:指定一个包含受信任 CA 证书的文件

HTTP

  1. CURLOPT_USERAGENT:设置用户代理
  2. CURLOPT_HTTPHEADER:设置自定义 HTTP 头部
  3. CURLOPT_COOKIE:设置发送到服务器的 Cookie
  4. CURLOPT_POST:启用或禁用 POST 请求
  5. CURLOPT_POSTFIELDS:设置 POST 请求的数据

数据处理

  1. CURLOPT_WRITEFUNCTION:指定写入数据的回调函数
  2. CURLOPT_READFUNCTION:指定读取数据的回调函数
  3. CURLOPT_WRITEDATA:设置写入数据的指针(通常是文件指针或内存缓冲区)
  4. CURLOPT_HEADERFUNCTION:指定处理头部数据的回调函数

认知和安全

  1. CURLOPT_USERNAMECURLOPT_PASSWORD:设置用于服务器认证的用户名和密码
  2. CURLOPT_HTTPAUTH:设置 HTTP 认证方法(如基本、摘要等)

性能和行为

  1. CURLOPT_VERBOSE:启用详细模式,用于调试
  2. CURLOPT_NOPROGRESS:启用或禁用进度回调函数
  3. CURLOPT_NOSIGNAL:指示 libcurl 是否应使用信号

上传和下载

  1. CURLOPT_UPLOAD:启用或禁用上传模式
  2. CURLOPT_INFILESIZE:设置要上传的文件的大小

QA

每一个curl句柄对应着一个持久连接吗

  1. 每个 CURL 句柄并不自动对应一个持久连接(Keep-Alive
  2. libcurl 支持在多个请求之间重用连接,这是通过 HTTPKeep-Alive 特性实现的

http keep-alive libcurl

  1. HTTP/1.1 协议默认开启了 Keep-Alive 特性,它允许在同一 TCP 连接上发送和接收多个 HTTP 请求/响应,而不是每个请求/响应都建立新的连接
  2. 这种机制减少了连接和断开的开销,提高了效率,特别是在多个请求发送到同一服务器时
  3. 当使用 libcurl 发送请求时,如果服务器支持 Keep-Alivelibcurl 会尝试复用现有的 TCP 连接,而不是每次请求都建立新连接
  4. 为了重用连接,你需要使用同一个 CURL 句柄进行多次请求,或者使用 libcurl 的多接口来管理多个句柄
    1. 对同一个服务器进行多个请求时,可以用同一个 CURL 句柄重复调用 curl_easy_perform()
      这样做时,libcurl 会尝试重用该句柄的连接
    2. 对于并行的多个请求,可以使用 libcurl 的多接口(CURLM
      多接口允许你同时处理多个 CURL 句柄,这些句柄在可能的情况下会共享连接
  5. 注意点:
    1. 连接重用取决于服务器是否支持 Keep-Alive
    2. 如果服务器在响应中明确关闭了 Keep-Alive(例如通过 Connection: close 头部),libcurl 将不会重用连接
    3. 即使 Keep-Alive 被启用,连接也不会无限期保持开放。服务器可能会在一定时间后关闭长时间闲置的连接
    4. DNS 解析结果和 SSL/TLS 会话也可能被缓存并重用,这进一步提高了性能
    5. libcurl 的不同版本可能在连接重用机制上有所差异,始终建议使用最新版 libcurl

libcurl连接前后

  1. 当初始化一个 CURL 句柄时,其实是在为一个潜在的网络请求配置和准备环境,但此时还没有建立与服务器的实际连接
  2. libcurl 中,连接的建立通常发生在调用 curl_easy_perform() 或类似函数时,而不是在句柄初始化时
    1. 只有在调用 curl_easy_perform() 时,libcurl 才真正尝试与服务器建立连接
    2. 当调用 curl_easy_perform() 时,libcurl 根据之前设置的选项建立网络连接,并执行请求
    3. 如果连接成功,libcurl 会发送请求(如 HTTP GET POST 请求),并接收响应
    4. 在数据传输完成后,连接可能会根据 HTTP Keep-Alive 头保持开放状态,以供后续请求重用

libcurl整体连接理解

  1. 建立连接
    1. 当调用 curl_easy_perform() 时,libcurl 会根据之前设置的选项尝试与服务器建立连接
  2. 底层socket
    1. 在建立连接的过程中,libcurl(在底层)会为客户端创建一个 socket,并通过这个 socket 与服务器的相应 socket 建立通信
  3. keep-alive
    1. 如果服务器支持 Keep-AliveHTTP/1.1 默认支持),则在一次请求完成后,服务器端的 socket 可能不会立即关闭,而是保持一段时间的开放状态
    2. 在这段时间内,如果使用同一 CURL 句柄发起另一个请求到相同的服务器,libcurl 会尝试重用现有的 socket,而不是创建一个新的
  4. 持续通信
    1. 当使用 Keep-Alive 特性时,客户端(即 libcurl)管理的 socket 可以在一段时间内重用,用于与服务器的持续通信
  5. 补充
    1. 值得注意的是,连接重用不仅限于使用相同的 CURL 句柄
      如果您使用 libcurl 的多句柄接口(CURLM),在某些情况下,libcurl 可以在不同的 CURL 句柄之间智能地重用连接
    2. 服务器可能会根据其配置和负载情况决定保持连接开放的时间
      也就是说,即使客户端希望重用连接,服务器也可能因为各种原因(如超时或资源限制)而关闭连接

本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

bingliaolong
Bingliaolong 关注:0    粉丝:0 最后编辑于:2023-12-03
Everything will be better.

发表评论

表情 格式 链接 私密 签到
扫一扫二维码分享