libcurl转移状态机

2021-05-10 16:11:03

我努力努力制作演示文稿,我最终呼吁引擎盖下的libcurl。该演示文稿的一部分是在解释主要的libcurl转移状态机器上,我将尝试以书面形式记录一些内容。了解Libcurl中的主要转移状态机可能对任何想要在Libcurl内部工作的人都有价值和有趣,并且可能改善它。

状态在称为Mstate的结构字段中保持轻松句柄。此状态机的源文件称为multi.c。

只要它存在,一个容易的手柄总是恰好的一个状态。

此传输状态机旨在为所有协议Libcurl支持工作,但基本没有协议将通过所有状态转换。正如您在图中看到的那样,来自大量状态有许多不同的可能转变。

转移在Init状态的表面上方启动。这是一个小的开始按钮旁边的一个黄色框。基本上,船展示了它如何从右转到Msgsent与它的完成标志,但实际路径都在表面下完成。

黄色框(状态)是存在之前或在连接的情况下存在的框。条纹背景是针对具有与传输相关联的单个和特定ConnectData结构的所有状态。

如果有连接限制,总计或每个主机等,转移可以被发送到待处理状态以等待变更条件。如果不是,则状态可能会移动到其中一个蓝色,以解析主机名并连接到服务器等。如果可以重用连接,它可以立即快捷方式到绿色do状态。

绿色状态均为设置与完全连接,经过身份验证和登录状态的连接。准备发送第一个请求。

绿色do状态是关于使用一个或多个命令发送请求,以便可以开始文件传输。有几个这样的国家可以正确支持所有协议,也有历史原因。如果我们想要,我们可能会通过一些聪明的reorg来删除一个状态。

发出请求并转移开始时,它会转换为执行。在白色状态数据正在流动。可能很多。可能在两者或任一方向。如果在转移卷曲期间发现转移比允许的速度快,则它将转移到目标,直到它冷却一点。

所有后转移状态都在图片中是红色的。完成是其中的第一个,并且在完成了它需要围绕转移的情况下,它将其解剖与连接并转移完成。这种状态没有条纹。解除分化意味着连接返回到连接池以便稍后重用,或者在最坏的情况下认为它无法重复使用,或者如果应用程序已指示如此,请关闭。

您将注意到,状态机中的任何位置都没有断开连接。这只是因为断开连接并不是传输的一部分。

这是道路的尽头。在此状态下,将创建消息并将传出队列中的用于读取的应用程序,然后作为最终的最后一步,它移动到Msgsent的内容,其中没有什么发生的。

典型的句柄在这种状态下保持直到传输重复使用并重新启动,其中它将再次被设置为初始状态,并且旅程再次开始。可能是此时的其他传输参数和URL。或许不是。

该状态图和解释没有显示在这些状态中,可以在每个状态中,有的协议特定处理,并且当然,这些功能中的每一个功能都有自己的国家机器来控制该做什么以及如何处理和如何处理 协议详细信息。 libcurl中的每个协议都有自己的“协议处理程序”,然后通过从通用零件的呼叫到协议_Handler-&gt等呼叫的调用来完成libcurl中的大多数协议特定事件。proto_connect()调用协议特定连接的proto_connect() 程序。 这允许在本博客文章中描述的通用状态机以真正知道协议细节,并且可以支持所有当前支持26传输协议。 如果您想直接跳过状态机图和以下说明,请访问此处。