multi接口的使用

这个文档是小编在curl官网上使用谷歌翻译翻译的,详细信息看官网

curl

描述

这是关于如何在 C 程序中使用 libcurl 多接口的概述。这里提到的每个函数都有特定的手册页。还有libcurl-tutorial手册页用于使用 libcurl 进行编程的完整教程,以及libcurl-easy手册页用于概述 libcurl 简易界面。

multi 接口中的所有函数都以 curl_multi 为前缀。

特点

多界面提供了简单界面所没有的多种功能。它们主要是:

1.启用“拉”接口。使用 libcurl 的应用程序决定何时何地要求 libcurl 获取/发送数据。

2.在同一线程中启用多个句柄同时传输,而不会使应用程序变得复杂。

3. 应用程序能够同时等待对其自己的文件描述符和 curl 的文件描述符的操作。

4. 启用基于事件的处理并将传输扩展到数千个并行连接。

一个multi句柄多个easy句柄

multi 接口的使用流程:

1、要使用multi 接口,首先是要使用curl_multi_init创建一个“multi句柄” 。然后,此句柄用作所有其他 curl_multi_* 函数的输入。

2、使用多句柄和多接口,可以并行进行多个传输流程。每个单次传输都是围绕一个简单的手柄建立的。因此我们需要创建所需的所有简单句柄,并使用curl_easy_setopt为每个简单句柄设置适当的选项。

3、多接口有两种风格,一种是面向 select() 的,一种是基于事件的,我们称之为 multi_socket。下面将是对这两种方式的讲解,以了解它们的工作原理和区别。

**select() 的方式:主要讲述一些函数的使用 **

当一个多句柄设置并准备好传输时,并不是像使用简单接口进行传输时那样使用curl_easy_perform

而是需要将所有的简单 句柄使用函数curl_multi_add_handle添加到多句柄。我们随时将简单的句柄添加到多句柄,即使其他传输已经在运行。

而当 我们使用完简单句柄之后可以使用curl_multi_remove_handle从多句柄的堆栈中删除简单句柄。从多句柄中移除后,仍然可以再次使用其他简单的界面功能。

需要注意的是将简单句柄添加到多句柄不会启动传输。多句柄的传输是由curl_multi_perform来推动传输。多此界面的主要思想之一是让应用程序驱动传输。如果有任何可传输的内容,它将在当前多句柄堆栈中所有正在传输的任务(无论在传输啥东西)中传输数据进行传输。这可能是全部,也可能没有。当现在没有更多事情要做时,它会返回到调用应用程序。

我们要是想获取libcurl是何时被程序所调用、数据传输信息和其他工作信息的话 ,我们可以使用curl_multi_poll,这个函数会在应用程序下次调用libcurl的时候,它从 libcurl 中提取 fd_set 以便在 select() 或 poll() 调用中使用,从而了解何时需要注意多堆栈中的传输。之前使用的API 是curl_multi_fdset。这两个 API 都允许您的程序同时等待您自己的私有文件描述符的输入。curl_multi_timeout还可以帮助您为 select() 调用提供合适的超时时间。

curl_multi_perform将正在 运行传输的任务数量纯纯在其输入的参数之中,我们可通过读取此参数,从而确定多句柄中的所有传输何时完成。“完成”并不意味着成功。一项或多项传输可能已失败。

要获取有关已完成传输的信息,以确定是否成功,应调用curl_multi_info_read 。它可以返回有关当前或先前传输的消息。重复调用该函数会获得更多消息,直到消息队列为空。您在那里收到的信息包括一个易于处理的指针,您可以使用它来识别哪些易于处理的信息涉及。

单次传输完成后,简单句柄仍会添加到多堆栈中。您需要首先使用 curl_multi_remove_handle 删除简单句柄,然后使用curl_easy_cleanup将其关闭,或者可能为其设置新选项并使用curl_multi_add_handle再次添加以开始另一次传输。

当多堆栈中的所有传输完成后,使用curl_multi_cleanup关闭多句柄。请注意,您必须为每个简单的句柄调用单独的curl_easy_cleanup调用以正确清理它们。

如果您想重新使用添加到多手柄的简单手柄进行传输,您必须首先将其从多堆栈中移除,然后再次重新添加(可能在您选择更改某些选项之后)。

多套接字的使用:

curl_multi_socket_action函数为应用程序提供了一种方法,他不仅可以避免被迫使用 select(),而且还提供了更高性能的 API,这将对使用大量同时连接的应用程序产生重大影响。

使用curl_multi_socket_action代替curl_multi_perform

使用此 API 时,您可以像使用普通的多接口一样将简单的句柄添加到多句柄。然后,您还使用CURLMOPT_SOCKETFUNCTIONCURLMOPT_TIMERFUNCTION选项将两个回调设置为curl_multi_setopt。它们是 libcurl 将调用的两个回调函数,其中包含有关等待哪些套接字、进行哪些活动以及当前超时时间的信息 - 如果过期,则应通知 libcurl。

multi_socket API 旨在通知您的应用程序 libcurl 当前正在使用哪些套接字,以及您的应用程序预期在这些套接字上等待哪些活动(读取和/或写入)。

您的应用程序必须确保接收到在CURLMOPT_SOCKETFUNCTION回调中通知的所有套接字,并确保它对它们上的给定活动做出反应。当套接字具有给定的活动时,您调用curl_multi_socket_action指定存在的套接字和操作。

调用 CURLMOPT_TIMERFUNCTION回调来设置超时。当该超时到期时,您的应用程序应该调用curl_multi_socket_action函数,说明这是由于超时。

此 API 通常与应用程序“订阅”套接字更改的事件驱动的底层功能(如 libevent、libev、kqueue、epoll 或类似功能)一起使用。这允许应用程序和 libcurl 更好地向上扩展并超过数千个同时传输而不会损失性能。

添加初始句柄集后,调用curl_multi_socket_action并在 sockfd 参数中设置 CURL_SOCKET_TIMEOUT ,您将获得设置您的回调调用,然后当您在被询问的套接字上获得活动时继续调用curl_multi_socket_action等待,或者超时计时器到期。

您可以轮询curl_multi_info_read以查看是否有任何传输已完成,因为它会显示一条消息。

阻塞

代码中的一些区域仍在使用阻塞代码,即使从多界面使用也是如此。虽然我们当然希望并打算在未来修复这些问题,但您应该了解以下当前限制:

- 名称解析,除非使用 c-ares 或线程解析器后端 - 文件:// 传输 - TELNET 传输

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值