当前位置: 首页 > news >正文

mongoose之http调试代码

  1. 使用版本"7.14"

  2. 交互流程图如下:
    在这里插入图片描述

  3. 关键函数

  • mg_mgr_init函数
void mg_mgr_init(struct mg_mgr *mgr) {memset(mgr, 0, sizeof(*mgr));
#if MG_ENABLE_EPOLLif ((mgr->epoll_fd = epoll_create1(EPOLL_CLOEXEC)) < 0)MG_ERROR(("epoll_create1 errno %d", errno));
#elsemgr->epoll_fd = -1;
#endif
#if MG_ARCH == MG_ARCH_WIN32 && MG_ENABLE_WINSOCK// clang-format off{ WSADATA data; WSAStartup(MAKEWORD(2, 2), &data); }// clang-format on
#elif MG_ENABLE_FREERTOS_TCPmgr->ss = FreeRTOS_CreateSocketSet();
#elif defined(__unix) || defined(__unix__) || defined(__APPLE__)// Ignore SIGPIPE signal, so if client cancels the request, it// won't kill the whole process.signal(SIGPIPE, SIG_IGN);
#elif MG_ENABLE_TCPIP_DRIVER_INIT && defined(MG_TCPIP_DRIVER_INIT)MG_TCPIP_DRIVER_INIT(mgr);
#endifmgr->pipe = MG_INVALID_SOCKET;mgr->dnstimeout = 3000;mgr->dns4.url = "udp://8.8.8.8:53";mgr->dns6.url = "udp://[2001:4860:4860::8888]:53";mg_tls_ctx_init(mgr);
}

这是初始化一个mongoose管理结构体,在后面整个程序运行周期中都需要使用。结构体中的struct mg_connection *conns,是链接管理列表,每次有客户端连接都会创建一个id不一样的链接并添加到链接列表中。

  • mg_http_listen函数
struct mg_connection *mg_http_listen(struct mg_mgr *mgr, const char *url,mg_event_handler_t fn, void *fn_data) {struct mg_connection *c = mg_listen(mgr, url, fn, fn_data);if (c != NULL) c->pfn = http_cb;return c;
}struct mg_connection *mg_listen(struct mg_mgr *mgr, const char *url,mg_event_handler_t fn, void *fn_data) {struct mg_connection *c = NULL;if ((c = mg_alloc_conn(mgr)) == NULL) {MG_ERROR(("OOM %s", url));} else if (!mg_open_listener(c, url)) {MG_ERROR(("Failed: %s, errno %d", url, errno));MG_PROF_FREE(c);free(c);c = NULL;} else {c->is_listening = 1;c->is_udp = strncmp(url, "udp:", 4) == 0;LIST_ADD_HEAD(struct mg_connection, &mgr->conns, c);c->fn = fn;c->fn_data = fn_data;mg_call(c, MG_EV_OPEN, NULL);if (mg_url_is_ssl(url)) c->is_tls = 1;  // Accepted connection mustMG_DEBUG(("%lu %ld %s", c->id, c->fd, url));}return c;
}

创建一个监听链接,专门用来监听有没有客户端连接。(这里仅仅只是创建一个链接并添加到链接列表中),c->is_listening = 1。并添加了http协议处理回调函数( c->pfn = http_cb)。这个是接收底层数据后,对底层数据进行解析的回调。并且注册了事件处理函数(c->fn = fn)。对http协议解析后进一步进行处理。

  • mg_mgr_poll函数
  struct mg_connection *c, *tmp;uint64_t now;printf("i----------------------------\r\n");mg_iotest(mgr, ms);now = mg_millis();mg_timer_poll(&mgr->timers, now);for (c = mgr->conns; c != NULL; c = tmp) {printf("++++++++++++is_listening %d,is_udp %d\r\n",c->is_listening,c->is_udp);bool is_resp = c->is_resp;tmp = c->next;mg_call(c, MG_EV_POLL, &now);if (is_resp && !c->is_resp) {printf("====================possible?\r\n");long n = 0;mg_call(c, MG_EV_READ, &n);}MG_VERBOSE(("%lu %c%c %c%c%c%c%c %lu %lu", c->id,c->is_readable ? 'r' : '-', c->is_writable ? 'w' : '-',c->is_tls ? 'T' : 't', c->is_connecting ? 'C' : 'c',c->is_tls_hs ? 'H' : 'h', c->is_resolving ? 'R' : 'r',c->is_closing ? 'C' : 'c', mg_tls_pending(c), c->rtls.len));if (c->is_resolving || c->is_closing) {// Do nothing} else if (c->is_listening && c->is_udp == 0) {if (c->is_readable) accept_conn(mgr, c);} else if (c->is_connecting) {if (c->is_readable || c->is_writable) connect_conn(c);//} else if (c->is_tls_hs) {//  if ((c->is_readable || c->is_writable)) mg_tls_handshake(c);} else {if (c->is_readable) read_conn(c);if (c->is_writable) write_conn(c);}if (c->is_draining && c->send.len == 0) c->is_closing = 1;if (c->is_closing) close_conn(c);}
}
  1. mg_iotest: 会去监听每个链接,查看链接是否有读的数据,写的数据,或者新的链接。c->is_readable/c->is_writable主要设置这两个变量。
  2. mg_timer_poll: 轮询处理定时器任务处理。
  3. mg_call(c, MG_EV_POLL, &now): 这个用的很妙,比如在发送比较大的文件时,会去调用如static_cb回调函数。每次轮询到此位置时,都会去进入到static_cb函数中,然后填充c->send缓冲区。
  4. mg_call(c, MG_EV_READ, &n): 这个是在数据处理完时,会去读有没有新的http请求进来。如果有继续处理?
  5. write_conn: 发送数据。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 星环科技推出知识库产品 AI PC时代数据交互方式变革
  • 【开发实战】QT5 + OpenCV4 开发环境配置应用演示
  • js-vue中多个按钮状态选中类似于复选框与单选框实现
  • 硅纪元视角 | 语音克隆突破:微软VALL-E 2,Deepfake新纪元!
  • 夏老师小课堂(15)丨空心杯电机基础入门(上海鸣志电器)
  • 【Go系列】Go的UI框架GIO
  • SpringBoot集成Tomcat、DispatcherServlet
  • 【监控软件】Zabbix
  • 【Langchain大语言模型开发教程】基于文档问答
  • 太原高校大学智能制造实验室数字孪生可视化系统平台建设项目验收
  • 基于区块链技术的高校教育资源共享的研究
  • Animate.css的使用
  • 视图,存储过程和触发器
  • 若依 ruoyi poi Excel合并行的导入
  • labview实现两台电脑共享变量传输及同步
  • ----------
  • [译] 怎样写一个基础的编译器
  • 【前端学习】-粗谈选择器
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • Angular Elements 及其运作原理
  • flutter的key在widget list的作用以及必要性
  • gulp 教程
  • JAVA之继承和多态
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • session共享问题解决方案
  • Solarized Scheme
  • SpringBoot 实战 (三) | 配置文件详解
  • SSH 免密登录
  • vue-cli在webpack的配置文件探究
  • webpack入门学习手记(二)
  • 翻译 | 老司机带你秒懂内存管理 - 第一部(共三部)
  • 极限编程 (Extreme Programming) - 发布计划 (Release Planning)
  • 讲清楚之javascript作用域
  • 前端技术周刊 2018-12-10:前端自动化测试
  • 为什么要用IPython/Jupyter?
  • ​补​充​经​纬​恒​润​一​面​
  • !$boo在php中什么意思,php前戏
  • #if 1...#endif
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • (python)数据结构---字典
  • (安全基本功)磁盘MBR,分区表,活动分区,引导扇区。。。详解与区别
  • (八)光盘的挂载与解挂、挂载CentOS镜像、rpm安装软件详细学习笔记
  • (补充)IDEA项目结构
  • (第三期)书生大模型实战营——InternVL(冷笑话大师)部署微调实践
  • (附源码)springboot助农电商系统 毕业设计 081919
  • (附源码)计算机毕业设计SSM基于健身房管理系统
  • (附源码)计算机毕业设计SSM智慧停车系统
  • (介绍与使用)物联网NodeMCUESP8266(ESP-12F)连接新版onenet mqtt协议实现上传数据(温湿度)和下发指令(控制LED灯)
  • (幽默漫画)有个程序员老公,是怎样的体验?
  • (原創) 博客園正式支援VHDL語法著色功能 (SOC) (VHDL)
  • (转)chrome浏览器收藏夹(书签)的导出与导入
  • .NET Core跨平台微服务学习资源
  • .NET国产化改造探索(一)、VMware安装银河麒麟
  • .NET值类型变量“活”在哪?
  • /etc/fstab和/etc/mtab的区别