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

libsoup的简单使用

基于GLib和libsoup的简单Web服务器示例,它可以处理静态HTML文件和动态JSON请求,并展示如何获取URL参数。

步骤:

  1. 初始化GLib和libsoup。
  2. 创建一个处理静态HTML文件的处理器。
  3. 创建一个处理动态JSON请求的处理器。
  4. 获取URL参数并在JSON响应中返回。

代码:

#include <libsoup/soup.h>
#include <glib.h>// 处理静态HTML文件请求
static void handle_static_html(SoupServer *server, SoupMessage *msg, const char *path, GHashTable *query, SoupClientContext *client, gpointer user_data) {SoupMessageHeaders *response_headers = msg->response_headers;soup_message_headers_set_content_type(response_headers, "text/html", NULL);// 读取静态HTML文件GError *error = NULL;gchar *content = NULL;g_file_get_contents("/path/to/static.html", &content, NULL, &error);if (error) {soup_message_set_status(msg, SOUP_STATUS_INTERNAL_SERVER_ERROR);soup_message_body_append(msg->response_body, SOUP_MEMORY_COPY, "Internal Server Error", 21);g_error_free(error);} else {soup_message_set_status(msg, SOUP_STATUS_OK);soup_message_body_append(msg->response_body, SOUP_MEMORY_COPY, content, strlen(content));g_free(content);}soup_message_body_complete(msg->response_body);
}// 处理动态JSON请求
static void handle_dynamic_json(SoupServer *server, SoupMessage *msg, const char *path, GHashTable *query, SoupClientContext *client, gpointer user_data) {SoupMessageHeaders *response_headers = msg->response_headers;soup_message_headers_set_content_type(response_headers, "application/json", NULL);// 获取URL参数const char *name = g_hash_table_lookup(query, "name");if (!name) {name = "World";}// 创建JSON响应gchar *response = g_strdup_printf("{\"message\": \"Hello, %s!\"}", name);soup_message_set_status(msg, SOUP_STATUS_OK);soup_message_body_append(msg->response_body, SOUP_MEMORY_COPY, response, strlen(response));g_free(response);soup_message_body_complete(msg->response_body);
}int main(int argc, char *argv[]) {GMainLoop *loop = g_main_loop_new(NULL, FALSE);SoupServer *server = soup_server_new(SOUP_SERVER_SERVER_HEADER, "example-server", NULL);// 添加处理器soup_server_add_handler(server, "/static", handle_static_html, NULL, NULL);soup_server_add_handler(server, "/dynamic", handle_dynamic_json, NULL, NULL);// 监听端口soup_server_listen_all(server, 8080, 0, NULL);g_print("Server running on http://localhost:8080\n");g_main_loop_run(loop);// 清理g_object_unref(server);g_main_loop_unref(loop);return 0;
}

编译和运行:

  1. 确保安装了gliblibsoup库。
  2. 使用以下命令编译代码:
    gcc -o webserver webserver.c `pkg-config --cflags --libs glib-2.0 libsoup-2.4`
    
  3. 运行生成的可执行文件:
    ./webserver
    

这个示例展示了如何使用libsoup创建一个简单的Web服务器,处理静态HTML文件和动态JSON请求,并获取URL参数。你可以根据需要扩展和修改这个示例。

soup_message_body_append 函数

GitHub Copilot: 在libsoup中,soup_message_body_append函数用于将数据添加到SoupMessageBody中。该函数的第二个参数是一个枚举类型,用于指定如何处理传入的数据。这个枚举类型是SoupMemoryUse,它定义了几种不同的内存管理策略。

SoupMemoryUse 枚举类型

以下是SoupMemoryUse枚举类型的几种常见值及其含义:

  1. SOUP_MEMORY_STATIC:

    • 表示传入的数据是静态的,不会被修改或释放。
    • 适用于常量字符串或全局变量。
    • 例子:
      const char *static_data = "Hello, World!";
      soup_message_body_append(body, SOUP_MEMORY_STATIC, static_data, strlen(static_data));
      
  2. SOUP_MEMORY_TEMPORARY:

    • 表示传入的数据是临时的,libsoup会在内部复制一份。
    • 适用于临时变量或局部变量。
    • 例子:
      char temp_data[] = "Temporary Data";
      soup_message_body_append(body, SOUP_MEMORY_TEMPORARY, temp_data, strlen(temp_data));
      
  3. SOUP_MEMORY_COPY:

    • 表示传入的数据需要被复制,libsoup会创建一份新的副本。
    • 适用于需要确保数据独立于原始数据的情况。
    • 例子:
      char *dynamic_data = g_strdup("Dynamic Data");
      soup_message_body_append(body, SOUP_MEMORY_COPY, dynamic_data, strlen(dynamic_data));
      g_free(dynamic_data); // 原始数据可以安全释放
      
  4. SOUP_MEMORY_TAKE:

    • 表示传入的数据的所有权将被libsoup接管,libsoup负责释放内存。
    • 适用于动态分配的内存,且不再需要手动管理内存释放。
    • 例子:
      char *dynamic_data = g_strdup("Dynamic Data");
      soup_message_body_append(body, SOUP_MEMORY_TAKE, dynamic_data, strlen(dynamic_data));
      // 不需要手动释放 dynamic_data,libsoup 会负责
      

示例代码

以下是一个使用SoupMemoryUse枚举类型的示例代码:

#include <libsoup/soup.h>
#include <glib.h>int main() {SoupMessageBody *body = soup_message_body_new();// 使用 SOUP_MEMORY_STATICconst char *static_data = "Static Data";soup_message_body_append(body, SOUP_MEMORY_STATIC, static_data, strlen(static_data));// 使用 SOUP_MEMORY_TEMPORARYchar temp_data[] = "Temporary Data";soup_message_body_append(body, SOUP_MEMORY_TEMPORARY, temp_data, strlen(temp_data));// 使用 SOUP_MEMORY_COPYchar *dynamic_data_copy = g_strdup("Dynamic Data Copy");soup_message_body_append(body, SOUP_MEMORY_COPY, dynamic_data_copy, strlen(dynamic_data_copy));g_free(dynamic_data_copy); // 原始数据可以安全释放// 使用 SOUP_MEMORY_TAKEchar *dynamic_data_take = g_strdup("Dynamic Data Take");soup_message_body_append(body, SOUP_MEMORY_TAKE, dynamic_data_take, strlen(dynamic_data_take));// 不需要手动释放 dynamic_data_take,libsoup 会负责// 清理soup_message_body_free(body);return 0;
}

通过这些枚举值,你可以灵活地管理传入数据的内存,确保在不同场景下的内存安全和效率。

相关文章:

libsoup的简单使用

基于GLib和libsoup的简单Web服务器示例&#xff0c;它可以处理静态HTML文件和动态JSON请求&#xff0c;并展示如何获取URL参数。 步骤&#xff1a; 初始化GLib和libsoup。创建一个处理静态HTML文件的处理器。创建一个处理动态JSON请求的处理器。获取URL参数并在JSON响应中返回…...

electron项目搭建

前言&#xff1a;electron是一个跨平台桌面端应用开发工具。它将整个系统内容分为主进程和渲染进程两个部分(你可以粗略的理解为electron项目开启了两个服务器&#xff0c;一个渲染页面另一个处理electron窗口内容)。这两个"服务器"之间通过JS Bridge进行通信(即&…...

【CVPR2024】Efficient LoFTR: 高效的 LoFTR:具有类似稀疏的速度的半密集局部特征匹配

Efficient LoFTR: 高效的 LoFTR&#xff1a;具有类似稀疏的速度的半密集局部特征匹配 Efficient LoFTR realtime_demo 0.摘要 \qquad 我们提出了一种新的方法来有效地产生跨图像的半密集匹配。以往的无探测器匹配器LoFTR在处理大视点变化和纹理差的场景下表现出了出色的匹配能力…...

【Golang 面试 - 基础题】每日 5 题(九)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/UWz06 &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 Golang 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏…...

《程序猿入职必会(4) · Vue 完成 CURD 案例 》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…...

编程技巧:如何优雅地合并两个有序数组?

目录 题目引用描述1.直接合并 排序2.指针3.后逆向双指针进阶&#xff1a;你可以设计实现一个时间复杂度为 O(m n) 的算法解决此问题吗&#xff1f;总结 题目 来自力扣 引用 合并两个有序数组 给你两个按 **非递减顺序 **排列的整数数组 nums1 和 nums2&#xff0c;另有两个整…...

Vue组件库移动端预览实现原理

引言 大家如果使用过移动端组件库&#xff08;比如&#xff1a;Vant&#xff09;&#xff0c;会发现在网站右侧有一个手机端的预览效果。 而且这个手机端预览的内容和外面的组件代码演示是同步的&#xff0c;切换组件的时候&#xff0c;移动端预览的内容也会发生相应的变化。 …...

FastAPI(七十五)实战开发《在线课程学习系统》接口开发-- 创建课程

源码见&#xff1a;"fastapi_study_road-learning_system_online_courses: fastapi框架实战之--在线课程学习系统" 上次我们分享了&#xff0c;FastAPI&#xff08;七十四&#xff09;实战开发《在线课程学习系统》接口开发-- 删除留言 从本篇文章开始&#xff0c;…...

【C++】 条件变量实现线程同步示例

在做一些比较大的项目的时候&#xff0c;需要实现线程同步&#xff0c; 这里结合一个小示例&#xff0c;进行线程同步的讲解 问题定义 以下是一个使用 C 多线程和条件变量的示例&#xff0c;展示了线程 A 接收一个 enable 信号并通知线程 B 开始工作。线程 B 在开始工作之前…...

linux下载redis安装并指定配置文件启动

linux下载redis并安装启动&#xff1a; cd /usr/local/src 下载redis压缩包 wget http://download.redis.io/releases/redis-6.2.6.tar.gz 解压 tar -xzf redis-6.2.6.tar.gz 编译和安装redis make make install 安装完成后进入 redis 安装目录 cd /usr/local/bin 修改…...

线性结构、线性表、顺序表、链表、头插法、尾插法、中间插入或删除一个节点

梳理几个名词&#xff1a; 逻辑地址&#xff1a;就是说是第几个元素。 物理地址&#xff1a;也就是存储地址&#xff0c;在计算机里具体存放的位置。 线性表的存储结构分为&#xff1a; &#xff08;1&#xff09;顺序存储结构&#xff1a;将数据依次存储在连续的整块物理空…...

C# Task.WaitAll 的用法

目录 简介 1.WaitAll(Task[], Int32, CancellationToken) 2.WaitAll(Task[]) 3.WaitAll(Task[], Int32) 4.WaitAll(Task[], CancellationToken) 5.WaitAll(Task[], TimeSpan) 结束 简介 Task.WaitAll 是 C# 中用于并行编程的一个的方法&#xff0c;它属于 System.Threa…...

vue2 前端实现pdf在线预览(无插件版)

toFielDetail()是点击预览的方法&#xff0c;getOfficialFile是获取文件流的接口正常定义即可&#xff1a; export function getOfficialFile(query) {return request({url: /dataAsset/projectassess/getOfficialFile,method: get,params: query,}); } 调用接口的页面需要引用…...

排序XXXXXXXXX

信息学奥赛&#xff5c;常见排序算法总结&#xff08;C&#xff0b;&#xff09; - 腾讯云开发者社区-腾讯云 (tencent.com) https://cloud.tencent.com/developer/news/975232 常用序号层级排序 一、序号 序号Sequence Number&#xff0c;有顺序的号码&#xff0c;如数字序号…...

【文件解析漏洞】实战详解!

漏洞描述&#xff1a; 文件解析漏洞是由于中间件错误的将任意格式的文件解析成网页可执行文件&#xff0c;配合文件上传漏洞进行GetShell的漏洞! IIS解析漏洞&#xff1a; IIS6.X&#xff1a; 方式一:目录解析 在网站下建立文件夹的名字为.asp/.asa 的文件夹&#xff0c;其目…...

【杂谈】学会让你节省三秒钟——Dev-c++的缺省源

【杂谈】学会让你节省三秒钟——Dev-c的缺省源 1.前言2.缺省源的介绍3.注意 1.前言 你是否在为每次写程序都要自己手打一遍框架而感到苦恼&#xff1f;为什么大佬的Dev-C一新建文件就会自动出现程序框架&#xff1f;看完这篇文章&#xff0c;让你也能成为大佬&#xff0c;不用再…...

推荐一款前端滑动验证码插件(Vue、uniapp)

uniapp版本&#xff1a;滑块拼图验证码&#xff0c;有后端&#xff0c;简单几步即可实现&#xff0c;小程序、h5都可以用 - DCloud 插件市场 Vue版本及cdn版本可以查阅文档&#xff1a; 行为验证 | Poster 文档 示例代码&#xff1a; <template><view id"app&…...

【Git】git stash

目录 基本概念参数详解listshowsavepushpop|applydropclearbranch 参考文章 Git的stash命令是一个非常实用的功能&#xff0c;它允许开发者临时保存工作目录和暂存区的更改&#xff0c;以便能够切换到其他分支或进行其他操作&#xff0c;而不会丢失当前的修改。以下是git stash…...

不得不安利的程序员开发神器,太赞了!!

作为一名程序员&#xff0c;你是否常常为繁琐的后端服务而感到头疼&#xff1f;是否希望有一种工具可以帮你简化开发流程&#xff0c;让你专注于创意和功能开发&#xff1f;今天&#xff0c;我要向大家隆重推荐一款绝佳的开发神器——MemFire Cloud。它专为懒人开发者准备&…...

吴恩达机器学习C1W2Lab06-使用Scikit-Learn进行线性回归

前言 有一个开源的、商业上可用的机器学习工具包&#xff0c;叫做scikit-learn。这个工具包包含了你将在本课程中使用的许多算法的实现。 目标 在本实验室你可以&#xff1a; 利用scikit-learn实现基于正态方程的近似解线性回归 工具 您将使用scikit-learn中的函数以及ma…...

别再手动调参了!用C#和Halcon的HSmartWindow控件,5分钟搞定ROI绘制与参数提取

工业视觉开发革命&#xff1a;用C#封装Halcon ROI的智能实践 在半导体检测、精密零件测量等工业场景中&#xff0c;区域兴趣&#xff08;ROI&#xff09;的精准定义直接影响着算法效果。传统开发模式下&#xff0c;工程师需要反复在Halcon脚本与C#界面代码间切换&#xff0c;手…...

Ubuntu服务器上配置KVM虚拟化环境:从零搭建Windows开发环境

1. 为什么要在Ubuntu服务器上跑Windows&#xff1f; 很多开发者可能都有这样的困惑&#xff1a;明明手头有性能强劲的Ubuntu服务器&#xff0c;但某些开发工具只能在Windows环境下运行。比如Visual Studio、SQL Server Management Studio这些微软系工具&#xff0c;或者某些行业…...

Java面试高频:阿里真实面试题——Redis分布式锁实现(3分钟速通,不会直接挂)

一、真实面试场景&#xff08;代入感拉满&#xff09; 上周&#xff0c;一个候选人来面试阿里P6。 技术面已经过了两轮&#xff0c;表现都不错。 最后一轮&#xff0c;面试官只问了一个问题&#xff1a; “你们项目里用过Redis分布式锁吗&#xff1f;怎么实现的&#xff1f;…...

nlp_structbert_sentence-similarity_chinese-large赋能微信小程序:实现文本查重功能

nlp_structbert_sentence-similarity_chinese-large赋能微信小程序&#xff1a;实现文本查重功能 最近和一位做在线教育的朋友聊天&#xff0c;他提到一个挺头疼的问题&#xff1a;批改学生作文时&#xff0c;经常发现不同学生提交的作业内容高度相似&#xff0c;甚至有大段雷…...

Drone流水线进阶玩法:用.drone.yml实现多阶段构建+钉钉通知(2023最新版)

Drone流水线进阶实战&#xff1a;多阶段构建与智能通知全链路设计 当你的团队从单体架构转向微服务时&#xff0c;CI/CD流水线会突然变得复杂起来。上周我接手的一个电商项目就遇到了典型问题&#xff1a;每次代码提交后需要同时处理Java后端的Maven构建、前端Node.js打包、Doc…...

Phan静态分析工具:10个自动化代码质量检查的终极指南

Phan静态分析工具&#xff1a;10个自动化代码质量检查的终极指南 【免费下载链接】phan Phan is a static analyzer for PHP. Phan prefers to avoid false-positives and attempts to prove incorrectness rather than correctness. 项目地址: https://gitcode.com/gh_mirro…...

告别黑盒:手把手教你用GDB调试`ipmitool`源码,亲眼看到RAW数据如何发送

从GDB断点到硬件交互&#xff1a;动态追踪ipmitool RAW命令的全链路实现 在服务器管理领域&#xff0c;IPMI协议如同一位沉默的守护者&#xff0c;通过BMC&#xff08;基板管理控制器&#xff09;提供着硬件级的监控与控制能力。而ipmitool作为最流行的IPMI命令行工具&#xff…...

动漫IP商业化新路径:AnythingtoRealCharacters2511助力二次元角色真人化营销落地

动漫IP商业化新路径&#xff1a;AnythingtoRealCharacters2511助力二次元角色真人化营销落地 1. 动漫角色真人化的商业价值 动漫IP的商业化一直是内容产业的重要课题。传统的周边商品、联名合作虽然有效&#xff0c;但缺乏突破性创新。随着AI技术的发展&#xff0c;动漫角色真…...

通义千问3-Reranker-0.6B部署教程:模型服务SLA保障(P95延迟<800ms)调优

通义千问3-Reranker-0.6B部署教程&#xff1a;模型服务SLA保障&#xff08;P95延迟<800ms&#xff09;调优 1. 为什么你需要关注这个模型&#xff1f; 如果你正在做搜索系统、智能客服或者文档问答&#xff0c;肯定遇到过这样的问题&#xff1a;用户输入一个问题&#xff…...

Janus-Pro-7B在SolidWorks设计中的应用:工程问题智能答疑

Janus-Pro-7B在SolidWorks设计中的应用&#xff1a;工程问题智能答疑 1. 引言 想象一下这个场景&#xff1a;你正在用SolidWorks赶一个复杂的装配体设计&#xff0c;突然卡在了一个配合关系上&#xff0c;或者对某个特征的生成顺序拿不准。这时候&#xff0c;你是去翻几百页的…...