libcurl-http发送数据流程

源码目录

docs/example/httpcustomheader.c  添加自定义headers

http-post.c  按字符串推送数据

simplepost.c 按长度推送数据

httpput.c  按文件推送

curl_easy_perform()

easy_transfer()

curl_multi_perform()

multi_runsingle()

CURLM_STATE_CONNECT

Curl_connect() (url.c)

create_conn()

  conn = allocate_conn(data);

  

  conn->recv[FIRSTSOCKET] = Curl_recv_plain;     //默认发送接收数据
  conn->send[FIRSTSOCKET] = Curl_send_plain;
  conn->recv[SECONDARYSOCKET] = Curl_recv_plain;
  conn->send[SECONDARYSOCKET] = Curl_send_plain;

  parseurlandfillconn()

  findprotocol()

    struct Curl_handler *p = Curl_builtin_scheme(protostr);

    conn->handler = conn->given = p;

    Curl_builtin_scheme() (url.c)

      取出对应协议Curl_handler,包括连接,发送,接收处理等

      static const struct Curl_handler * const protocols[] = {

      #ifndef CURL_DISABLE_HTTP
      &Curl_handler_http,
      #endif

      #if defined(USE_SSL) && !defined(CURL_DISABLE_HTTP)
      &Curl_handler_https,
      #endif

CURLM_STATE_DO

multi_do()

  conn->handler->do_it(conn, done);

  Curl_http() (http.c)

  Curl_add_bufferf(&req_buffer,   //http 头数据发送
  "%s" /* ftp typecode (;type=x) */
  " HTTP/%s\r\n" /* HTTP version */

  Curl_add_custom_headers()   //添加自定义http头数据

  if(data->set.postfields) {  //按chunk,数据长度,文件推送数据

  Curl_add_buffer_send() //发送数据

    Curl_write()

      conn->send[] -> Curl_send_plain()

      *written = bytes_written; //保存已发送的数据

原文地址:https://www.cnblogs.com/gluck-sw-life/p/12002772.html

时间: 2024-11-10 08:57:05

libcurl-http发送数据流程的相关文章

Linux网络之设备接口层:发送数据包流程dev_queue_xmit

转自:http://blog.csdn.net/wdscq1234/article/details/51926808 写在前面 本文主要是分析kernel-3.8的源代码,主要集中在Network的netdevice层面,来贯穿interface传输数据包的流程,kernel 博大精深,这也仅仅是一点个人愚见,作为一个笔记形式的文章,如有错误或者表述不当之处,还请大家留言批评指正,非常感谢! 主要涉及的file:kernel-3.18/net/core/dev.c kernel-3.18/net

stm32 usb数据接收与数据发送程序流程分析

http://blog.csdn.net/u011318735/article/details/17424349 既然学习了USB,那就必须的搞懂USB设备与USB主机数据是怎么通讯的.这里主要讲设备端,因为我们的代码是做USB设备用的. 我们需要必须要定义了USB中断.起始在STM32的中断向量表中给USB两个中断,我们可以在stm32f10x.h中找到这两个中断: USB_HP_CAN1_TX_IRQn = 19, /*!< USB Device High Priority or CAN1

[转帖]Linux TCP/IP协议栈,数据发送接收流程,TCP协议特点

Linux TCP/IP协议栈,数据发送接收流程,TCP协议特点 http://network.51cto.com/art/201909/603780.htm 可以毫不夸张的说现如今的互联网是基于TCP/IP构建起来的网络.弄懂协议栈的原理,无论对调试网络IO性能还是解决网络问题都是有很大帮助的.本片文章就带领大家来看看内核是如何控制网络数据流的. 作者:底层软件架构来源:今日头条|2019-09-30 09:28 收藏 分享 可以毫不夸张的说现如今的互联网是基于TCP/IP构建起来的网络.弄懂

sim800 gprs发送数据的AT流程

switch(send_flag) { case 1: uart_send(&huart4,"AT\r\n",4); //AT break; case 2: uart_send(&huart4,"ATE1\r\n",sizeof("ATE1\r\n")-1); //回显 break; case 3: uart_send(&huart4,"AT+CSCLK=0\r\n",sizeof("AT+C

(转) c/c++调用libcurl库发送http请求的两种基本用法

libcurl主要提供了两种发送http请求的方式,分别是Easy interface方式和multi interface方式,前者是采用阻塞的方式发送单条数据,后者采用组合的方式可以一次性发送多条数据 一.Easy interface libcurl的easy interface是最基本的用法,简要流程为: 1.在主线程中调用curl_global_init(CURL_GLOBAL_ALL)初始化 2.调用curl_easy_init获取一个句柄: 3.调用curl_easy_setopt函数

client_pbc.c模块数据流程

从命令行传入参数,client端的hostname或者IP地址,默认为 127.0.0.1.因此该模块是实现本机通信的. 也就是文档中说的 netlink传递参数. 首先调用socket,将第三个参数设置为 NATLINK_PBC(定义为31) 然后bind. 然后sendto,向核态发送信息.这里的基本用法,以及报文的封装与解封,用法都是固定的,可以参考的. 下面是一个死循环. 该循环的作用就是: 从核态接收信息,并根据其传递的操作命令.做出相应的相应. 实际上只有两种动作: 一个是f_sig

Linux内核--网络栈实现分析(八)--应用层发送数据(下)

本文分析基于Linux Kernel 1.2.13 原创作品,转载请标明http://blog.csdn.net/yming0221/article/details/7547826 更多请查看专栏,地址http://blog.csdn.net/column/details/linux-kernel-net.html 作者:闫明 注:标题中的”(上)“,”(下)“表示分析过程基于数据包的传递方向:”(上)“表示分析是从底层向上分析.”(下)“表示分析是从上向下分析. 下面是发送数据的流程: 应用层

微信硬件蓝牙扫描绑定JSAPI发送数据

1:登录微信公众平台   查看权限接口  看设备功能是否开通 如果已开通(进行已下操作)   未开通先去开通 2:找到功能里面的  设备功能点击进去 选择添加产品  如果是蓝牙 选择蓝牙系列的 我这里是蓝牙就说蓝牙的 创建完成  回给你个产品ID  继续以下操作 3:开发者工具  在线调式  现获取token 3.1-接着选择 硬件调式api   选择设备授权获取deciceid和二维码/device/getqrcode     下面会出现让你填写刚刚获取到的token 填完token 后面千万

Qt模拟串口-tcp连接发送数据

上一节已经基本上完成了qt界面的基本布局,下面就是后台数据的发送和接收了, 前面说了,qt和uc/os 交互使用的方式是tcp 为啥要用tcp,而不使用别的呢, udp:按道理udp是最好的,不用连接,想发就发,不用管端口.但是,qt这个鬼,他封装的udp函数不支持服务器下发数据,也就是udp的服务器不能下发数据,只能接收. 串口:既然是串口通讯,为啥不直接用串口呢.c语言对串口的支持太差了, 很不好用,qt到还好,找个插件就能完成, 所以最后就采用了tcp的传输方式,既可以收发,也可以同时对应