CURL 在多线程应用程序中共享接​​口和 cookie

标签 c libcurl

我使用 libcurl share+easy interface,我需要“修复”一些由网络服务器设置的 cookie 信息。 在我的例子中,我使用了多个线程,我想知道什么时候接收到的 cookie 被“共享”给所有其他 curl 句柄,以及何时是修复接收到的 cookie 数据的正确时间:

  • 就在我从远程服务器收到它时(但此时我不确定损坏的 cookie 数据是否可能被同时发出新 http 请求的其他线程获取)
  • 关于发出新请求以确保我最终不会在新的 http 请求中使用损坏的 cookie。

这是我的代码流程。我调用 curl_easy_perform。当包含 Set-Cookie 的响应进来时,libcurl 首先解析该 cookie 并将其存储在其内部存储中(在 curl 共享接口(interface)的情况下共享)。 然后 curl_easy_perform 返回,现在我尝试检查服务器是否发送我需要“修复”的特定 cookie。要检查该 cookie,唯一的方法是使用 CURLINFO_COOKIELIST

我的问题是:从 curl 解析传入的 Set-Cookie header (带有无效的 cookie 数据)到我使用 CURLINFO_COOKIELIST 检查更新后的无效 cookie 的时间可能会被另一个线程拾取。这意味着为了避免这个问题,除了在每个新请求上检查 cookie 之外,我看不到任何其他选项,以防万一有另一个线程可能使用无效数据更新了 cookie。 即使在这种情况下,我仍然可能最终使用无效的 cookie 数据。换句话说,这个问题没有合适的解决方案。

什么是正确的方法?

最佳答案

通常在多线程中使用 libcurl 时,您在每个线程中使用一个句柄,它们不共享任何东西。然后,您何时修改 cookie 并不重要,因为每个句柄(以及线程)都是独立运行的。

如果你让线程共享 cookie 状态,就像共享接口(interface)一样,那么你就有了锁定互斥锁设置,可以保护数据对象不被多个线程同时访问,这样你就可以继续更新 cookie随时使用正确的 API。

如果您使用多接口(interface),它会在同一个线程中进行并行传输,因此您可以随时更新 cookie,而不会出现任何并行问题。

关于CURL 在多线程应用程序中共享接​​口和 cookie,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46285383/

相关文章:

c - memcpy_s 和 strcpy_s 错误,但手动 for 循环有效

c++ - 使用 cURL/libcurl 上传到 Amazon S3

使用 libcurl 捕获 RTSP 流

c++ - 使用 libcurl/其他库的 facebook 图形 API

c - 从结构数组中提取变量数组

c - While循环第二次忽略scanf

c - getaddrinfo 中的 malloc 校验和不正确

对 C 字符串感到困惑

C++ 是否在多个文件单元中链接相同的静态库会增加大小/膨胀?

c++ - 如何在c++中使用libcurl将POST发送到elasticsearch